@Override public void initPreviousRunState(@NonNull final IMetadataManager<StringValue> metadataManager) { final String topicName = this.conf.getTopicName(); final Map<Integer, Long> metadata = new HashMap<>(); final String topicSpecificName = getTopicSpecificMetadataKey(topicName); final List<String> toDelete = new LinkedList<>(); metadataManager.getAllKeys().forEach(key -> { if (key.startsWith(topicSpecificName)) { // this is my specific topic metadata.put(Integer.parseInt(key.substring(topicSpecificName.length())), Long.parseLong(metadataManager.get(key).get().getValue())); } else if (key.startsWith(KAFKA_METADATA_WITH_SEPARATOR)) { // this is a specific topic, but not mine. ignore. assert true; } else if (key.startsWith(KAFKA_METADATA_PREFIX)) { // this is unspecified topic metadata.put(Integer.parseInt(key.substring(KAFKA_METADATA_PREFIX.length())), Long.parseLong(metadataManager.get(key).get().getValue())); // delete the old, unspecified metadata toDelete.add(key); } }); toDelete.forEach(metadataManager::remove); this.previousRunState = Optional.of(new KafkaRunState(metadata)); }
@Test public void testSerDser() { final String tableName = "testTable"; final IMetadataManager metadataManager = new MemoryMetadataManager(); final SinkStatManager sinkStatManager1 = new SinkStatManager(tableName, metadataManager); // Initially nothing will be found; it should not crash. sinkStatManager1.init(); Assert.assertEquals(0, sinkStatManager1.getAvgRecordSize()); Assert.assertFalse(sinkStatManager1.isStatHistoryAvailable()); final int avgRecordSize1 = 30; sinkStatManager1.getCurrentStat().put(SinkStat.AVG_RECORD_SIZE, Integer.toString(avgRecordSize1)); // nothing is saved to metadata manager before persist. Assert.assertEquals(0, metadataManager.getAllKeys().size()); sinkStatManager1.persist(); Assert.assertEquals(1, metadataManager.getAllKeys().size()); final SinkStatManager sinkStatManager2 = new SinkStatManager(tableName, metadataManager); sinkStatManager2.init(); Assert.assertEquals(avgRecordSize1, sinkStatManager2.getAvgRecordSize()); final int avgRecordSize2 = 20; sinkStatManager2.getCurrentStat().put(SinkStat.AVG_RECORD_SIZE, Integer.toString(avgRecordSize2)); sinkStatManager2.persist(); final SinkStatManager sinkStatManager3 = new SinkStatManager(tableName, metadataManager); sinkStatManager3.init(); Assert.assertEquals((avgRecordSize1 + avgRecordSize2) / 2, sinkStatManager3.getAvgRecordSize()); }