@Override
public Repo<Master> call(long tid, Master m) throws Exception {
// TODO move this code to isReady() and drop while loop?
// Make sure nobody is still using logs hosted on that node
Listener listener = m.getEventCoordinator().getListener();
while (m.stillMaster()) {
boolean flushed = false;
ZooTabletStateStore zooTabletStateStore = null;
try {
zooTabletStateStore = new ZooTabletStateStore();
} catch (DistributedStoreException e) {
log.warn("Unable to open ZooTabletStateStore, will retry", e);
}
MetaDataStateStore theRest = null;
if (m.onlineTabletServers().size() != 0)
theRest = new MetaDataStateStore();
for (TabletStateStore store : new TabletStateStore[] {zooTabletStateStore, theRest}) {
if (store != null) {
for (TabletLocationState tabletState : store) {
for (Collection<String> logSet : tabletState.walogs) {
for (String logEntry : logSet) {
if (logger.equals(logEntry.split("/")[0])) {
TServerConnection tserver = m.getConnection(tabletState.current);
if (tserver != null) {
log.info("Requesting " + tabletState.current + " flush tablet " + tabletState.extent + " because it has a log entry " + logEntry);
tserver.flushTablet(m.getMasterLock(), tabletState.extent);
}
flushed = true;
}
}
}
}
}
}
if (zooTabletStateStore != null && !flushed)
break;
listener.waitForEvents(1000);
}
return new StopLogger(logger);
}