Skip to content

Commit dd2db6a

Browse files
committed
Producer- write monotonically increasing delta chain version counter
1 parent 85f7038 commit dd2db6a

File tree

4 files changed

+26
-0
lines changed

4 files changed

+26
-0
lines changed

hollow/src/main/java/com/netflix/hollow/api/producer/AbstractHollowProducer.java

+15
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package com.netflix.hollow.api.producer;
1818

1919
import static com.netflix.hollow.api.producer.ProducerListenerSupport.ProducerListeners;
20+
import static com.netflix.hollow.core.HollowStateEngine.HEADER_TAG_DELTA_CHAIN_VERSION_COUNTER;
2021
import static com.netflix.hollow.core.HollowStateEngine.HEADER_TAG_TYPE_RESHARDING_INVOKED;
2122
import static java.lang.System.currentTimeMillis;
2223
import static java.util.stream.Collectors.toList;
@@ -524,6 +525,20 @@ private void updateHeaderTags(HollowWriteStateEngine writeEngine, long toVersion
524525
}
525526
writeEngine.addHeaderTag(HollowStateEngine.HEADER_TAG_PRODUCER_TO_VERSION, String.valueOf(toVersion));
526527
writeEngine.getHeaderTags().remove(HEADER_TAG_TYPE_RESHARDING_INVOKED);
528+
529+
long prevDeltaChainVersionCounter = 0l;
530+
if (readStates.hasCurrent()) {
531+
String str = readStates.current().getStateEngine().getHeaderTag(HEADER_TAG_DELTA_CHAIN_VERSION_COUNTER);
532+
if (str != null) {
533+
try {
534+
prevDeltaChainVersionCounter = Long.valueOf(str);
535+
} catch (NumberFormatException e) {
536+
prevDeltaChainVersionCounter = 0;
537+
}
538+
}
539+
}
540+
long deltaChainVersionCounter = prevDeltaChainVersionCounter + 1;
541+
writeEngine.addHeaderTag(HEADER_TAG_DELTA_CHAIN_VERSION_COUNTER, String.valueOf(deltaChainVersionCounter));
527542
}
528543

529544
void populate(

hollow/src/main/java/com/netflix/hollow/core/HollowStateEngine.java

+5
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,11 @@ public interface HollowStateEngine extends HollowDataset {
7575
*/
7676
String HEADER_TAG_PRODUCER_TO_VERSION = "hollow.blob.to.version";
7777

78+
/**
79+
* A header tag indicating monotonically increasing version in the same delta chain
80+
*/
81+
String HEADER_TAG_DELTA_CHAIN_VERSION_COUNTER = "hollow.delta.chain.version.counter";
82+
7883
@Override
7984
List<HollowSchema> getSchemas();
8085

hollow/src/test/java/com/netflix/hollow/core/util/HollowWriteStateCreatorTest.java

+3
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
*/
1717
package com.netflix.hollow.core.util;
1818

19+
import static com.netflix.hollow.core.HollowStateEngine.HEADER_TAG_DELTA_CHAIN_VERSION_COUNTER;
1920
import static com.netflix.hollow.core.HollowStateEngine.HEADER_TAG_METRIC_CYCLE_START;
2021
import static com.netflix.hollow.core.HollowStateEngine.HEADER_TAG_PRODUCER_TO_VERSION;
2122
import static org.junit.Assert.assertEquals;
@@ -46,6 +47,7 @@ public void recreatesUsingReadEngine() throws IOException {
4647
}
4748
writeEngine.addHeaderTag("CopyTag", "copied");
4849
writeEngine.addHeaderTag(HEADER_TAG_METRIC_CYCLE_START, String.valueOf(System.currentTimeMillis()));
50+
writeEngine.addHeaderTag(HEADER_TAG_DELTA_CHAIN_VERSION_COUNTER, "1");
4951
String toVersion = String.valueOf(System.currentTimeMillis());
5052
writeEngine.addHeaderTag(HEADER_TAG_PRODUCER_TO_VERSION, toVersion);
5153

@@ -55,6 +57,7 @@ public void recreatesUsingReadEngine() throws IOException {
5557
HollowWriteStateEngine recreatedWriteEngine = HollowWriteStateCreator.recreateAndPopulateUsingReadEngine(readEngine);
5658
assertEquals(cycleStartTime, recreatedWriteEngine.getPreviousHeaderTags().get(HEADER_TAG_METRIC_CYCLE_START));
5759
assertEquals(readEngineToVersion, recreatedWriteEngine.getPreviousHeaderTags().get(HEADER_TAG_PRODUCER_TO_VERSION));
60+
assertEquals("1", recreatedWriteEngine.getPreviousHeaderTags().get(HEADER_TAG_DELTA_CHAIN_VERSION_COUNTER));
5861
assertEquals(8, recreatedWriteEngine.getTypeState("Integer").getNumShards());
5962

6063
HollowReadStateEngine recreatedReadEngine = StateEngineRoundTripper.roundTripSnapshot(recreatedWriteEngine);

hollow/src/test/java/com/netflix/hollow/core/write/HollowWriteStateEngineTest.java

+3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.netflix.hollow.core.write;
22

3+
import static com.netflix.hollow.core.HollowStateEngine.HEADER_TAG_DELTA_CHAIN_VERSION_COUNTER;
34
import static com.netflix.hollow.core.HollowStateEngine.HEADER_TAG_PRODUCER_TO_VERSION;
45
import static com.netflix.hollow.core.HollowStateEngine.HEADER_TAG_TYPE_RESHARDING_INVOKED;
56
import static org.junit.Assert.assertEquals;
@@ -61,10 +62,12 @@ public void testHeaderTagsOnDeltaAndReverseDelta() {
6162
consumer.triggerRefreshTo(version3); // delta transition
6263
assertEquals("3", consumer.getStateEngine().getHeaderTag(TEST_TAG));
6364
assertEquals(String.valueOf(version3), consumer.getStateEngine().getHeaderTag(HEADER_TAG_PRODUCER_TO_VERSION));
65+
assertEquals("3", consumer.getStateEngine().getHeaderTag(HEADER_TAG_DELTA_CHAIN_VERSION_COUNTER));
6466

6567
consumer.triggerRefreshTo(version2); // reverse delta transition
6668
assertEquals("2", consumer.getStateEngine().getHeaderTag(TEST_TAG));
6769
assertEquals(String.valueOf(version2), consumer.getStateEngine().getHeaderTag(HEADER_TAG_PRODUCER_TO_VERSION));
70+
assertEquals("2", consumer.getStateEngine().getHeaderTag(HEADER_TAG_DELTA_CHAIN_VERSION_COUNTER));
6871

6972
}
7073

0 commit comments

Comments
 (0)