[ 
https://issues.apache.org/jira/browse/IGNITE-8810?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16515535#comment-16515535
 ] 

Jon Tricker commented on IGNITE-8810:
-------------------------------------

Can be tested using the attached code. Should NOT print the error message at 
line 75.

{code:java}
package igniteUnlockTest;

import org.apache.ignite.Ignition;
import org.apache.ignite.configuration.DataRegionConfiguration;
import org.apache.ignite.configuration.DataStorageConfiguration;
import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
import 
org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder;

import java.util.Arrays;
import java.util.List;

import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteLock;

/**
 * Test demonstrating the failure to unlock on ignite node exit. Creates a node 
then second node which successfully joins the cluster. the 
 * second node then creates reentrant lock on a node, locks it and allows the 
thread holding the lock to die. The node is closed as 
 * demonstrated by:
 * 
 *              Topology snapshot [ver=2, servers=2, clients=0, CPUs=4, 
offheap=3.1GB, heap=0.5GB]
 *
 * changing to:
 * 
 *              Topology snapshot [ver=3, servers=1, clients=0, CPUs=4, 
offheap=3.1GB, heap=0.5GB]
 *              Ignite node stopped OK [name=INSTANCE2, uptime=00:00:00.132]
 * 
 * But when checked, on the remaining node, the lock is still held.
 * 
 * Tested under Eclipse on Ignite 2.5.0. Problem seen on both RHL and Windows.
 */
public class UnlockTest 
{
        public final static String LOCKNAME="LOCKNAME";
        
    public static void main( String[] args )
    {
        System.out.println( "Starting test" );

        // Make a uniquely named  ignite node.   
        IgniteConfiguration config1 = new DefaultIgniteConfig();
        config1.setIgniteInstanceName("INSTANCE1");
        
        // Start node. No caches required for this test.
        Ignite node1 = Ignition.start(config1);
        
        // Make a lock
        IgniteLock lock = node1.reentrantLock(LOCKNAME, true, false, true);
        
        // Check is initially unlocked
        if (lock.isLocked()) {
                System.out.println("Is initially locked");
        }
        
        // Create a remote thread. 
        TestThread thread = new TestThread(LOCKNAME);
         
        // Run and exit thread. Will get a handle to the lock and lock it.
        thread.start();
        
        try {
        // Wait for thread to close
        thread.join();
        
        // Ignite node should be closed now. But wait a while to be sure
        Thread.sleep(5000);
        }
        catch (Exception e) {
                System.out.println("Problem waiting for thread" + 
e.getMessage());
        }
        
        // Check that the lock is unlocked
        if (lock.isLocked()) {
                // This should not be printed but it is.
                System.out.println("ERROR ; Lock is not released on exit");
        }
        
        // Close node
        node1.close();
        
        System.out.println( "Test done" );
    }
    
    // Remote thread that takes a lock.
    private static class TestThread extends Thread {
        private Ignite node2;
        private String lockName;
        
        public TestThread(String lockName) {
                // Remember lock name.
                this.lockName = lockName;
                
                // Start a new, uniquely named, ignite node for the thread, 
            IgniteConfiguration config2 = new DefaultIgniteConfig();
            config2.setIgniteInstanceName("INSTANCE2");
            
            // Start an ignite node. No caches required.
            node2 = Ignition.start(config2);    
        }
        
        public void run() {
                // Get a handle to the lock and lock it. 
                // Note : failoverSafe=true. So it should release when the node 
is closed.
            IgniteLock lock = node2.reentrantLock(lockName, true, false, true);
            lock.lock();
            
            // Check that the lock is locked by this thread.
            if (!lock.isLocked()) {
                System.out.println("Is not locked");
            }
            if (!lock.isHeldByCurrentThread()){
                System.out.println("Is held by worng thread");
            }
            
                     
                // Should be able to run off the end, or crash, and get the 
lock released,
            // int i = 0;
            // int a = 1/i;
            
            // Even if we explicitly close the node the lock is still held.
                node2.close();
        }
        
    }
    
    // A simple, canned, ignite config.
        private static class DefaultIgniteConfig extends IgniteConfiguration {
                public DefaultIgniteConfig() {
                        // Some basic config.
                        setIgniteInstanceName("IGNITE_LOCK_TEST");
                        // Need a server to connect to. So be a server.
                        setClientMode(false);
                        setPeerClassLoadingEnabled(true);

                        // Set up node discovery
                        TcpDiscoverySpi discoSpi = new TcpDiscoverySpi();
                        TcpDiscoveryMulticastIpFinder finder = new 
TcpDiscoveryMulticastIpFinder();
                        List<String> addresses = 
Arrays.asList("127.0.0.1:47500..47502");
                        finder.setAddresses(addresses);
                        discoSpi.setIpFinder(finder);
                        setDiscoverySpi(discoSpi);

                        // Set up data storage
                        DataStorageConfiguration storeConfig = new 
DataStorageConfiguration();
                        DataRegionConfiguration regionConfig = 
storeConfig.getDefaultDataRegionConfiguration();
                        regionConfig.setName("IGNITE_LOCK_REGION");
                        
                        // For locking should not need persistence.
                        regionConfig.setPersistenceEnabled(false);
                        setDataStorageConfiguration(storeConfig);
                        
                        // Don't need any caches.
                }
        }
}

{code}


> Create failoverSafe for ReentrantLock
> -------------------------------------
>
>                 Key: IGNITE-8810
>                 URL: https://issues.apache.org/jira/browse/IGNITE-8810
>             Project: Ignite
>          Issue Type: Improvement
>            Reporter: Evgenii Zhuravlev
>            Priority: Major
>
> Currently, it has the flag "failoverSafe", but it doesn't have any 
> implementation for it



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to