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:
+ *
+ * - database name: mongo-distributed-lock
+ *
- collection name: locks
+ *
+ *
+ */
+ 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());
-}
-