@Override public final void deactivate() { isActive = false; if (ioThread != null) { // thread to exit sleep or blocking IO ioThread.interrupt(); } }
@Override public final void activate(OperatorContext ctx) { isActive = true; if (this instanceof Runnable) { ioThread = new Thread((Runnable) this, "io-" + this.getName()); ioThread.start(); } }
@Override public void emitTuples() { try { Thread.sleep(500); } catch (InterruptedException ex) { logger.debug("interrupted!", ex); } output.emit(++count); }
@Test public void testApplication() throws Exception { LocalMode lma = LocalMode.newInstance(); Configuration conf = new Configuration(false); conf.set("dt.operator.Unique.prop.tableName", "Test_Lookup_Cache"); conf.set("dt.operator.Unique.prop.store.dbUrl", "jdbc:hsqldb:mem:test;sql.syntax_mys=true"); conf.set("dt.operator.Unique.prop.store.dbDriver", "org.hsqldb.jdbcDriver"); lma.prepareDAG(new Application(), conf); lma.cloneDAG(); LocalMode.Controller lc = lma.getController(); lc.setHeartbeatMonitoringEnabled(false); lc.runAsync(); long now = System.currentTimeMillis(); while (System.currentTimeMillis() - now < 15000) { Thread.sleep(1000); } lc.shutdown(); }
@Test public void testWindowGen() throws Exception { final AtomicLong currentWindow = new AtomicLong(); final AtomicInteger beginWindowCount = new AtomicInteger(); final AtomicInteger endWindowCount = new AtomicInteger(); final AtomicLong windowXor = new AtomicLong(); Sink<Object> s = new Sink<Object>() { @Override public int getCount(boolean reset) { return 0; } @Override public void put(Object payload) { logger.debug("unexpected payload {}", payload); } }; ScheduledThreadPoolExecutor stpe = new ScheduledThreadPoolExecutor(1, "WindowGenerator"); int windowWidth = 200; long firstWindowMillis = stpe.getCurrentTimeMillis(); firstWindowMillis -= firstWindowMillis % 1000L; WindowGenerator wg = new WindowGenerator( new ScheduledThreadPoolExecutor(1, "WindowGenerator"), WindowGenerator.MAX_WINDOW_ID + 1024); wg.setResetWindow(firstWindowMillis); wg.setFirstWindow(firstWindowMillis); wg.setWindowWidth(windowWidth); SweepableReservoir reservoir = wg.acquireReservoir("GeneratorTester", windowWidth); reservoir.setSink(s); wg.activate(null); Thread.sleep(200); wg.deactivate(); reservoir.sweep(); /* just transfer over all the control tuples */ Tuple t; while ((t = reservoir.sweep()) != null) { reservoir.remove(); long windowId = t.getWindowId(); switch (t.getType()) { case BEGIN_WINDOW: currentWindow.set(windowId); beginWindowCount.incrementAndGet(); windowXor.set(windowXor.get() ^ windowId); break; case END_WINDOW: endWindowCount.incrementAndGet(); windowXor.set(windowXor.get() ^ windowId); break; case RESET_WINDOW: break; default: currentWindow.set(0); break; } } long lastWindowMillis = System.currentTimeMillis(); Assert.assertEquals("only last window open", currentWindow.get(), windowXor.get()); long expectedCnt = (lastWindowMillis - firstWindowMillis) / windowWidth; Assert.assertTrue("Minimum begin window count", expectedCnt + 1 <= beginWindowCount.get()); Assert.assertEquals("end window count", beginWindowCount.get() - 1, endWindowCount.get()); }