From 6744446a482cb487d8e4d5c1beeca4fa55d9d3dd Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Wed, 12 Sep 2012 12:58:31 +0200 Subject: [PATCH] DATAMONGO-532 - Synchronize DB authentication. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In multithreaded environments Mongo database authentication can be triggered twice if two or more threads refer to the same db instance. This is now prevented by synchronizing calls to db.authenticate(…). --- .../data/mongodb/core/MongoDbUtils.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoDbUtils.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoDbUtils.java index 5a39a0202..dd798ff19 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoDbUtils.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoDbUtils.java @@ -109,9 +109,11 @@ public abstract class MongoDbUtils { String username = credentials.getUsername(); String password = credentials.hasPassword() ? credentials.getPassword() : null; - if (!db.authenticate(username, password == null ? null : password.toCharArray())) { - throw new CannotGetMongoDbConnectionException("Failed to authenticate to database [" + databaseName - + "], username = [" + username + "], password = [" + password + "]", databaseName, credentials); + synchronized (db) { + if (!db.authenticate(username, password == null ? null : password.toCharArray())) { + throw new CannotGetMongoDbConnectionException("Failed to authenticate to database [" + databaseName + + "], username = [" + username + "], password = [" + password + "]", databaseName, credentials); + } } } @@ -159,7 +161,7 @@ public abstract class MongoDbUtils { return false; } DbHolder dbHolder = (DbHolder) TransactionSynchronizationManager.getResource(mongo); - return (dbHolder != null && dbHolder.containsDB(db)); + return dbHolder != null && dbHolder.containsDB(db); } /**