public static <T> ChangeRequestsSnapshot<T> fail(String resetCause) { return new ChangeRequestsSnapshot<>(true, resetCause, null, null); }
return ChangeRequestsSnapshot.fail( StringUtils.format( "counter[%s] >= last counter[%s]", return ChangeRequestsSnapshot.fail( StringUtils.format( "can't serve request, not enough history is kept. given counter [%s] and current last counter [%s]", return ChangeRequestsSnapshot.fail( StringUtils.format( "counter[%s] failed to match with [%s]", return ChangeRequestsSnapshot.success(changes.get(changes.size() - 1).counter, result);
@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()); }
if (changes.isResetCounter()) { log.info("[%s] requested resetCounter for reason [%s].", logIdentity, changes.getResetCause()); counter = null; return; listener.fullSync(changes.getRequests()); } else { listener.deltaSync(changes.getRequests()); counter = changes.getCounter();
new ChangeRequestHistory.Counter(-1, -1) ).get(); Assert.assertEquals(testSegments.size(), snapshot.getRequests().size()); Assert.assertEquals(testSegments.size(), snapshot.getCounter().getCounter()); snapshot.getCounter() ).get(); Assert.assertEquals(testSegments.size(), snapshot.getRequests().size()); Assert.assertEquals(2 * testSegments.size(), snapshot.getCounter().getCounter()); 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); } }
ChangeRequestsSnapshot<T> reset = ChangeRequestsSnapshot.fail( StringUtils.format("counter[%s] failed to match with [%s]", counter, lastCounter) );
@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()); }
if (changes.isResetCounter()) { log.info( "[%s] requested resetCounter for reason [%s].", logIdentity, changes.getResetCause() ); counter = null; listener.fullSync(changes.getRequests()); } else { listener.deltaSync(changes.getRequests()); counter = changes.getCounter();
@Test public void testNonImmediateFuture() throws Exception { final ChangeRequestHistory history = new ChangeRequestHistory(); Future<ChangeRequestsSnapshot> future = history.getRequestsSince( ChangeRequestHistory.Counter.ZERO ); Assert.assertFalse(future.isDone()); history.addChangeRequest(new SegmentChangeRequestNoop()); ChangeRequestsSnapshot snapshot = future.get(1, TimeUnit.MINUTES); Assert.assertEquals(1, snapshot.getCounter().getCounter()); Assert.assertEquals(1, snapshot.getRequests().size()); }
future.set(ChangeRequestsSnapshot.success(changeHistory.getLastCounter(), Lists.newArrayList(items))); return future;
future.set(ChangeRequestsSnapshot.fail( StringUtils.format( "counter[%s] failed to match with [%s]",
Assert.assertFalse(baseHistory.isResetCounter()); Assert.assertEquals(3, baseHistory.getRequests().size()); Assert.assertFalse(((WorkerHistoryItem.Metadata) baseHistory.getRequests().get(0)).isDisabled()); WorkerHistoryItem.TaskUpdate baseUpdate1 = (WorkerHistoryItem.TaskUpdate) baseHistory.getRequests().get(1); WorkerHistoryItem.TaskUpdate baseUpdate2 = (WorkerHistoryItem.TaskUpdate) baseHistory.getRequests().get(2); ChangeRequestsSnapshot<WorkerHistoryItem> changes = workerTaskManager.getChangesSince(baseHistory.getCounter()) .get(); Assert.assertFalse(changes.isResetCounter()); Assert.assertEquals(4, changes.getRequests().size()); WorkerHistoryItem.TaskUpdate update1 = (WorkerHistoryItem.TaskUpdate) changes.getRequests().get(0); Assert.assertEquals(task3.getId(), update1.getTaskAnnouncement().getTaskStatus().getId()); Assert.assertTrue(update1.getTaskAnnouncement().getTaskStatus().isRunnable()); Assert.assertNull(update1.getTaskAnnouncement().getTaskLocation().getHost()); WorkerHistoryItem.TaskUpdate update2 = (WorkerHistoryItem.TaskUpdate) changes.getRequests().get(1); Assert.assertEquals(task3.getId(), update2.getTaskAnnouncement().getTaskStatus().getId()); Assert.assertTrue(update2.getTaskAnnouncement().getTaskStatus().isRunnable()); Assert.assertNull(update2.getTaskAnnouncement().getTaskLocation().getHost()); WorkerHistoryItem.TaskUpdate update3 = (WorkerHistoryItem.TaskUpdate) changes.getRequests().get(2); Assert.assertEquals(task3.getId(), update3.getTaskAnnouncement().getTaskStatus().getId()); Assert.assertTrue(update3.getTaskAnnouncement().getTaskStatus().isRunnable()); Assert.assertNotNull(update3.getTaskAnnouncement().getTaskLocation().getHost()); WorkerHistoryItem.TaskUpdate update4 = (WorkerHistoryItem.TaskUpdate) changes.getRequests().get(3); Assert.assertEquals(task3.getId(), update4.getTaskAnnouncement().getTaskStatus().getId());
new ChangeRequestHistory.Counter(-1, -1) ).get(); Assert.assertEquals(2, snapshot.getRequests().size()); Assert.assertEquals(2, snapshot.getCounter().getCounter()); snapshot.getCounter() ).get(); Assert.assertEquals(2, snapshot.getRequests().size()); Assert.assertEquals(4, snapshot.getCounter().getCounter()); Assert.assertEquals(0, snapshot.getRequests().size()); Assert.assertEquals(4, snapshot.getCounter().getCounter());
public static <T> ChangeRequestsSnapshot<T> success(ChangeRequestHistory.Counter counter, List<T> requests) { return new ChangeRequestsSnapshot<>(false, null, counter, requests); }
return ChangeRequestsSnapshot.fail( StringUtils.format( "counter[%s] >= last counter[%s]", return ChangeRequestsSnapshot.fail( StringUtils.format( "can't serve request, not enough history is kept. given counter [%s] and current last counter [%s]", return ChangeRequestsSnapshot.fail( StringUtils.format( "counter[%s] failed to match with [%s]", return ChangeRequestsSnapshot.success(changes.get(changes.size() - 1).counter, result);
/** * 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 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()); }
new ByteArrayInputStream( jsonMapper.writerWithType(typeRef).writeValueAsBytes( new ChangeRequestsSnapshot( false, null, new ByteArrayInputStream( jsonMapper.writerWithType(typeRef).writeValueAsBytes( new ChangeRequestsSnapshot( false, null, new ByteArrayInputStream( jsonMapper.writerWithType(typeRef).writeValueAsBytes( new ChangeRequestsSnapshot( true, "reset the counter", new ByteArrayInputStream( jsonMapper.writerWithType(typeRef).writeValueAsBytes( new ChangeRequestsSnapshot( false, null, new ByteArrayInputStream( jsonMapper.writerWithType(typeRef).writeValueAsBytes( new ChangeRequestsSnapshot( false, null,
future.set(ChangeRequestsSnapshot.success(changeHistory.getLastCounter(), Lists.newArrayList(items))); return future;