MessageCloseableIterator(MessageTable messageTable) throws IOException { this.topicId = topicMetadata.getTopicId(); this.messageTable = messageTable; this.inclusive = isIncludeStart(); this.messageLimit = getLimit(); long ttl = topicMetadata.getTTL(); startOffset = getStartOffset() == null ? null : new MessageId(getStartOffset()); Long startTime = getStartTime(); // Lower bound of messages that are still valid long smallestPublishTime = System.currentTimeMillis() - TimeUnit.SECONDS.toMillis(ttl); CloseableIterator<MessageTable.Entry> messageIterator; // If there is no startOffset or if the publish time in the startOffset is smaller then TTL, // do the scanning based on time. The smallest start time should be the currentTime - TTL. if (startOffset == null || startOffset.getPublishTimestamp() < smallestPublishTime) { long fetchStartTime = Math.max(smallestPublishTime, startTime == null ? smallestPublishTime : startTime); messageIterator = messageTable.fetch(topicMetadata, fetchStartTime, messageLimit, getTransaction()); } else { // Start scanning based on the start message id if (startOffset.getPayloadWriteTimestamp() != 0L) { // This message ID refer to payload table. Scan the message table with the reference message ID inclusively. messageIterator = messageTable.fetch(topicMetadata, createMessageTableMessageId(startOffset), true, messageLimit, getTransaction()); } else { messageIterator = messageTable.fetch(topicMetadata, startOffset, isIncludeStart(), messageLimit, getTransaction()); } } this.messageIterator = messageIterator; }
MessageCloseableIterator(MessageTable messageTable) throws IOException { this.topicId = topicMetadata.getTopicId(); this.messageTable = messageTable; this.inclusive = isIncludeStart(); this.messageLimit = getLimit(); long ttl = topicMetadata.getTTL(); startOffset = getStartOffset() == null ? null : new MessageId(getStartOffset()); Long startTime = getStartTime(); // Lower bound of messages that are still valid long smallestPublishTime = System.currentTimeMillis() - TimeUnit.SECONDS.toMillis(ttl); CloseableIterator<MessageTable.Entry> messageIterator; // If there is no startOffset or if the publish time in the startOffset is smaller then TTL, // do the scanning based on time. The smallest start time should be the currentTime - TTL. if (startOffset == null || startOffset.getPublishTimestamp() < smallestPublishTime) { long fetchStartTime = Math.max(smallestPublishTime, startTime == null ? smallestPublishTime : startTime); messageIterator = messageTable.fetch(topicMetadata, fetchStartTime, messageLimit, getTransaction()); } else { // Start scanning based on the start message id if (startOffset.getPayloadWriteTimestamp() != 0L) { // This message ID refer to payload table. Scan the message table with the reference message ID inclusively. messageIterator = messageTable.fetch(topicMetadata, createMessageTableMessageId(startOffset), true, messageLimit, getTransaction()); } else { messageIterator = messageTable.fetch(topicMetadata, startOffset, isIncludeStart(), messageLimit, getTransaction()); } } this.messageIterator = messageIterator; }
long ttlInMs = TimeUnit.SECONDS.toMillis(topicMetadata.getTTL()); byte[] startRow = MessagingUtils.toDataKeyPrefix(topicMetadata.getTopicId(), Integer.parseInt(MessagingUtils.Constants.DEFAULT_GENERATION));
long ttlInMs = TimeUnit.SECONDS.toMillis(topicMetadata.getTTL()); byte[] startRow = MessagingUtils.toDataKeyPrefix(topicMetadata.getTopicId(), Integer.parseInt(MessagingUtils.Constants.DEFAULT_GENERATION));
long ttlInMs = TimeUnit.SECONDS.toMillis(topicMetadata.getTTL()); byte[] startRow = MessagingUtils.toDataKeyPrefix(topicMetadata.getTopicId(), Integer.parseInt(MessagingUtils.Constants.DEFAULT_GENERATION));
long ttlInMs = TimeUnit.SECONDS.toMillis(topicMetadata.getTTL()); byte[] startRow = MessagingUtils.toDataKeyPrefix(topicMetadata.getTopicId(), Integer.parseInt(MessagingUtils.Constants.DEFAULT_GENERATION));
@Test public void testGeMetadata() throws Exception { TopicId topicId = new NamespaceId("ns2").topic("d"); TopicMetadata metadata = new TopicMetadata(topicId, "ttl", "100"); for (int i = 1; i <= 5; i++) { client.createTopic(metadata); TopicMetadata topicMetadata = client.getTopic(topicId); Assert.assertEquals(100, topicMetadata.getTTL()); Assert.assertEquals(i, topicMetadata.getGeneration()); client.deleteTopic(topicId); } }
table.createTopic(topicMetadata); Assert.assertEquals(topicMetadata.getTopicId(), table.getMetadata(NamespaceId.DEFAULT.topic("t2")).getTopicId()); Assert.assertEquals(topicMetadata.getTTL(), table.getMetadata(NamespaceId.DEFAULT.topic("t2")).getTTL()); Assert.assertEquals(1, table.getMetadata(NamespaceId.DEFAULT.topic("t2")).getGeneration());
@Test public void testGenerations() throws Exception { try (MetadataTable table = createMetadataTable()) { TopicId topicId = NamespaceId.DEFAULT.topic("gtopic"); for (int i = 1; i <= 50; i++) { table.createTopic(new TopicMetadata(topicId, "ttl", 1)); TopicMetadata metadata = table.getMetadata(topicId); Assert.assertEquals(i, metadata.getGeneration()); Assert.assertEquals(1, metadata.getTTL()); table.deleteTopic(topicId); try { table.getMetadata(topicId); Assert.fail("Expected TopicNotFoundException"); } catch (TopicNotFoundException ex) { // Expected } } } }