new ChangeRequestHistory.Counter( counter, hash
if (counter.getCounter() < 0) { synchronized (lock) {
/** * 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); }
"%s?counter=%s&hash=%s&timeout=%s", baseRequestPath, counter.getCounter(), counter.getHash(), serverTimeoutMS );
new ChangeRequestHistory.Counter( counter, hash
new ChangeRequestHistory.Counter( counter, hash
if (!counterToMatch.matches(counter)) { return ChangeRequestsSnapshot.fail( StringUtils.format(
if (counter.getCounter() < 0) { synchronized (lock) {
if (!counter.matches(lastCounter)) { future.set(ChangeRequestsSnapshot.fail( StringUtils.format(
/** * 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); } }
public Counter inc() { return new Counter(counter + 1); }
/** * 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); }
new ChangeRequestHistory.Counter( counter, hash
.getChangesSince(new ChangeRequestHistory.Counter(-1, 0)) .get();
if (!counter.matches(lastCounter)) { ChangeRequestsSnapshot<T> reset = ChangeRequestsSnapshot.fail( StringUtils.format("counter[%s] failed to match with [%s]", counter, lastCounter)
new ChangeRequestHistory.Counter(-1, -1) ).get(); Assert.assertEquals(2, snapshot.getRequests().size()); Assert.assertEquals(2, snapshot.getCounter().getCounter()); ).get(); Assert.assertEquals(2, snapshot.getRequests().size()); Assert.assertEquals(4, snapshot.getCounter().getCounter()); new ChangeRequestHistory.Counter(-1, -1) ).get(); Assert.assertEquals(0, snapshot.getRequests().size()); Assert.assertEquals(4, snapshot.getCounter().getCounter());
if (!counterToMatch.matches(counter)) { return ChangeRequestsSnapshot.fail( StringUtils.format(
new ChangeRequestHistory.Counter(-1, -1) ).get(); Assert.assertEquals(testSegments.size(), snapshot.getRequests().size()); Assert.assertEquals(testSegments.size(), snapshot.getCounter().getCounter()); ).get(); Assert.assertEquals(testSegments.size(), snapshot.getRequests().size()); Assert.assertEquals(2 * testSegments.size(), snapshot.getCounter().getCounter()); new ChangeRequestHistory.Counter(-1, -1) ).get(); Assert.assertEquals(0, snapshot.getRequests().size()); Assert.assertEquals(2 * testSegments.size(), snapshot.getCounter().getCounter());
/** * 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); } }
@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()); }