You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ignite.apache.org by "Vladimir Ozerov (JIRA)" <ji...@apache.org> on 2015/04/28 16:48:06 UTC

[jira] [Created] (IGNITE-835) IgniteCache.lock is broken for PARTITIONED cache without near cache.

Vladimir Ozerov created IGNITE-835:
--------------------------------------

             Summary: IgniteCache.lock is broken for PARTITIONED cache without near cache.
                 Key: IGNITE-835
                 URL: https://issues.apache.org/jira/browse/IGNITE-835
             Project: Ignite
          Issue Type: Bug
          Components: cache
    Affects Versions: sprint-2
            Reporter: Vladimir Ozerov
            Assignee: Yakov Zhdanov
            Priority: Critical
             Fix For: sprint-4


Steps to reproduce:
1) Go to GridCacheLockAbstractTest
2) Add the test source below.
3) Make sure to disable near cache (GridCacheLockAbstractTest.cacheConfiguration() -> setNearConfiguration(null)).
4) Run GridCachePartitionedLockSelfTest.testLockReentrancy() and observe assertion failure.
5) Enable near cache back and re-run the test. Observe that now it pass.

{code}
public void testLockReentrancy() throws Throwable {
    for (int i = 10; i < 100; i++) {
        System.out.println("Key: " + i);

        final int i0 = i;

        final Lock lock = cache1.lock(i);

        lock.lockInterruptibly();

        try {
            final AtomicReference<Throwable> err = new AtomicReference<>();

            Thread t =  new Thread(new Runnable() {
                @Override public void run() {
                    try {
                        assert !lock.tryLock();
                        assert !lock.tryLock(100, TimeUnit.MILLISECONDS);

                        assert !cache1.lock(i0).tryLock();
                        assert !cache1.lock(i0).tryLock(100, TimeUnit.MILLISECONDS);
                    }
                    catch (Throwable e) {
                        err.set(e);
                    }
                }
            });

            t.start();
            t.join();

            if (err.get() != null)
                throw err.get();

            lock.lock();
            lock.unlock();

            t =  new Thread(new Runnable() {
                @Override public void run() {
                    try {
                        assert !lock.tryLock();
                        assert !lock.tryLock(100, TimeUnit.MILLISECONDS);

                        assert !cache1.lock(i0).tryLock();
                        assert !cache1.lock(i0).tryLock(100, TimeUnit.MILLISECONDS);
                    }
                    catch (Throwable e) {
                        err.set(e);
                    }
                }
            });

            t.start();
            t.join();

            if (err.get() != null)
                throw err.get();
        }
        finally {
            lock.unlock();
        }
    }
}
{code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)