package org.apache.fullmatix.mysql;
import org.apache.helix.HelixManager;
import org.apache.helix.NotificationContext;
import org.apache.helix.model.ConfigScope;
import org.apache.helix.model.HelixConfigScope;
import org.apache.helix.model.HelixConfigScope.ConfigScopeProperty;
import org.apache.helix.model.InstanceConfig;
import org.apache.helix.model.Message;
import org.apache.helix.model.builder.HelixConfigScopeBuilder;
import org.apache.helix.participant.statemachine.StateModel;
import org.apache.helix.participant.statemachine.StateModelInfo;
import org.apache.helix.participant.statemachine.Transition;
import org.apache.log4j.Logger;
@StateModelInfo(initialState = "OFFLINE", states = {
"OFFLINE", "ONLINE"
})
public class TableTransitionHandler extends StateModel {
private static final Logger LOG = Logger.getLogger(TableTransitionHandler.class);
private HelixManager _manager;
private MySQLAdmin _mysqlAdmin;
private String _tableDDL;
private String _databasePartitionName;
private String _tableName;
public TableTransitionHandler(Context context, String databaseName, String databasePartitionName, String tableName) {
_databasePartitionName = databasePartitionName;
_tableName = tableName;
_manager = context.getHelixManager();
_mysqlAdmin = context.getMysqlAdmin();
HelixConfigScope scope =
new HelixConfigScopeBuilder(ConfigScopeProperty.RESOURCE).forCluster(
_manager.getClusterName()).forResource(databaseName + "." + tableName).build();
_tableDDL = _manager.getConfigAccessor().get(scope, "table_spec");
}
@Transition(from = "OFFLINE", to = "ONLINE")
public void onBecomeOnlineFromOffline(Message message, NotificationContext context) {
LOG.info(message.getTgtName() + " transitioning from " + message.getFromState() + " to "
+ message.getToState() + " for " + _databasePartitionName + "." + _tableName);
LOG.info("Creating table: " + _tableName + " in database: "+ _databasePartitionName + " using table_spec:" +_tableDDL);
_mysqlAdmin.createTable(_databasePartitionName, _tableName, _tableDDL);
LOG.info(message.getTgtName() + " transitioned from " + message.getFromState() + " to "
+ message.getToState() + " for " + _databasePartitionName + "." + _tableName);
}
@Transition(from = "ONLINE", to = "OFFLINE")
public void onBecomeOfflineFromOnline(Message message, NotificationContext context) {
LOG.info(_manager.getInstanceName() + " transitioning from " + message.getFromState() + " to "
+ message.getToState() + " for " +_databasePartitionName + "." + _tableName);
LOG.info("Will no longer serve this table: " + _databasePartitionName + "." + _tableName);
LOG.info(_manager.getInstanceName() + " transitioned from " + message.getFromState() + " to "
+ message.getToState() + " for " + _databasePartitionName + "." + _tableName);
}
}