@@ -134,6 +134,12 @@ public void testIdle() {
134
134
// Advance currentTime to pass the idle timeout
135
135
systemTime .advance (TEST_TASK_WATERMARK_IDLE_TIMEOUT_MS );
136
136
137
+ // Watermark is computed based on both task 0 and task 1
138
+ watermarkMessage = new WatermarkMessage (4L , "task 1" );
139
+ watermarkStates .update (watermarkMessage , intPartition0 );
140
+ assertEquals (watermarkStates .getWatermarkPerSSP (intPartition0 ), 1L );
141
+ assertEquals (watermarkStates .getWatermark (intermediate ), WATERMARK_NOT_EXIST );
142
+
137
143
// Watermark is computed based on "task 1" alone since "task 0" passes the idle timeout
138
144
watermarkMessage = new WatermarkMessage (5L , "task 1" );
139
145
watermarkStates .update (watermarkMessage , intPartition0 );
@@ -196,14 +202,20 @@ public void testQuorum() {
196
202
assertEquals (watermarkStates .getWatermarkPerSSP (intPartition0 ), WATERMARK_NOT_EXIST );
197
203
assertEquals (watermarkStates .getWatermark (intermediate ), WATERMARK_NOT_EXIST );
198
204
205
+ // Watermark is computed based on both task 0 and task 1
206
+ watermarkMessage = new WatermarkMessage (3L , "task 1" );
207
+ watermarkStates .update (watermarkMessage , intPartition0 );
208
+ assertEquals (watermarkStates .getWatermarkPerSSP (intPartition0 ), 1L );
209
+ assertEquals (watermarkStates .getWatermark (intermediate ), WATERMARK_NOT_EXIST );
210
+
199
211
// Advance currentTime to pass the idle timeout
200
212
systemTime .advance (TEST_TASK_WATERMARK_IDLE_TIMEOUT_MS );
201
213
202
214
// Watermark is computed based on "task 1" alone since "task 0" passes the idle timeout
203
215
// Not meeting quorum
204
216
watermarkMessage = new WatermarkMessage (5L , "task 1" );
205
217
watermarkStates .update (watermarkMessage , intPartition0 );
206
- assertEquals (watermarkStates .getWatermarkPerSSP (intPartition0 ), WATERMARK_NOT_EXIST );
218
+ assertEquals (watermarkStates .getWatermarkPerSSP (intPartition0 ), 1L );
207
219
assertEquals (watermarkStates .getWatermark (intermediate ), WATERMARK_NOT_EXIST );
208
220
209
221
systemTime .advance (1 );
@@ -215,6 +227,26 @@ public void testQuorum() {
215
227
assertEquals (watermarkStates .getWatermark (intermediate ), WATERMARK_NOT_EXIST );
216
228
}
217
229
230
+ @ Test
231
+ public void testStartup () {
232
+ MockSystemTime systemTime = new MockSystemTime ();
233
+ WatermarkStates watermarkStates = new WatermarkStates (ssps , producerCounts , new MetricsRegistryMap (),
234
+ TEST_TASK_WATERMARK_IDLE_TIMEOUT_MS , TaskConfig .DEFAULT_WATERMARK_QUORUM_SIZE_PERCENTAGE , systemTime );
235
+
236
+ // Only one active task in the startup
237
+ WatermarkMessage watermarkMessage = new WatermarkMessage (1L , "task 0" );
238
+ watermarkStates .update (watermarkMessage , intPartition0 );
239
+ assertEquals (watermarkStates .getWatermarkPerSSP (intPartition0 ), WATERMARK_NOT_EXIST );
240
+
241
+ // Advance currentTime to pass the idle timeout
242
+ systemTime .advance (TEST_TASK_WATERMARK_IDLE_TIMEOUT_MS );
243
+
244
+ // Watermark will be soly computed based on task 0
245
+ watermarkMessage = new WatermarkMessage (5L , "task 0" );
246
+ watermarkStates .update (watermarkMessage , intPartition0 );
247
+ assertEquals (watermarkStates .getWatermarkPerSSP (intPartition0 ), 5L );
248
+ }
249
+
218
250
static class MockSystemTime implements LongSupplier {
219
251
long currentTime = System .currentTimeMillis ();
220
252
0 commit comments