diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 6044ca4..eda0861 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,15 +1,13 @@ language: java -script: 'ant test' +script: 'mvn test' services: - mongodb jdk: - - oraclejdk7 - - openjdk6 - - openjdk7 + - oraclejdk8 env: - DB=mongodb diff --git a/conf/maven-mongo-java-distributed-lock.xml b/conf/maven-mongo-java-distributed-lock.xml deleted file mode 100644 index baa3fd8..0000000 --- a/conf/maven-mongo-java-distributed-lock.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - 4.0.0 - com.deftlabs - mongo-java-distributed-lock - jar - Mongo Java Distributed Lock - @VERSION@ - A distributed lock backed by MongoDB - https://deftlabs.com - - - - The Apache Software License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - - - - - https://github.com/deftlabs - - - - - org.mongodb - mongo-java-driver - [2.6,) - - - - - - Ryan Nitz - Deft Labs - - - - diff --git a/lib/junit-4.8.2.jar b/lib/junit-4.8.2.jar deleted file mode 100644 index 5b4bb84..0000000 Binary files a/lib/junit-4.8.2.jar and /dev/null differ diff --git a/lib/mongo-2.7.3.jar b/lib/mongo-2.7.3.jar deleted file mode 100644 index 24884da..0000000 Binary files a/lib/mongo-2.7.3.jar and /dev/null differ diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..e79a6a3 --- /dev/null +++ b/pom.xml @@ -0,0 +1,85 @@ + + + 4.0.0 + com.deftlabs + mongo-java-distributed-lock + jar + Mongo Java Distributed Lock + 0.1.7 + A distributed lock backed by MongoDB + https://deftlabs.com + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + https://github.com/deftlabs + + + + + org.mongodb + mongo-java-driver + [3.2.0,) + + + junit + junit + 4.12 + test + + + org.assertj + assertj-core + 3.4.0 + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + com.google.code.maven-replacer-plugin + replacer + 1.5.3 + + + process-sources + + replace + + + + + true + src/main/java/com/deftlabs/lock/mongo/DistributedLockSvcOptions.java + src/main/java/com/deftlabs/lock/mongo/DistributedLockSvcOptions.java + false + @LIB_VERSION@ + ${project.version} + + + + + + + + Ryan Nitz + Deft Labs + + + + diff --git a/src/main/com/deftlabs/lock/mongo/DistributedLock.java b/src/main/java/com/deftlabs/lock/mongo/DistributedLock.java similarity index 100% rename from src/main/com/deftlabs/lock/mongo/DistributedLock.java rename to src/main/java/com/deftlabs/lock/mongo/DistributedLock.java diff --git a/src/main/com/deftlabs/lock/mongo/DistributedLockException.java b/src/main/java/com/deftlabs/lock/mongo/DistributedLockException.java similarity index 100% rename from src/main/com/deftlabs/lock/mongo/DistributedLockException.java rename to src/main/java/com/deftlabs/lock/mongo/DistributedLockException.java diff --git a/src/main/com/deftlabs/lock/mongo/DistributedLockOptions.java b/src/main/java/com/deftlabs/lock/mongo/DistributedLockOptions.java similarity index 100% rename from src/main/com/deftlabs/lock/mongo/DistributedLockOptions.java rename to src/main/java/com/deftlabs/lock/mongo/DistributedLockOptions.java diff --git a/src/main/com/deftlabs/lock/mongo/DistributedLockSvc.java b/src/main/java/com/deftlabs/lock/mongo/DistributedLockSvc.java similarity index 100% rename from src/main/com/deftlabs/lock/mongo/DistributedLockSvc.java rename to src/main/java/com/deftlabs/lock/mongo/DistributedLockSvc.java diff --git a/src/main/com/deftlabs/lock/mongo/DistributedLockSvcFactory.java b/src/main/java/com/deftlabs/lock/mongo/DistributedLockSvcFactory.java similarity index 100% rename from src/main/com/deftlabs/lock/mongo/DistributedLockSvcFactory.java rename to src/main/java/com/deftlabs/lock/mongo/DistributedLockSvcFactory.java diff --git a/src/main/com/deftlabs/lock/mongo/DistributedLockSvcOptions.java b/src/main/java/com/deftlabs/lock/mongo/DistributedLockSvcOptions.java similarity index 72% rename from src/main/com/deftlabs/lock/mongo/DistributedLockSvcOptions.java rename to src/main/java/com/deftlabs/lock/mongo/DistributedLockSvcOptions.java index ad1d5ad..49db500 100644 --- a/src/main/com/deftlabs/lock/mongo/DistributedLockSvcOptions.java +++ b/src/main/java/com/deftlabs/lock/mongo/DistributedLockSvcOptions.java @@ -17,6 +17,8 @@ package com.deftlabs.lock.mongo; // Java +import com.mongodb.MongoClient; + import java.net.InetAddress; import java.net.UnknownHostException; @@ -35,7 +37,8 @@ public class DistributedLockSvcOptions { * */ public DistributedLockSvcOptions(final String pMongoUri) - { this(pMongoUri, "mongo-distributed-lock", "locks", null); } + { this(pMongoUri, "mongo-distributed-lock", "locks", null); + } /** * Constructor that allows the user to specify database and colleciton name. @@ -43,7 +46,8 @@ public DistributedLockSvcOptions(final String pMongoUri) public DistributedLockSvcOptions( final String pMongoUri, final String pDbName, final String pCollectionName) - { this(pMongoUri, pDbName, pCollectionName, null); } + { this(pMongoUri, pDbName, pCollectionName, null); + } /** * Constructor that allows the user to specify database, colleciton and app name. @@ -65,8 +69,54 @@ public DistributedLockSvcOptions( final String pMongoUri, try { _hostname = InetAddress.getLocalHost().getHostName(); } catch (final UnknownHostException e) { _hostname = null; } + _mongoClient = null; + } + + /** + * The basic constructor. This uses the following:
+ * + * + */ + public DistributedLockSvcOptions(final MongoClient pMongoClient) + { this(pMongoClient, "mongo-distributed-lock", "locks", null); + } + + /** + * Constructor that allows the user to specify database and colleciton name. + */ + public DistributedLockSvcOptions( final MongoClient pMongoClient, + final String pDbName, + final String pCollectionName) + { this(pMongoClient, pDbName, pCollectionName, null); + } + + /** + * Constructor that allows the user to specify database, colleciton and app name. + * The app name should definetly be used if the db/collection names are shared by multiple + * apps/systems (e.g., SomeCoolDataProcessor). + */ + public DistributedLockSvcOptions( final MongoClient pMongoClient, + final String pDbName, + final String pCollectionName, + final String pAppName) + { + _mongoClient = pMongoClient; + _dbName = pDbName; + _collectionName = pCollectionName; + _appName = pAppName; + + try { _hostAddress = InetAddress.getLocalHost().getHostAddress(); + } catch (final UnknownHostException e) { _hostAddress = null; } + + try { _hostname = InetAddress.getLocalHost().getHostName(); + } catch (final UnknownHostException e) { _hostname = null; } + _mongoUri = null; } + public MongoClient getMongoClient() { return _mongoClient; } public String getMongoUri() { return _mongoUri; } public String getDbName() { return _dbName; } public String getCollectionName() { return _collectionName; } @@ -131,6 +181,7 @@ public void setLockUnlockedFrequency(final long pLockUnlockedFrequency) { public void setHistoryCollectionName(final String pV) { _historyCollectionName = pV; } public String getHistoryCollectionName() { return _historyCollectionName; } + private final MongoClient _mongoClient; private final String _mongoUri; private final String _dbName; private final String _collectionName; diff --git a/src/main/com/deftlabs/lock/mongo/impl/BaseDao.java b/src/main/java/com/deftlabs/lock/mongo/impl/BaseDao.java similarity index 78% rename from src/main/com/deftlabs/lock/mongo/impl/BaseDao.java rename to src/main/java/com/deftlabs/lock/mongo/impl/BaseDao.java index f329c4e..2e1edb6 100644 --- a/src/main/com/deftlabs/lock/mongo/impl/BaseDao.java +++ b/src/main/java/com/deftlabs/lock/mongo/impl/BaseDao.java @@ -21,13 +21,7 @@ import com.deftlabs.lock.mongo.DistributedLockSvcOptions; // Mongo -import com.mongodb.Mongo; -import com.mongodb.DB; -import com.mongodb.DBCollection; -import com.mongodb.BasicDBObject; -import com.mongodb.WriteResult; -import com.mongodb.WriteConcern; -import com.mongodb.CommandResult; +import com.mongodb.*; import org.bson.types.ObjectId; // Java @@ -37,19 +31,10 @@ * The base dao. */ abstract class BaseDao { - - protected final static void requestStart( final Mongo pMongo, - final DistributedLockSvcOptions pSvcOptions) - { getDb(pMongo, pSvcOptions).requestStart(); } - - protected final static void requestDone(final Mongo pMongo, - final DistributedLockSvcOptions pSvcOptions) - { getDb(pMongo, pSvcOptions).requestDone(); } - /** * Returns the db. */ - protected final static DB getDb(final Mongo pMongo, + protected final static DB getDb(final MongoClient pMongo, final DistributedLockSvcOptions pSvcOptions) { return pMongo.getDB(pSvcOptions.getDbName()); } @@ -57,7 +42,7 @@ protected final static DB getDb(final Mongo pMongo, * Returns the current server time. This makes a few requests to the server to try and adjust for * network latency. */ - protected final static long getServerTime( final Mongo pMongo, + protected final static long getServerTime( final MongoClient pMongo, final DistributedLockSvcOptions pSvcOptions) { diff --git a/src/main/com/deftlabs/lock/mongo/impl/LockDao.java b/src/main/java/com/deftlabs/lock/mongo/impl/LockDao.java similarity index 88% rename from src/main/com/deftlabs/lock/mongo/impl/LockDao.java rename to src/main/java/com/deftlabs/lock/mongo/impl/LockDao.java index 9ad5dca..5269f7c 100644 --- a/src/main/com/deftlabs/lock/mongo/impl/LockDao.java +++ b/src/main/java/com/deftlabs/lock/mongo/impl/LockDao.java @@ -21,14 +21,7 @@ import com.deftlabs.lock.mongo.DistributedLockSvcOptions; // Mongo -import com.mongodb.Mongo; -import com.mongodb.DB; -import com.mongodb.DBCursor; -import com.mongodb.DBCollection; -import com.mongodb.BasicDBObject; -import com.mongodb.WriteResult; -import com.mongodb.WriteConcern; -import com.mongodb.CommandResult; +import com.mongodb.*; import org.bson.types.ObjectId; // Java @@ -43,7 +36,7 @@ final class LockDao extends BaseDao { /** * Increment the lock heartbeat time. */ - static void heartbeat( final Mongo pMongo, + static void heartbeat( final MongoClient pMongo, final String pLockName, final ObjectId pLockId, final DistributedLockOptions pLockOptions, @@ -51,8 +44,6 @@ static void heartbeat( final Mongo pMongo, { try { - requestStart(pMongo, pSvcOptions); - final long serverTime = getServerTime(pMongo, pSvcOptions); final BasicDBObject query = new BasicDBObject(LockDef.ID.field, pLockName); @@ -61,23 +52,20 @@ static void heartbeat( final Mongo pMongo, final BasicDBObject toSet = new BasicDBObject(LockDef.LAST_HEARTBEAT.field, new Date(serverTime)); toSet.put(LockDef.LOCK_TIMEOUT_TIME.field, new Date(serverTime + pLockOptions.getInactiveLockTimeout())); + getDbCollection(pMongo, pSvcOptions).update(query, new BasicDBObject(SET, toSet), false, false, WriteConcern.ACKNOWLEDGED); - getDbCollection(pMongo, pSvcOptions).update(query, new BasicDBObject(SET, toSet), false, false, WriteConcern.SAFE); - - } finally { requestDone(pMongo, pSvcOptions); } + } finally { } } /** * Try and get the lock. If unable to do so, this returns false. */ - static synchronized ObjectId lock( final Mongo pMongo, + static synchronized ObjectId lock( final MongoClient pMongo, final String pLockName, final DistributedLockSvcOptions pSvcOptions, final DistributedLockOptions pLockOptions) { try { - requestStart(pMongo, pSvcOptions); - // Lookup the lock object. BasicDBObject lockDoc = findById(pMongo, pLockName, pSvcOptions); @@ -112,10 +100,10 @@ static synchronized ObjectId lock( final Mongo pMongo, return null; - } finally { requestDone(pMongo, pSvcOptions); } + } finally { } } - private static ObjectId tryLockingExisting( final Mongo pMongo, + private static ObjectId tryLockingExisting( final MongoClient pMongo, final String pLockName, final ObjectId pCurrentLockId, final DistributedLockSvcOptions pSvcOptions, @@ -173,7 +161,7 @@ private static ObjectId tryLockingExisting( final Mongo pMongo, * This will try and create the object. If successful, it will return the lock id. * Otherwise, it will return null (i.e., no lock). */ - private static ObjectId tryInsertNew( final Mongo pMongo, + private static ObjectId tryInsertNew( final MongoClient pMongo, final String pLockName, final DistributedLockSvcOptions pSvcOptions, final DistributedLockOptions pLockOptions, @@ -206,10 +194,11 @@ private static ObjectId tryInsertNew( final Mongo pMongo, lockDoc.put(LockDef.INACTIVE_LOCK_TIMEOUT.field, pLockOptions.getInactiveLockTimeout()); // Insert, if successful then get out of here. - final WriteResult result = getDbCollection(pMongo, pSvcOptions).insert(lockDoc, WriteConcern.NORMAL); - final CommandResult cmdResult = result.getLastError(WriteConcern.NORMAL); - - if (!cmdResult.ok() || cmdResult.getException() != null || cmdResult.getErrorMessage() != null) return null; + try { + getDbCollection(pMongo, pSvcOptions).insert(lockDoc, WriteConcern.ACKNOWLEDGED); + } catch (MongoException e) { + return null; + } if (pSvcOptions.getEnableHistory()) { LockHistoryDao.insert( pMongo, pLockName, pSvcOptions, pLockOptions, serverTime, LockState.LOCKED, lockId, false); } @@ -220,7 +209,7 @@ private static ObjectId tryInsertNew( final Mongo pMongo, /** * Returns true if the lock is locked. */ - static boolean isLocked(final Mongo pMongo, + static boolean isLocked(final MongoClient pMongo, final String pLockName, final DistributedLockSvcOptions pSvcOptions) { @@ -237,7 +226,7 @@ static boolean isLocked(final Mongo pMongo, /** * Find by lock name/id. */ - static BasicDBObject findById( final Mongo pMongo, + static BasicDBObject findById( final MongoClient pMongo, final String pLockName, final DistributedLockSvcOptions pSvcOptions) { return (BasicDBObject)getDbCollection(pMongo, pSvcOptions).findOne(new BasicDBObject(LockDef.ID.field, pLockName)); } @@ -246,7 +235,7 @@ static BasicDBObject findById( final Mongo pMongo, * Increment the waiting request count. This can be used by application developers * to diagnose problems with their applications. */ - static void incrementLockAttemptCount( final Mongo pMongo, + static void incrementLockAttemptCount( final MongoClient pMongo, final String pLockName, final ObjectId pLockId, final DistributedLockSvcOptions pSvcOptions) @@ -256,13 +245,13 @@ static void incrementLockAttemptCount( final Mongo pMongo, query.put(LockDef.LOCK_ID.field, pLockId); getDbCollection(pMongo, pSvcOptions) - .update(query, new BasicDBObject(INC, new BasicDBObject(LockDef.LOCK_ATTEMPT_COUNT.field, 1)), false, false, WriteConcern.SAFE); + .update(query, new BasicDBObject(INC, new BasicDBObject(LockDef.LOCK_ATTEMPT_COUNT.field, 1)), false, false, WriteConcern.ACKNOWLEDGED); } /** * Unlock the lock. */ - static synchronized void unlock(final Mongo pMongo, + static synchronized void unlock(final MongoClient pMongo, final String pLockName, final DistributedLockSvcOptions pSvcOptions, final DistributedLockOptions pLockOptions, @@ -299,7 +288,7 @@ static synchronized void unlock(final Mongo pMongo, /** * Check for expired/inactive/dead locks and unlock. */ - static void expireInactiveLocks(final Mongo pMongo, final DistributedLockSvcOptions pSvcOptions) { + static void expireInactiveLocks(final MongoClient pMongo, final DistributedLockSvcOptions pSvcOptions) { // Adjust the time buffer to make sure we do not have small time issues. final long queryServerTime = getServerTime(pMongo, pSvcOptions); @@ -356,7 +345,7 @@ static void expireInactiveLocks(final Mongo pMongo, final DistributedLockSvcOpti /** * Returns the collection. */ - private static DBCollection getDbCollection(final Mongo pMongo, + private static DBCollection getDbCollection(final MongoClient pMongo, final DistributedLockSvcOptions pSvcOptions) { return getDb(pMongo, pSvcOptions).getCollection(pSvcOptions.getCollectionName()); } @@ -364,35 +353,35 @@ private static DBCollection getDbCollection(final Mongo pMongo, * Ensure the proper indexes are on the collection. This must be called when * the service sarts. */ - static void setup(final Mongo pMongo, final DistributedLockSvcOptions pSvcOptions) { - getDbCollection(pMongo, pSvcOptions).ensureIndex(new BasicDBObject(LockDef.LAST_HEARTBEAT.field, 1), "lastHeartbeatV1Idx", false); - getDbCollection(pMongo, pSvcOptions).ensureIndex(new BasicDBObject(LockDef.OWNER_APP_NAME.field, 1), "ownerAppNameV1Idx", false); - getDbCollection(pMongo, pSvcOptions).ensureIndex(new BasicDBObject(LockDef.STATE.field, 1), "stateV1Idx", false); - getDbCollection(pMongo, pSvcOptions).ensureIndex(new BasicDBObject(LockDef.LOCK_ID.field, 1), "lockIdV1Idx", false); + static void setup(final MongoClient pMongo, final DistributedLockSvcOptions pSvcOptions) { + getDbCollection(pMongo, pSvcOptions).createIndex(new BasicDBObject(LockDef.LAST_HEARTBEAT.field, 1), "lastHeartbeatV1Idx", false); + getDbCollection(pMongo, pSvcOptions).createIndex(new BasicDBObject(LockDef.OWNER_APP_NAME.field, 1), "ownerAppNameV1Idx", false); + getDbCollection(pMongo, pSvcOptions).createIndex(new BasicDBObject(LockDef.STATE.field, 1), "stateV1Idx", false); + getDbCollection(pMongo, pSvcOptions).createIndex(new BasicDBObject(LockDef.LOCK_ID.field, 1), "lockIdV1Idx", false); final BasicDBObject idStateIdx = new BasicDBObject(LockDef.ID.field, 1); idStateIdx.put(LockDef.STATE.field, 1); - getDbCollection(pMongo, pSvcOptions).ensureIndex(idStateIdx, "idStateV1Idx", false); + getDbCollection(pMongo, pSvcOptions).createIndex(idStateIdx, "idStateV1Idx", false); final BasicDBObject idLockIdIdx = new BasicDBObject(LockDef.ID.field, 1); idStateIdx.put(LockDef.LOCK_ID.field, 1); - getDbCollection(pMongo, pSvcOptions).ensureIndex(idLockIdIdx, "idLockIdV1Idx", false); + getDbCollection(pMongo, pSvcOptions).createIndex(idLockIdIdx, "idLockIdV1Idx", false); final BasicDBObject stateTimeoutIdx = new BasicDBObject(LockDef.STATE.field, 1); stateTimeoutIdx.put(LockDef.LOCK_TIMEOUT_TIME.field, 1); - getDbCollection(pMongo, pSvcOptions).ensureIndex(stateTimeoutIdx, "stateTimeoutV1Idx", false); + getDbCollection(pMongo, pSvcOptions).createIndex(stateTimeoutIdx, "stateTimeoutV1Idx", false); final BasicDBObject idStateLockIdIdx = new BasicDBObject(LockDef.ID.field, 1); idStateLockIdIdx.put(LockDef.LOCK_ID.field, 1); idStateLockIdIdx.put(LockDef.STATE.field, 1); - getDbCollection(pMongo, pSvcOptions).ensureIndex(idStateLockIdIdx, "idStateLockIdV1Idx", false); + getDbCollection(pMongo, pSvcOptions).createIndex(idStateLockIdIdx, "idStateLockIdV1Idx", false); final BasicDBObject idStateLockIdTimeoutIdx = new BasicDBObject(LockDef.ID.field, 1); idStateLockIdTimeoutIdx.put(LockDef.LOCK_ID.field, 1); idStateLockIdTimeoutIdx.put(LockDef.STATE.field, 1); idStateLockIdTimeoutIdx.put(LockDef.LOCK_TIMEOUT_TIME.field, 1); - getDbCollection(pMongo, pSvcOptions).ensureIndex(idStateLockIdTimeoutIdx, "idStateLockIdTimeoutV1Idx", false); + getDbCollection(pMongo, pSvcOptions).createIndex(idStateLockIdTimeoutIdx, "idStateLockIdTimeoutV1Idx", false); } } diff --git a/src/main/com/deftlabs/lock/mongo/impl/LockDef.java b/src/main/java/com/deftlabs/lock/mongo/impl/LockDef.java similarity index 96% rename from src/main/com/deftlabs/lock/mongo/impl/LockDef.java rename to src/main/java/com/deftlabs/lock/mongo/impl/LockDef.java index 6b18a74..480928b 100644 --- a/src/main/com/deftlabs/lock/mongo/impl/LockDef.java +++ b/src/main/java/com/deftlabs/lock/mongo/impl/LockDef.java @@ -43,7 +43,7 @@ enum LockDef { LOCK_ATTEMPT_COUNT("lockAttemptCount"); // The number of times another thread/process has requested this lock (since locked) - private LockDef(final String pField) { field = pField; } + LockDef(final String pField) { field = pField; } final String field; } diff --git a/src/main/com/deftlabs/lock/mongo/impl/LockHistoryDao.java b/src/main/java/com/deftlabs/lock/mongo/impl/LockHistoryDao.java similarity index 89% rename from src/main/com/deftlabs/lock/mongo/impl/LockHistoryDao.java rename to src/main/java/com/deftlabs/lock/mongo/impl/LockHistoryDao.java index f275c59..876633b 100644 --- a/src/main/com/deftlabs/lock/mongo/impl/LockHistoryDao.java +++ b/src/main/java/com/deftlabs/lock/mongo/impl/LockHistoryDao.java @@ -21,13 +21,7 @@ import com.deftlabs.lock.mongo.DistributedLockSvcOptions; // Mongo -import com.mongodb.Mongo; -import com.mongodb.DB; -import com.mongodb.DBCollection; -import com.mongodb.BasicDBObject; -import com.mongodb.WriteResult; -import com.mongodb.WriteConcern; -import com.mongodb.CommandResult; +import com.mongodb.*; import org.bson.types.ObjectId; // Java @@ -42,7 +36,7 @@ final class LockHistoryDao extends BaseDao { /** * Insert an entry. */ - static void insert( final Mongo pMongo, + static void insert( final MongoClient pMongo, final String pLockName, final DistributedLockSvcOptions pSvcOptions, final DistributedLockOptions pLockOptions, @@ -59,7 +53,7 @@ static void insert( final Mongo pMongo, /** * Insert an entry. */ - static void insert( final Mongo pMongo, + static void insert( final MongoClient pMongo, final String pLockName, final DistributedLockSvcOptions pSvcOptions, final int pInactiveLockTimeout, @@ -98,7 +92,7 @@ static void insert( final Mongo pMongo, /** * Returns the history collection. */ - private static DBCollection getDbCollection(final Mongo pMongo, + private static DBCollection getDbCollection(final MongoClient pMongo, final DistributedLockSvcOptions pSvcOptions) { return getDb(pMongo, pSvcOptions).getCollection(pSvcOptions.getHistoryCollectionName()); } @@ -106,7 +100,7 @@ private static DBCollection getDbCollection(final Mongo pMongo, * Ensure the proper indexes are on the collection. This must be called when * the service sarts. */ - static void setup(final Mongo pMongo, final DistributedLockSvcOptions pSvcOptions) { + static void setup(final MongoClient pMongo, final DistributedLockSvcOptions pSvcOptions) { } } diff --git a/src/main/com/deftlabs/lock/mongo/impl/LockHistoryDef.java b/src/main/java/com/deftlabs/lock/mongo/impl/LockHistoryDef.java similarity index 100% rename from src/main/com/deftlabs/lock/mongo/impl/LockHistoryDef.java rename to src/main/java/com/deftlabs/lock/mongo/impl/LockHistoryDef.java diff --git a/src/main/com/deftlabs/lock/mongo/impl/LockImpl.java b/src/main/java/com/deftlabs/lock/mongo/impl/LockImpl.java similarity index 95% rename from src/main/com/deftlabs/lock/mongo/impl/LockImpl.java rename to src/main/java/com/deftlabs/lock/mongo/impl/LockImpl.java index eb63fcd..1b9f7a6 100644 --- a/src/main/com/deftlabs/lock/mongo/impl/LockImpl.java +++ b/src/main/java/com/deftlabs/lock/mongo/impl/LockImpl.java @@ -23,6 +23,7 @@ // Mongo import com.mongodb.Mongo; +import com.mongodb.MongoClient; import org.bson.types.ObjectId; // Java @@ -42,7 +43,7 @@ public class LockImpl implements DistributedLock { /** * Construct the object with params. */ - LockImpl( final Mongo pMongo, + LockImpl( final MongoClient pMongo, final String pName, final DistributedLockOptions pLockOptions, final DistributedLockSvcOptions pSvcOptions) @@ -141,6 +142,7 @@ private boolean tryDistributedLock() { if (lockId == null) return false; + _locked.set(true); _lockId = lockId; return true; @@ -162,15 +164,7 @@ private boolean tryDistributedLock() { * Does not block. Returns right away if not able to lock. */ @Override public boolean tryLock() { - if (isLocked()) return false; - - final ObjectId lockId = LockDao.lock(_mongo, _name, _svcOptions, _lockOptions); - - if (lockId == null) return false; - - _locked.set(true); - _lockId = lockId; - return true; + return tryDistributedLock(); } @Override public boolean tryLock(final long pTime, final TimeUnit pTimeUnit) { @@ -227,7 +221,7 @@ synchronized void destroy() { @Override public void wakeupBlocked() { LockSupport.unpark(_waitingThreads.peek()); } private final String _name; - private final Mongo _mongo; + private final MongoClient _mongo; private final DistributedLockOptions _lockOptions; private final DistributedLockSvcOptions _svcOptions; diff --git a/src/main/com/deftlabs/lock/mongo/impl/LockState.java b/src/main/java/com/deftlabs/lock/mongo/impl/LockState.java similarity index 100% rename from src/main/com/deftlabs/lock/mongo/impl/LockState.java rename to src/main/java/com/deftlabs/lock/mongo/impl/LockState.java diff --git a/src/main/com/deftlabs/lock/mongo/impl/Monitor.java b/src/main/java/com/deftlabs/lock/mongo/impl/Monitor.java similarity index 94% rename from src/main/com/deftlabs/lock/mongo/impl/Monitor.java rename to src/main/java/com/deftlabs/lock/mongo/impl/Monitor.java index 590e146..c702d67 100644 --- a/src/main/com/deftlabs/lock/mongo/impl/Monitor.java +++ b/src/main/java/com/deftlabs/lock/mongo/impl/Monitor.java @@ -22,6 +22,7 @@ // Mongo import com.mongodb.Mongo; +import com.mongodb.MongoClient; import org.bson.types.ObjectId; // Java @@ -45,7 +46,7 @@ final class Monitor { */ static class LockHeartbeat extends MonitorThread { - LockHeartbeat(final Mongo pMongo, + LockHeartbeat(final MongoClient pMongo, final DistributedLockSvcOptions pSvcOptions, final Map pLocks) { super("Mongo-Distributed-Lock-LockHeartbeat-" + System.currentTimeMillis(), @@ -75,7 +76,7 @@ boolean monitor() throws InterruptedException { */ static class LockTimeout extends MonitorThread { - LockTimeout(final Mongo pMongo, final DistributedLockSvcOptions pSvcOptions) { + LockTimeout(final MongoClient pMongo, final DistributedLockSvcOptions pSvcOptions) { super("Mongo-Distributed-Lock-LockTimeout-" + System.currentTimeMillis(), pMongo, pSvcOptions); } @@ -92,7 +93,7 @@ boolean monitor() throws InterruptedException { */ static class LockUnlocked extends MonitorThread { - LockUnlocked(final Mongo pMongo, + LockUnlocked(final MongoClient pMongo, final DistributedLockSvcOptions pSvcOptions, final Map pLocks) { super("Mongo-Distributed-Lock-LockUnlocked-" + System.currentTimeMillis(), @@ -121,13 +122,13 @@ boolean monitor() throws InterruptedException { private static abstract class MonitorThread extends Thread { MonitorThread(final String pName, - final Mongo pMongo, + final MongoClient pMongo, final DistributedLockSvcOptions pSvcOptions) { this(pName, pMongo, pSvcOptions, null); } MonitorThread(final String pName, - final Mongo pMongo, + final MongoClient pMongo, final DistributedLockSvcOptions pSvcOptions, final Map pLocks) { super(pName); @@ -165,7 +166,7 @@ void shutdown() throws InterruptedException { } } - final Mongo _mongo; + final MongoClient _mongo; final DistributedLockSvcOptions _svcOptions; final Map _locks; final CountDownLatch _shutdown; diff --git a/src/main/com/deftlabs/lock/mongo/impl/SvcImpl.java b/src/main/java/com/deftlabs/lock/mongo/impl/SvcImpl.java similarity index 91% rename from src/main/com/deftlabs/lock/mongo/impl/SvcImpl.java rename to src/main/java/com/deftlabs/lock/mongo/impl/SvcImpl.java index ca9fae2..c2415e1 100644 --- a/src/main/com/deftlabs/lock/mongo/impl/SvcImpl.java +++ b/src/main/java/com/deftlabs/lock/mongo/impl/SvcImpl.java @@ -17,21 +17,20 @@ package com.deftlabs.lock.mongo.impl; // Lib -import com.deftlabs.lock.mongo.DistributedLock; -import com.deftlabs.lock.mongo.DistributedLockSvc; -import com.deftlabs.lock.mongo.DistributedLockOptions; -import com.deftlabs.lock.mongo.DistributedLockSvcOptions; -import com.deftlabs.lock.mongo.DistributedLockException; -// Mongo +import com.deftlabs.lock.mongo.*; import com.mongodb.Mongo; +import com.mongodb.MongoClient; +import com.mongodb.MongoClientURI; import com.mongodb.MongoURI; -// Java import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.locks.ReentrantLock; + +// Mongo +// Java /** * The distributed lock server implementation. @@ -100,7 +99,11 @@ public void startup() { _lock.lock(); try { - _mongo = new Mongo(new MongoURI(_options.getMongoUri())); + if(_options.getMongoClient() == null) { + _mongo = new MongoClient(new MongoClientURI(_options.getMongoUri())); + } else { + _mongo = _options.getMongoClient(); + } // Init the db/collection. LockDao.setup(_mongo, _options); @@ -142,7 +145,10 @@ public void shutdown() { _lockUnlocked.shutdown(); _locks.clear(); - _mongo.close(); + + if(_options.getMongoClient() == null) { + _mongo.close(); + } } catch (final Throwable t) { throw new DistributedLockException(t); } finally { _lock.unlock(); } } @@ -150,7 +156,7 @@ public void shutdown() { @Override public boolean isRunning() { return _running.get(); } - private Mongo _mongo; + private MongoClient _mongo; private final ReentrantLock _lock = new ReentrantLock(true); private final DistributedLockSvcOptions _options; diff --git a/src/main/META-INF/MANIFEST.MF b/src/main/resources/META-INF/MANIFEST.MF similarity index 100% rename from src/main/META-INF/MANIFEST.MF rename to src/main/resources/META-INF/MANIFEST.MF diff --git a/src/test/com/deftlabs/lock/mongo/DistributedLockIntTests.java b/src/test/java/com/deftlabs/lock/mongo/DistributedLockIntTest.java similarity index 94% rename from src/test/com/deftlabs/lock/mongo/DistributedLockIntTests.java rename to src/test/java/com/deftlabs/lock/mongo/DistributedLockIntTest.java index ca794d2..e22f7f3 100644 --- a/src/test/com/deftlabs/lock/mongo/DistributedLockIntTests.java +++ b/src/test/java/com/deftlabs/lock/mongo/DistributedLockIntTest.java @@ -17,25 +17,27 @@ package com.deftlabs.lock.mongo; // Mongo -import com.mongodb.Mongo; -import com.mongodb.MongoURI; + import com.mongodb.BasicDBObject; import com.mongodb.DBCollection; - -// JUnit -import org.junit.Test; -import org.junit.Before; +import com.mongodb.MongoClient; +import com.mongodb.MongoClientURI; import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import java.util.concurrent.TimeUnit; + import static org.junit.Assert.*; +// JUnit // Java -import java.util.concurrent.TimeUnit; /** * Test the distributed lock. You must be running mongo on localhost:27017 for this * test to work. */ -public final class DistributedLockIntTests { +public final class DistributedLockIntTest { @Test public void testSimpleCreate() throws Exception { @@ -106,7 +108,8 @@ public void testSimpleTimedTryLock() throws Exception { DistributedLock lock = null; try { lock = lockSvc.create("testLock"); - try { assertEquals(true, lock.tryLock(0, TimeUnit.SECONDS)); + try { + assertTrue(lock.tryLock(0, TimeUnit.SECONDS)); } finally { lock.unlock(); } } finally { if (lock != null) lockSvc.destroy(lock); } } finally { lockSvc.shutdown(); } @@ -184,11 +187,11 @@ private DBCollection getCollection() private DBCollection getHistoryCollection() { return _mongo.getDB("mongo-distributed-lock").getCollection("lockHistory"); } - public DistributedLockIntTests() throws Exception { - _mongo = new Mongo(new MongoURI("mongodb://127.0.0.1:27017")); + public DistributedLockIntTest() throws Exception { + _mongo = new MongoClient(new MongoClientURI("mongodb://127.0.0.1:27017")); } - private final Mongo _mongo; + private final MongoClient _mongo; } diff --git a/src/test/com/deftlabs/lock/mongo/DriverIntTests.java b/src/test/java/com/deftlabs/lock/mongo/DriverIntTest.java similarity index 72% rename from src/test/com/deftlabs/lock/mongo/DriverIntTests.java rename to src/test/java/com/deftlabs/lock/mongo/DriverIntTest.java index 39330e2..279202b 100644 --- a/src/test/com/deftlabs/lock/mongo/DriverIntTests.java +++ b/src/test/java/com/deftlabs/lock/mongo/DriverIntTest.java @@ -17,43 +17,30 @@ package com.deftlabs.lock.mongo; // Mongo -import com.mongodb.DB; -import com.mongodb.Mongo; -import com.mongodb.MongoURI; -import com.mongodb.BasicDBObject; -import com.mongodb.DBCollection; -import com.mongodb.WriteConcern; -import com.mongodb.WriteResult; -import com.mongodb.CommandResult; -// JUnit -import org.junit.Test; -import org.junit.Before; +import com.mongodb.*; import org.junit.After; -import static org.junit.Assert.*; +import org.junit.Before; +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +// JUnit // Java -import java.util.concurrent.TimeUnit; /** * Test assumptions about the java driver for mongo. */ -public final class DriverIntTests { +public final class DriverIntTest { @Test public void testWriteConcerns() throws Exception { final BasicDBObject doc = new BasicDBObject("_id", "test"); - getDb().requestStart(); - getCollection().insert(doc, WriteConcern.NORMAL); - - final WriteResult result = getCollection().insert(doc, WriteConcern.NORMAL); - final CommandResult cmdResult = result.getLastError(WriteConcern.NORMAL); - - assertTrue(cmdResult.getException() != null); + getCollection().insert(doc, WriteConcern.UNACKNOWLEDGED); - //System.out.println(cmdResult); - - getDb().requestDone(); + assertThatExceptionOfType(DuplicateKeyException.class) + .isThrownBy(() -> getCollection().insert(doc, WriteConcern.ACKNOWLEDGED)); } @Test public void testFindAndModify() throws Exception { @@ -65,14 +52,14 @@ public final class DriverIntTests { final BasicDBObject lockDoc = (BasicDBObject)getCollection().findAndModify(query, new BasicDBObject("_id", 1), null, false, new BasicDBObject("$set", toSet), false, false); - assertNull(lockDoc); + assertThat(lockDoc).isNull(); } @Test public void testFindAndModifyWithDoc() throws Exception { final BasicDBObject insert = new BasicDBObject("_id", "test"); insert.put("locked", false); insert.put("lockId", "10"); - getCollection().insert(insert, WriteConcern.SAFE); + getCollection().insert(insert, WriteConcern.ACKNOWLEDGED); final BasicDBObject query = new BasicDBObject("_id", "test"); @@ -85,16 +72,15 @@ public final class DriverIntTests { final BasicDBObject lockDoc = (BasicDBObject)getCollection().findAndModify(query, new BasicDBObject("lockId", 1), null, false, new BasicDBObject("$set", toSet), true, false); - assertNotNull(lockDoc); - - assertEquals("20", lockDoc.getString("lockId")); + assertThat(lockDoc).isNotNull(); + assertThat(lockDoc.getString("lockId")).isEqualTo("20"); } @Test public void testFindAndModifyWithDocMiss() throws Exception { final BasicDBObject insert = new BasicDBObject("_id", "test"); insert.put("locked", false); insert.put("lockId", "10"); - getCollection().insert(insert, WriteConcern.SAFE); + getCollection().insert(insert, WriteConcern.ACKNOWLEDGED); final BasicDBObject query = new BasicDBObject("_id", "test"); query.put("locked", false); @@ -106,7 +92,7 @@ public final class DriverIntTests { final BasicDBObject lockDoc = (BasicDBObject)getCollection().findAndModify(query, new BasicDBObject("lockId", 1), null, false, new BasicDBObject("$set", toSet), true, false); - assertNull(lockDoc); + assertThat(lockDoc).isNull(); } @@ -118,11 +104,11 @@ public final class DriverIntTests { private DB getDb() { return _mongo.getDB("mongo-distributed-lock-test"); } - public DriverIntTests() throws Exception { - _mongo = new Mongo(new MongoURI("mongodb://127.0.0.1:27017")); + public DriverIntTest() throws Exception { + _mongo = new MongoClient(new MongoClientURI("mongodb://127.0.0.1:27017")); } - private final Mongo _mongo; + private final MongoClient _mongo; } diff --git a/src/test/com/deftlabs/lock/mongo/StandaloneThreadLockTests.java b/src/test/java/com/deftlabs/lock/mongo/StandaloneThreadLockTests.java similarity index 90% rename from src/test/com/deftlabs/lock/mongo/StandaloneThreadLockTests.java rename to src/test/java/com/deftlabs/lock/mongo/StandaloneThreadLockTests.java index f40d567..ac70680 100644 --- a/src/test/com/deftlabs/lock/mongo/StandaloneThreadLockTests.java +++ b/src/test/java/com/deftlabs/lock/mongo/StandaloneThreadLockTests.java @@ -17,22 +17,17 @@ package com.deftlabs.lock.mongo; // Mongo -import com.mongodb.Mongo; -import com.mongodb.MongoURI; -import com.mongodb.BasicDBObject; -import com.mongodb.DBCollection; -// JUnit -import org.junit.Test; -import org.junit.Before; -import org.junit.After; -import static org.junit.Assert.*; +import com.mongodb.*; +import com.mongodb.client.MongoCollection; +import org.bson.Document; -// Java -import java.util.concurrent.TimeUnit; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicBoolean; +// JUnit +// Java + /** * The standalone threaded lock tests. @@ -96,7 +91,7 @@ private LockTest( final CountDownLatch pCountDownLatch, } final long execTime = System.currentTimeMillis() - startTime; - + _countDownLatch.countDown(); } @@ -112,7 +107,7 @@ private DBCollection getHistoryCollection() { return _mongo.getDB("mongo-distributed-lock").getCollection("lockHistory"); } private StandaloneThreadLockTests() throws Exception - { _mongo = new Mongo(new MongoURI("mongodb://127.0.0.1:27017")); } + { _mongo = new MongoClient(new MongoClientURI("mongodb://127.0.0.1:27017")); } private static final int THREAD_COUNT = 200; @@ -121,10 +116,9 @@ private StandaloneThreadLockTests() throws Exception public static void main(final String [] pArgs) throws Exception { final StandaloneThreadLockTests tests = new StandaloneThreadLockTests(); tests.test(); - } - private final Mongo _mongo; + private final MongoClient _mongo; } diff --git a/src/unit/com/deftlabs/lock/mongo/DistributedLockUnitTests.java b/src/unit/com/deftlabs/lock/mongo/DistributedLockUnitTests.java deleted file mode 100644 index 3d989af..0000000 --- a/src/unit/com/deftlabs/lock/mongo/DistributedLockUnitTests.java +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Copyright 2011, Deft Labs. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.deftlabs.lock.mongo; - -// JUnit -import org.junit.Test; -import org.junit.Before; -import org.junit.After; -import org.junit.BeforeClass; -import static org.junit.Assert.*; - -// Java -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.logging.LogManager; - -/** - * Test the distributed lock. - */ -public final class DistributedLockUnitTests { - - @Test - public void testPlaceholder() throws Exception { - - } - - - private static final Logger LOG = Logger.getLogger(DistributedLockUnitTests.class.getName()); -} -