package edu.brown.hstore; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import org.junit.Before; import org.junit.Test; import org.voltdb.VoltSystemProcedure; import org.voltdb.VoltTable; import org.voltdb.catalog.Site; import org.voltdb.catalog.Table; import org.voltdb.client.Client; import org.voltdb.sysprocs.Sleep; import org.voltdb.utils.CatalogUtil; import org.voltdb.utils.VoltTableUtil; import edu.brown.BaseTestCase; import edu.brown.HStoreSiteTestUtil.LatchableProcedureCallback; import edu.brown.benchmark.tm1.TM1Constants; import edu.brown.hstore.conf.HStoreConf; import edu.brown.hstore.util.TransactionCounter; import edu.brown.utils.CollectionUtil; import edu.brown.utils.EventObservable; import edu.brown.utils.EventObserver; import edu.brown.utils.ProjectType; import edu.brown.utils.ThreadUtil; public class TestClientInterface extends BaseTestCase { private static final int NUM_TXNS = 1000; private static final int NUM_PARTITIONS = 2; private static final int NUM_ROWS = 10000; private static final int WAIT_TIME = 2500; private HStoreSite hstore_site; private HStoreConf hstore_conf; private ClientInterface clientInterface; private Client client; @Before public void setUp() throws Exception { super.setUp(ProjectType.TM1); initializeCatalog(1, 1, NUM_PARTITIONS); for (TransactionCounter tc : TransactionCounter.values()) { tc.clear(); } // FOR Site catalog_site = CollectionUtil.first(catalogContext.sites); this.hstore_conf = HStoreConf.singleton(); this.hstore_conf.site.profiling = true; this.hstore_conf.site.pool_profiling = true; this.hstore_conf.site.network_incoming_limit_txns = 1; this.hstore_site = createHStoreSite(catalog_site, hstore_conf); this.clientInterface = this.hstore_site.getClientInterface(); this.client = createClient(); this.client.configureBlocking(true); } @Override protected void tearDown() throws Exception { if (this.client != null) this.client.close(); if (this.hstore_site != null) this.hstore_site.shutdown(); } /** * testBackPressure */ @Test public void testBackPressure() throws Exception { Table catalog_tbl = this.getTable(TM1Constants.TABLENAME_CALL_FORWARDING); VoltTable data[] = { CatalogUtil.getVoltTable(catalog_tbl) }; for (int i = 0; i < NUM_ROWS; i++) { data[0].addRow(VoltTableUtil.getRandomRow(catalog_tbl)); } // FOR final AtomicBoolean onBackPressure = new AtomicBoolean(false); EventObserver<HStoreSite> onBackPressureObserver = new EventObserver<HStoreSite>() { @Override public void update(EventObservable<HStoreSite> o, HStoreSite ts) { System.err.println("On back pressure"); onBackPressure.set(true); } }; this.clientInterface.getOnBackPressureObservable().addObserver(onBackPressureObserver); final AtomicBoolean offBackPressure = new AtomicBoolean(false); EventObserver<HStoreSite> offBackPressureObserver = new EventObserver<HStoreSite>() { @Override public void update(EventObservable<HStoreSite> o, HStoreSite ts) { System.err.println("Off back pressure"); offBackPressure.set(true); } }; this.clientInterface.getOffBackPressureObservable().addObserver(offBackPressureObserver); // Submit a bunch of txns that will block and check to make sure that // can go on and off on the backpressure status properly LatchableProcedureCallback callback = new LatchableProcedureCallback(1); String procName = VoltSystemProcedure.procCallName(Sleep.class); Object params[] = { WAIT_TIME, data }; client.callProcedure(callback, procName, params); ThreadUtil.sleep(WAIT_TIME); LatchableProcedureCallback floodCallback = new LatchableProcedureCallback(NUM_TXNS); for (int i = 0; i < NUM_TXNS; i++) { client.callProcedure(floodCallback, procName, new Object[]{0, data}); } // FOR boolean result = callback.latch.await(WAIT_TIME*3, TimeUnit.MILLISECONDS); assertTrue(result); assertTrue("onBackPressure", onBackPressure.get()); // client.backpressureBarrier(); // ThreadUtil.sleep(WAIT_TIME); // result = floodCallback.latch.await(WAIT_TIME*5, TimeUnit.MILLISECONDS); // assertTrue("floodCallback->"+floodCallback.latch, result); // HStoreSiteTestUtil.checkObjectPools(hstore_site); } }