|
33 | 33 | import org.apache.iotdb.commons.pipe.config.plugin.configuraion.PipeTaskRuntimeConfiguration; |
34 | 34 | import org.apache.iotdb.commons.pipe.config.plugin.env.PipeTaskSourceRuntimeEnvironment; |
35 | 35 | import org.apache.iotdb.commons.pipe.event.EnrichedEvent; |
| 36 | +import org.apache.iotdb.commons.pipe.event.ProgressReportEvent; |
36 | 37 | import org.apache.iotdb.commons.queryengine.plan.planner.plan.node.PlanNodeId; |
37 | 38 | import org.apache.iotdb.commons.utils.FileUtils; |
38 | 39 | import org.apache.iotdb.db.conf.IoTDBDescriptor; |
@@ -517,6 +518,37 @@ private void registerTestPipeMeta() throws Exception { |
517 | 518 | } |
518 | 519 | } |
519 | 520 |
|
| 521 | + @Test |
| 522 | + public void testProgressReportExtractionReleasesDroppedEvents() { |
| 523 | + final TestRealtimeDataRegionSource source = new TestRealtimeDataRegionSource(); |
| 524 | + |
| 525 | + final PipeRealtimeEvent heartbeatEvent = |
| 526 | + PipeRealtimeEventFactory.createRealtimeEvent(dataRegion1, false); |
| 527 | + heartbeatEvent.increaseReferenceCount(TEST_REFERENCE_HOLDER); |
| 528 | + source.extractHeartbeatForTest(heartbeatEvent); |
| 529 | + Assert.assertEquals(1, heartbeatEvent.getEvent().getReferenceCount()); |
| 530 | + |
| 531 | + final PipeRealtimeEvent progressEvent = createProgressReportRealtimeEvent(); |
| 532 | + progressEvent.increaseReferenceCount(TEST_REFERENCE_HOLDER); |
| 533 | + source.extractProgressReportEventForTest(progressEvent); |
| 534 | + |
| 535 | + Assert.assertEquals(0, heartbeatEvent.getEvent().getReferenceCount()); |
| 536 | + Assert.assertEquals(1, progressEvent.getEvent().getReferenceCount()); |
| 537 | + Assert.assertEquals(1, source.getEventCount()); |
| 538 | + |
| 539 | + final PipeRealtimeEvent mergedProgressEvent = createProgressReportRealtimeEvent(); |
| 540 | + mergedProgressEvent.increaseReferenceCount(TEST_REFERENCE_HOLDER); |
| 541 | + source.extractProgressReportEventForTest(mergedProgressEvent); |
| 542 | + |
| 543 | + Assert.assertEquals(0, mergedProgressEvent.getEvent().getReferenceCount()); |
| 544 | + Assert.assertEquals(1, progressEvent.getEvent().getReferenceCount()); |
| 545 | + Assert.assertEquals(1, source.getEventCount()); |
| 546 | + |
| 547 | + final Event queuedEvent = source.pollForTest(); |
| 548 | + Assert.assertSame(progressEvent, queuedEvent); |
| 549 | + ((EnrichedEvent) queuedEvent).clearReferenceCount(TEST_REFERENCE_HOLDER); |
| 550 | + } |
| 551 | + |
520 | 552 | private void removeTestPipeMeta() throws Exception { |
521 | 553 | final PipeMetaKeeper pipeMetaKeeper = getPipeMetaKeeper(); |
522 | 554 | pipeMetaKeeper.acquireWriteLock(); |
@@ -545,6 +577,47 @@ private void releaseSuppliedEvent(final Event event) { |
545 | 577 | } |
546 | 578 | } |
547 | 579 |
|
| 580 | + private PipeRealtimeEvent createProgressReportRealtimeEvent() { |
| 581 | + final ProgressReportEvent progressReportEvent = new ProgressReportEvent(null, 0, null); |
| 582 | + progressReportEvent.bindProgressIndex(MinimumProgressIndex.INSTANCE); |
| 583 | + return PipeRealtimeEventFactory.createRealtimeEvent(progressReportEvent); |
| 584 | + } |
| 585 | + |
| 586 | + private static class TestRealtimeDataRegionSource extends PipeRealtimeDataRegionSource { |
| 587 | + |
| 588 | + private void extractHeartbeatForTest(final PipeRealtimeEvent event) { |
| 589 | + extractHeartbeat(event); |
| 590 | + } |
| 591 | + |
| 592 | + private void extractProgressReportEventForTest(final PipeRealtimeEvent event) { |
| 593 | + extractProgressReportEvent(event); |
| 594 | + } |
| 595 | + |
| 596 | + private Event pollForTest() { |
| 597 | + return pendingQueue.directPoll(); |
| 598 | + } |
| 599 | + |
| 600 | + @Override |
| 601 | + protected void doExtract(final PipeRealtimeEvent event) { |
| 602 | + // Not needed in this reference-counting unit test. |
| 603 | + } |
| 604 | + |
| 605 | + @Override |
| 606 | + public Event supply() { |
| 607 | + return pendingQueue.directPoll(); |
| 608 | + } |
| 609 | + |
| 610 | + @Override |
| 611 | + public boolean isNeedListenToTsFile() { |
| 612 | + return false; |
| 613 | + } |
| 614 | + |
| 615 | + @Override |
| 616 | + public boolean isNeedListenToInsertNode() { |
| 617 | + return false; |
| 618 | + } |
| 619 | + } |
| 620 | + |
548 | 621 | private static class NoTsFileRealtimeDataRegionSource extends PipeRealtimeDataRegionSource { |
549 | 622 |
|
550 | 623 | private final AtomicInteger observedTsFileEventCount = new AtomicInteger(0); |
|
0 commit comments