/** * Add batch of segment changes update. */ public synchronized void addChangeRequests(List<T> requests) { for (T request : requests) { changes.add(new Holder<>(request, getLastCounter().inc())); } singleThreadedExecutor.execute(resolveWaitingFuturesRunnable); }
/** * Returns Future that lists the segment load/drop requests since given counter. */ public ListenableFuture<ChangeRequestsSnapshot<DataSegmentChangeRequest>> getSegmentChangesSince(ChangeRequestHistory.Counter counter) { if (counter.getCounter() < 0) { synchronized (lock) { Iterable<DataSegmentChangeRequest> segments = Iterables.transform( segmentLookup.keySet(), new Function<DataSegment, DataSegmentChangeRequest>() { @Nullable @Override public SegmentChangeRequestLoad apply(DataSegment input) { return new SegmentChangeRequestLoad(input); } } ); SettableFuture<ChangeRequestsSnapshot<DataSegmentChangeRequest>> future = SettableFuture.create(); future.set(ChangeRequestsSnapshot.success(changes.getLastCounter(), Lists.newArrayList(segments))); return future; } } else { return changes.getRequestsSince(counter); } }
future.set(ChangeRequestsSnapshot.success(changeHistory.getLastCounter(), Lists.newArrayList(items))); return future;
Counter lastCounter = getLastCounter();
@Test public void testTruncatedHistory() throws Exception { ChangeRequestHistory<DataSegmentChangeRequest> history = new ChangeRequestHistory(2); history.addChangeRequest(new SegmentChangeRequestNoop()); ChangeRequestHistory.Counter one = history.getLastCounter(); history.addChangeRequest(new SegmentChangeRequestNoop()); ChangeRequestHistory.Counter two = history.getLastCounter(); history.addChangeRequest(new SegmentChangeRequestNoop()); ChangeRequestHistory.Counter three = history.getLastCounter(); history.addChangeRequest(new SegmentChangeRequestNoop()); ChangeRequestHistory.Counter four = history.getLastCounter(); Assert.assertTrue(history.getRequestsSince(ChangeRequestHistory.Counter.ZERO).get().isResetCounter()); Assert.assertTrue(history.getRequestsSince(one).get().isResetCounter()); Assert.assertTrue(history.getRequestsSince(two).get().isResetCounter()); ChangeRequestsSnapshot<DataSegmentChangeRequest> snapshot = history.getRequestsSince(three).get(); Assert.assertEquals(1, snapshot.getRequests().size()); Assert.assertEquals(4, snapshot.getCounter().getCounter()); }
private synchronized ChangeRequestsSnapshot<T> getRequestsSinceWithoutWait(final Counter counter) Counter lastCounter = getLastCounter();
@Test public void testCounterHashMismatch() throws Exception { ChangeRequestHistory<DataSegmentChangeRequest> history = new ChangeRequestHistory(3); Assert.assertTrue(history.getRequestsSince(new ChangeRequestHistory.Counter(0, 1234)).get().isResetCounter()); history.addChangeRequest(new SegmentChangeRequestNoop()); ChangeRequestHistory.Counter one = history.getLastCounter(); history.addChangeRequest(new SegmentChangeRequestNoop()); ChangeRequestHistory.Counter two = history.getLastCounter(); Assert.assertTrue(history.getRequestsSince(new ChangeRequestHistory.Counter(0, 1234)).get().isResetCounter()); ChangeRequestsSnapshot<DataSegmentChangeRequest> snapshot = history.getRequestsSince(one).get(); Assert.assertEquals(1, snapshot.getRequests().size()); Assert.assertEquals(2, snapshot.getCounter().getCounter()); Assert.assertTrue(history.getRequestsSince(new ChangeRequestHistory.Counter(1, 1234)).get().isResetCounter()); history.addChangeRequest(new SegmentChangeRequestNoop()); ChangeRequestHistory.Counter three = history.getLastCounter(); history.addChangeRequest(new SegmentChangeRequestNoop()); ChangeRequestHistory.Counter four = history.getLastCounter(); snapshot = history.getRequestsSince(two).get(); Assert.assertEquals(2, snapshot.getRequests().size()); Assert.assertEquals(4, snapshot.getCounter().getCounter()); Assert.assertTrue(history.getRequestsSince(new ChangeRequestHistory.Counter(2, 1234)).get().isResetCounter()); }
@Test public void testSimple() throws Exception { ChangeRequestHistory<DataSegmentChangeRequest> history = new ChangeRequestHistory(); Assert.assertEquals(0, history.getLastCounter().getCounter()); history.addChangeRequest(new SegmentChangeRequestNoop()); Assert.assertEquals(1, history.getLastCounter().getCounter()); ChangeRequestsSnapshot<DataSegmentChangeRequest> snapshot = history.getRequestsSince(ChangeRequestHistory.Counter.ZERO).get(); Assert.assertEquals(1, snapshot.getRequests().size()); Assert.assertEquals(1, snapshot.getCounter().getCounter()); history.addChangeRequest(new SegmentChangeRequestNoop()); Assert.assertEquals(2, history.getLastCounter().getCounter()); snapshot = history.getRequestsSince(snapshot.getCounter()).get(); Assert.assertEquals(1, snapshot.getRequests().size()); Assert.assertEquals(2, snapshot.getCounter().getCounter()); snapshot = history.getRequestsSince(ChangeRequestHistory.Counter.ZERO).get(); Assert.assertEquals(2, snapshot.getRequests().size()); Assert.assertEquals(2, snapshot.getCounter().getCounter()); }
/** * Add batch of segment changes update. */ public synchronized void addChangeRequests(List<T> requests) { for (T request : requests) { changes.add(new Holder(request, getLastCounter().inc())); } singleThreadedExecutor.execute(resolveWaitingFuturesRunnable); }
/** * Returns Future that lists the segment load/drop requests since given counter. */ public ListenableFuture<ChangeRequestsSnapshot<DataSegmentChangeRequest>> getSegmentChangesSince(ChangeRequestHistory.Counter counter) { if (counter.getCounter() < 0) { synchronized (lock) { Iterable<DataSegmentChangeRequest> segments = Iterables.transform( segmentLookup.keySet(), new Function<DataSegment, DataSegmentChangeRequest>() { @Nullable @Override public SegmentChangeRequestLoad apply(DataSegment input) { return new SegmentChangeRequestLoad(input); } } ); SettableFuture<ChangeRequestsSnapshot<DataSegmentChangeRequest>> future = SettableFuture.create(); future.set(ChangeRequestsSnapshot.success(changes.getLastCounter(), Lists.newArrayList(segments))); return future; } } else { return changes.getRequestsSince(counter); } }
future.set(ChangeRequestsSnapshot.success(changeHistory.getLastCounter(), Lists.newArrayList(items))); return future;
Counter lastCounter = getLastCounter();
private synchronized ChangeRequestsSnapshot<T> getRequestsSinceWithoutWait(final Counter counter) Counter lastCounter = getLastCounter();