@@ -558,14 +558,14 @@ public void testQueryChangeStreamWithPartitionEndRecordBoundedRestriction() {
558558 eq (restrictionTracker ),
559559 any (RestrictionInterrupter .class ),
560560 eq (watermarkEstimator ));
561- verify (partitionMetadataDao ).updateWatermark (PARTITION_TOKEN , WATERMARK_TIMESTAMP );
562561 verify (restrictionTracker ).tryClaim (PARTITION_END_TIMESTAMP );
563562
564563 verify (dataChangeRecordAction , never ()).run (any (), any (), any (), any (), any (), any ());
565564 verify (heartbeatRecordAction , never ()).run (any (), any (), any (), any (), any ());
566565 verify (childPartitionsRecordAction , never ()).run (any (), any (), any (), any (), any ());
567566 verify (partitionStartRecordAction , never ()).run (any (), any (), any (), any (), any ());
568567 verify (partitionEventRecordAction , never ()).run (any (), any (), any (), any (), any ());
568+ verify (partitionMetadataDao , never ()).updateWatermark (any (), any ());
569569 }
570570
571571 @ Test
@@ -611,14 +611,14 @@ public void testQueryChangeStreamWithPartitionEndRecordUnboundedRestriction() {
611611 eq (restrictionTracker ),
612612 any (RestrictionInterrupter .class ),
613613 eq (watermarkEstimator ));
614- verify (partitionMetadataDao ).updateWatermark (PARTITION_TOKEN , WATERMARK_TIMESTAMP );
615614 verify (restrictionTracker ).tryClaim (MAX_INCLUSIVE_END_AT );
616615
617616 verify (dataChangeRecordAction , never ()).run (any (), any (), any (), any (), any (), any ());
618617 verify (heartbeatRecordAction , never ()).run (any (), any (), any (), any (), any ());
619618 verify (childPartitionsRecordAction , never ()).run (any (), any (), any (), any (), any ());
620619 verify (partitionStartRecordAction , never ()).run (any (), any (), any (), any (), any ());
621620 verify (partitionEventRecordAction , never ()).run (any (), any (), any (), any (), any ());
621+ verify (partitionMetadataDao , never ()).updateWatermark (any (), any ());
622622 }
623623
624624 @ Test
@@ -771,14 +771,14 @@ public void testQueryChangeStreamWithOutOfRangeErrorOnUnboundedPartition() {
771771 verify (restrictionTracker ).tryClaim (MAX_INCLUSIVE_END_AT );
772772 verify (partitionMetadataDao ).updateToFinished (PARTITION_TOKEN );
773773 verify (metrics ).decActivePartitionReadCounter ();
774- verify (partitionMetadataDao ).updateWatermark (PARTITION_TOKEN , WATERMARK_TIMESTAMP );
775774
776775 verify (dataChangeRecordAction , never ()).run (any (), any (), any (), any (), any (), any ());
777776 verify (heartbeatRecordAction , never ()).run (any (), any (), any (), any (), any ());
778777 verify (childPartitionsRecordAction , never ()).run (any (), any (), any (), any (), any ());
779778 verify (partitionStartRecordAction , never ()).run (any (), any (), any (), any (), any ());
780779 verify (partitionEndRecordAction , never ()).run (any (), any (), any (), any (), any ());
781780 verify (partitionEventRecordAction , never ()).run (any (), any (), any (), any (), any ());
781+ verify (partitionMetadataDao , never ()).updateWatermark (any (), any ());
782782 }
783783
784784 // Out of range indicates that we're beyond the end of the partition and should stop
@@ -804,14 +804,116 @@ public void testQueryChangeStreamWithOutOfRangeErrorOnBoundedPartition() {
804804 verify (restrictionTracker ).tryClaim (PARTITION_END_TIMESTAMP );
805805 verify (partitionMetadataDao ).updateToFinished (PARTITION_TOKEN );
806806 verify (metrics ).decActivePartitionReadCounter ();
807- verify (partitionMetadataDao ).updateWatermark (PARTITION_TOKEN , WATERMARK_TIMESTAMP );
808807
809808 verify (dataChangeRecordAction , never ()).run (any (), any (), any (), any (), any (), any ());
810809 verify (heartbeatRecordAction , never ()).run (any (), any (), any (), any (), any ());
811810 verify (childPartitionsRecordAction , never ()).run (any (), any (), any (), any (), any ());
812811 verify (partitionStartRecordAction , never ()).run (any (), any (), any (), any (), any ());
813812 verify (partitionEndRecordAction , never ()).run (any (), any (), any (), any (), any ());
814813 verify (partitionEventRecordAction , never ()).run (any (), any (), any (), any (), any ());
814+ verify (partitionMetadataDao , never ()).updateWatermark (any (), any ());
815+ }
816+
817+ @ Test
818+ public void testQueryChangeStreamWithChildPartitionsRecordBoundedRestriction () {
819+ final ChangeStreamResultSetMetadata resultSetMetadata =
820+ mock (ChangeStreamResultSetMetadata .class );
821+ final ChangeStreamResultSet resultSet = mock (ChangeStreamResultSet .class );
822+ final ChildPartitionsRecord record1 = mock (ChildPartitionsRecord .class );
823+ when (record1 .getRecordTimestamp ()).thenReturn (RECORD_TIMESTAMP );
824+ when (changeStreamDao .changeStreamQuery (
825+ PARTITION_TOKEN ,
826+ PARTITION_START_TIMESTAMP ,
827+ PARTITION_END_TIMESTAMP ,
828+ PARTITION_HEARTBEAT_MILLIS ))
829+ .thenReturn (resultSet );
830+ when (resultSet .next ()).thenReturn (true , false );
831+ when (resultSet .getMetadata ()).thenReturn (resultSetMetadata );
832+ when (changeStreamRecordMapper .toChangeStreamRecords (partition , resultSet , resultSetMetadata ))
833+ .thenReturn (Arrays .asList (record1 ));
834+ when (childPartitionsRecordAction .run (
835+ eq (partition ),
836+ eq (record1 ),
837+ eq (restrictionTracker ),
838+ any (RestrictionInterrupter .class ),
839+ eq (watermarkEstimator )))
840+ .thenReturn (Optional .empty ());
841+ when (watermarkEstimator .currentWatermark ()).thenReturn (WATERMARK );
842+ when (restrictionTracker .tryClaim (any (Timestamp .class ))).thenReturn (true );
843+
844+ final ProcessContinuation result =
845+ action .run (
846+ partition , restrictionTracker , outputReceiver , watermarkEstimator , bundleFinalizer );
847+
848+ assertEquals (ProcessContinuation .stop (), result );
849+ verify (childPartitionsRecordAction )
850+ .run (
851+ eq (partition ),
852+ eq (record1 ),
853+ eq (restrictionTracker ),
854+ any (RestrictionInterrupter .class ),
855+ eq (watermarkEstimator ));
856+ verify (restrictionTracker ).tryClaim (PARTITION_END_TIMESTAMP );
857+
858+ verify (dataChangeRecordAction , never ()).run (any (), any (), any (), any (), any (), any ());
859+ verify (heartbeatRecordAction , never ()).run (any (), any (), any (), any (), any ());
860+ verify (partitionStartRecordAction , never ()).run (any (), any (), any (), any (), any ());
861+ verify (partitionEndRecordAction , never ()).run (any (), any (), any (), any (), any ());
862+ verify (partitionEventRecordAction , never ()).run (any (), any (), any (), any (), any ());
863+ verify (partitionMetadataDao , never ()).updateWatermark (any (), any ());
864+ }
865+
866+ @ Test
867+ public void testQueryChangeStreamWithChildPartitionsRecordUnboundedRestriction () {
868+ setupUnboundedPartition ();
869+
870+ final ChangeStreamResultSetMetadata resultSetMetadata =
871+ mock (ChangeStreamResultSetMetadata .class );
872+ final ChangeStreamResultSet resultSet = mock (ChangeStreamResultSet .class );
873+ final ChildPartitionsRecord record1 = mock (ChildPartitionsRecord .class );
874+ when (record1 .getRecordTimestamp ()).thenReturn (RECORD_TIMESTAMP );
875+ final ArgumentCaptor <Timestamp > timestampCaptor = ArgumentCaptor .forClass (Timestamp .class );
876+ when (changeStreamDao .changeStreamQuery (
877+ eq (PARTITION_TOKEN ),
878+ eq (PARTITION_START_TIMESTAMP ),
879+ timestampCaptor .capture (),
880+ eq (PARTITION_HEARTBEAT_MILLIS )))
881+ .thenReturn (resultSet );
882+ when (resultSet .next ()).thenReturn (true , false );
883+ when (resultSet .getMetadata ()).thenReturn (resultSetMetadata );
884+ when (changeStreamRecordMapper .toChangeStreamRecords (partition , resultSet , resultSetMetadata ))
885+ .thenReturn (Arrays .asList (record1 ));
886+ when (childPartitionsRecordAction .run (
887+ eq (partition ),
888+ eq (record1 ),
889+ eq (restrictionTracker ),
890+ any (RestrictionInterrupter .class ),
891+ eq (watermarkEstimator )))
892+ .thenReturn (Optional .empty ());
893+ when (watermarkEstimator .currentWatermark ()).thenReturn (WATERMARK );
894+ when (restrictionTracker .tryClaim (any (Timestamp .class ))).thenReturn (true );
895+
896+ final ProcessContinuation result =
897+ action .run (
898+ partition , restrictionTracker , outputReceiver , watermarkEstimator , bundleFinalizer );
899+
900+ assertEquals (ProcessContinuation .stop (), result );
901+ assertNotEquals (MAX_INCLUSIVE_END_AT , timestampCaptor .getValue ());
902+ verify (childPartitionsRecordAction )
903+ .run (
904+ eq (partition ),
905+ eq (record1 ),
906+ eq (restrictionTracker ),
907+ any (RestrictionInterrupter .class ),
908+ eq (watermarkEstimator ));
909+ verify (restrictionTracker ).tryClaim (MAX_INCLUSIVE_END_AT );
910+
911+ verify (dataChangeRecordAction , never ()).run (any (), any (), any (), any (), any (), any ());
912+ verify (heartbeatRecordAction , never ()).run (any (), any (), any (), any (), any ());
913+ verify (partitionStartRecordAction , never ()).run (any (), any (), any (), any (), any ());
914+ verify (partitionEndRecordAction , never ()).run (any (), any (), any (), any (), any ());
915+ verify (partitionEventRecordAction , never ()).run (any (), any (), any (), any (), any ());
916+ verify (partitionMetadataDao , never ()).updateWatermark (any (), any ());
815917 }
816918
817919 private static class BundleFinalizerStub implements BundleFinalizer {
0 commit comments