/**
* Licensed to WibiData, Inc. under one or more contributor license
* agreements. See the NOTICE file distributed with this work for
* additional information regarding copyright ownership. WibiData, Inc.
* licenses this file to you under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
package org.kiji.maven.plugins.hbase;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.maven.plugin.logging.Log;
/**
* A singleton instance of a mini HBase cluster.
*/
public enum MiniHBaseClusterSingleton {
/** The singleton instance. */
INSTANCE;
/** The thread that runs the mini HBase cluster. */
private MiniHBaseClusterThread mThread;
/** The HBase cluster being run. */
private MiniHBaseCluster mCluster;
/**
* Starts the HBase cluster and blocks until it is ready.
*
* @param log The maven log.
* @param alsoStartMapReduce Whether to also start a mini MapReduce cluster.
* @param conf Hadoop configuration for the cluster.
* @throws IOException If there is an error.
*/
public void startAndWaitUntilReady(Log log, boolean alsoStartMapReduce, Configuration conf)
throws IOException {
mCluster = new MiniHBaseCluster(log, alsoStartMapReduce, conf);
mThread = new MiniHBaseClusterThread(log, mCluster);
log.info("Starting new thread...");
mThread.start();
// Wait for the cluster to be ready.
log.info("Waiting for cluster to be ready...");
while (!mThread.isClusterReady()) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
log.info("Still waiting...");
}
}
log.info("Finished waiting for HBase cluster thread.");
}
/**
* Provides access to the cluster configuration after it has started.
*
* @return The configuration.
*/
public Configuration getClusterConfiguration() {
if (null == mCluster) {
throw new IllegalStateException("The cluster has not started yet.");
}
return mCluster.getConfiguration();
}
/**
* Stops the HBase cluster and blocks until is has been shutdown completely.
*
* @param log The maven log.
*/
public void stop(Log log) {
if (null == mCluster) {
log.error("Attempted to stop a cluster, but no cluster was ever started in this process.");
return;
}
log.info("Stopping the HBase cluster thread...");
mThread.stopClusterGracefully();
while (mThread.isAlive()) {
try {
mThread.join();
} catch (InterruptedException e) {
log.debug("HBase cluster thread interrupted.");
}
}
log.info("HBase cluster thread stopped.");
}
}