/*
* Copyright (c) 2008-2012 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.db.server.geo;
import org.junit.Assert;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.emc.storageos.db.client.impl.DbClientImpl;
import com.emc.storageos.db.client.impl.GlobalLockImpl;
import com.emc.storageos.db.client.model.*;
/**
* DB global lock tests
*/
public class DbGlobalLockTest extends DbsvcGeoTestBase {
private static final Logger _logger = LoggerFactory.getLogger(DbGlobalLockTest.class);
@Test
public void testNodesvcSharedGlobalLock() throws Exception {
// NodeSvcShared MODE
_logger.info("Starting node/svc shared global lock test");
DbClientImpl dbClient = (DbClientImpl) getDbClient();
boolean flag;
String vdc = "vdc1";
// 1. basic test
String lockname = "testlock1";
GlobalLockImpl glock = new GlobalLockImpl(dbClient, lockname, GlobalLock.GL_Mode.GL_NodeSvcShared_MODE, 0, vdc);
// acquire the lock
flag = glock.acquire("vipr1");
Assert.assertTrue(flag);
// get lock owner
String owner = null;
owner = glock.getOwner();
Assert.assertEquals(owner, "vdc1:vipr1");
// re-enter the lock again with the same owner
flag = glock.acquire("vipr1");
Assert.assertTrue(flag);
// try to acquire the lock with a different owner
GlobalLockImpl glock2 = new GlobalLockImpl(dbClient, lockname, GlobalLock.GL_Mode.GL_NodeSvcShared_MODE, 0, vdc);
flag = glock2.acquire("vipr2");
Assert.assertFalse(flag);
// try to release the lock with a different owner
flag = glock2.release("vipr2");
Assert.assertFalse(flag);
// release the lock
flag = glock.release("vipr1");
Assert.assertTrue(flag);
// 2. timeout test
glock = new GlobalLockImpl(dbClient, lockname, GlobalLock.GL_Mode.GL_NodeSvcShared_MODE, 3000, vdc);
// acquire the lock
flag = glock.acquire("vipr1");
Assert.assertTrue(flag);
// try to acquire the lock with a different owner
glock2 = new GlobalLockImpl(dbClient, lockname, GlobalLock.GL_Mode.GL_NodeSvcShared_MODE, 3000, vdc);
flag = glock2.acquire("vipr2");
Assert.assertFalse(flag);
// acquire the lock (expired) again with a different owner
Thread.sleep(3000);
flag = glock2.acquire("vipr2");
Assert.assertTrue(flag);
// try to release with original owner
flag = glock.release("vipr1");
Assert.assertFalse(flag);
// release with current owner
flag = glock2.release("vipr2");
Assert.assertTrue(flag);
}
@Test
public void testVdcSharedGlobalLock() throws Exception {
// VdcShared MODE
_logger.info("Starting vdc shared global lock test");
DbClientImpl dbClient = (DbClientImpl) getDbClient();
boolean flag;
String vdc = "vdc1";
String lockname = "testlock2";
GlobalLockImpl glock = new GlobalLockImpl(dbClient, lockname, GlobalLock.GL_Mode.GL_VdcShared_MODE, 0, vdc);
// acquire the lock
flag = glock.acquire("vipr1");
Assert.assertTrue(flag);
// get lock owner
String owner = null;
owner = glock.getOwner();
Assert.assertEquals(owner, vdc);
// re-enter the lock again with the same owner
flag = glock.acquire("vipr2");
Assert.assertTrue(flag);
// acquire the lock with a different local owner within the same Vdc
GlobalLockImpl glock2 = new GlobalLockImpl(dbClient, lockname, GlobalLock.GL_Mode.GL_VdcShared_MODE, 0, vdc);
flag = glock2.acquire("vipr2");
Assert.assertTrue(flag);
// try to acquire the lock from a different vdc
GlobalLockImpl glock3 = new GlobalLockImpl(dbClient, lockname, GlobalLock.GL_Mode.GL_VdcShared_MODE, 0, "vdc2");
flag = glock3.acquire("vipr2");
Assert.assertFalse(flag);
// release the lock from vipr2
flag = glock2.release("vipr2");
Assert.assertTrue(flag);
// get lock owner
owner = glock.getOwner();
Assert.assertEquals(owner, vdc);
// release the lock from vipr1
flag = glock.release("vipr1");
Assert.assertTrue(flag);
// get lock owner again
owner = glock.getOwner();
Assert.assertEquals(owner, null);
}
}