[infinispan-issues] [JBoss JIRA] (ISPN-4497) Race condition in LocalLockMergingSegmentReadLocker results in file content being deleted

Anuj Shah (JIRA) issues at jboss.org
Thu Jul 10 11:02:24 EDT 2014


    [ https://issues.jboss.org/browse/ISPN-4497?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12983967#comment-12983967 ] 

Anuj Shah commented on ISPN-4497:
---------------------------------

I have a 'test' of sorts to demonstrate the problem:

{code:java}
  @Test
  public void testMultiThreaded() throws InterruptedException {
    EmbeddedCacheManager cacheManager = new DefaultCacheManager();
    Cache<Object, Object> metadata = cacheManager.getCache("metadata");
    Cache<Object, Object> chunks = cacheManager.getCache("chunks");
    Cache<Object, Integer> locks = cacheManager.getCache("locks");

    metadata.put(new FileCacheKey("indexName", "fileName"), new FileMetadata(10));

    int numThreads = 10;
    final LocalLockMergingSegmentReadLocker llmsrl = new LocalLockMergingSegmentReadLocker(locks, chunks, metadata, "indexName");

    for (int i = 0; i < numThreads; i++) {
      Thread thread = new Thread(new Runnable() {
        int counter = 0;
        @Override
        public void run() {
          try {
            while (true) {
              llmsrl.acquireReadLock("fileName");
              Thread.sleep(10);
              llmsrl.deleteOrReleaseReadLock("fileName");

              // Take a break every now and a again to try and avoid the same LocalReadLock being used constantly
              if (counter++ % 10 == 0) {
                Thread.sleep(100);
              }
            }
          } catch (InterruptedException e) {
          }
        }
      });

      thread.setDaemon(true);
      thread.start();
    }

    // Keep checking every 100ms. The file should never be deleted.
    while (true) {
      Thread.sleep(100);
      assertNotNull(metadata.get(new FileCacheKey("indexName", "fileName")));
    }
  }
{code}

For me this fails in around 8min

> Race condition in LocalLockMergingSegmentReadLocker results in file content being deleted
> -----------------------------------------------------------------------------------------
>
>                 Key: ISPN-4497
>                 URL: https://issues.jboss.org/browse/ISPN-4497
>             Project: Infinispan
>          Issue Type: Bug
>      Security Level: Public(Everyone can see) 
>          Components: Lucene Directory
>    Affects Versions: 5.2.6.Final
>            Reporter: Anuj Shah
>            Assignee: Sanne Grinovero
>
> There is a race condition in LocalLockMergingSegmentReadLocker which can lead to more calls delete on the underlying DistributedSegmentReadLocker which results in the file being removed from the caches. 
> This happens with three or more threads acquiring and releasing locks on the same file simultaneously:
> # Thread 1 (T1) acquires a lock and creates a {{LocalReadLock}}, call it L1 - the underlying lock is acquired
> # T2 starts to acquire and holds a reference to L1
> # T3 starts to acquire and holds a reference to L1
> # T1 releases - L1 at this stage only has value of 1 - so the underlying lock is released, and L1 is removed from the map
> # T2 continues - finds L1 with value 0 and acquires the underlying lock
> # T3 continues - increments L1 value to 2
> # T2 releases - creates a new {{LocalReadLock}}, L2 - this has zero value so the underlying lock is released, and L2 is removed from the map
> # T3 releases - creates a new {{LocalReadLock}}, L3 - this has zero value so the underlying lock is released, and L3 is removed from the map
> # The final step triggers a real file delete as underlying lock is released one too many times



--
This message was sent by Atlassian JIRA
(v6.2.6#6264)


More information about the infinispan-issues mailing list