package edu.brown.hstore.callbacks; import java.util.HashSet; import java.util.Set; import java.util.concurrent.CountDownLatch; import org.apache.log4j.Logger; import com.google.protobuf.RpcCallback; import edu.brown.hstore.HStoreCoordinator; import edu.brown.hstore.HStoreThreadManager; import edu.brown.hstore.Hstoreservice.ShutdownPrepareResponse; import edu.brown.logging.LoggerUtil; import edu.brown.logging.LoggerUtil.LoggerBoolean; public class ShutdownPrepareCallback implements RpcCallback<ShutdownPrepareResponse> { private static final Logger LOG = Logger.getLogger(HStoreCoordinator.class); private static final LoggerBoolean debug = new LoggerBoolean(); private static final LoggerBoolean trace = new LoggerBoolean(); static { LoggerUtil.attachObserver(LOG, debug, trace); } private final Set<Integer> siteids = new HashSet<Integer>(); private final int num_sites; private final CountDownLatch latch; public ShutdownPrepareCallback(int num_sites, CountDownLatch latch) { this.num_sites = num_sites; this.latch = latch; } @Override public void run(ShutdownPrepareResponse parameter) { int siteId = parameter.getSenderSite(); assert(this.siteids.contains(siteId) == false) : "Duplicate response from remote HStoreSite " + HStoreThreadManager.formatSiteName(siteId); this.siteids.add(siteId); if (trace.val) LOG.trace("Received " + this.siteids.size() + "/" + num_sites + " shutdown acknowledgements"); this.latch.countDown(); } };