iit2009060 commented on code in PR #14483:
URL: https://github.com/apache/kafka/pull/14483#discussion_r1360731330


##########
core/src/test/scala/unit/kafka/log/remote/RemoteIndexCacheTest.scala:
##########
@@ -592,16 +593,75 @@ class RemoteIndexCacheTest {
     verifyFetchIndexInvocation(count = 1)
   }
 
+  @Test
+  def testConcurrentRemoveReadForCache(): Unit = {
+    // Create a spy Cache Entry
+    val rlsMetadata = new 
RemoteLogSegmentMetadata(RemoteLogSegmentId.generateNew(idPartition), 
baseOffset, lastOffset,
+      time.milliseconds(), brokerId, time.milliseconds(), segmentSize, 
Collections.singletonMap(0, 0L))
+
+    val timeIndex = spy(createTimeIndexForSegmentMetadata(rlsMetadata, new 
File(tpDir, DIR_NAME)))
+    val txIndex = spy(createTxIndexForSegmentMetadata(rlsMetadata, new 
File(tpDir, DIR_NAME)))
+    val offsetIndex = spy(createOffsetIndexForSegmentMetadata(rlsMetadata, new 
File(tpDir, DIR_NAME)))
+
+    val spyEntry = spy(new RemoteIndexCache.Entry(offsetIndex, timeIndex, 
txIndex))
+    cache.internalCache.put(rlsMetadata.remoteLogSegmentId().id(), spyEntry)
+
+    assertCacheSize(1)
+
+    var entry: RemoteIndexCache.Entry = null
+
+    val latchForCacheRead = new CountDownLatch(1)
+    val latchForCacheRemove = new CountDownLatch(1)
+    val latchForTestWait = new CountDownLatch(1)
+
+    doAnswer((invocation: InvocationOnMock) => {
+      // Signal the CacheRead to unblock itself
+      latchForCacheRead.countDown()
+      // Wait for signal to start renaming the files
+      latchForCacheRemove.await()
+      // Calling the markForCleanup() actual method to start renaming the files
+      invocation.callRealMethod()

Review Comment:
   @showuon Yes seems correct , as we do not have much control which will get 
executed we can assert Cache size.  
   
   As there may be a case where `remove` and `read` operation  has a bug , and 
nothing happens , but this test case would still pass as  file still exists. 
Adding one more validation when file exists would ensure the correctness of the 
test case. 
   ```
   if (Files.exists(entry.offsetIndex().file().toPath)) {
             assertCacheSize(1)
        //  validate the timestamp of the file created before running the 
`remove`  and  `read` operation concurrently with the file recreated after the 
operation and it should be lesser than the later.  
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: jira-unsubscr...@kafka.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to