You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@labs.apache.org by si...@apache.org on 2012/07/10 03:20:24 UTC
svn commit: r1359452 - in
/labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo:
InstallMongoDatabase.aj MongoGetDatabaseState.aj MongoUtils.java
QueryList.java
Author: simoneg
Date: Tue Jul 10 01:20:24 2012
New Revision: 1359452
URL: http://svn.apache.org/viewvc?rev=1359452&view=rev
Log:
Implementation of DatabaseState for mongo entities, fixed a missed cache, fixed concurrency issue when many threads starts in a short time
Added:
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoGetDatabaseState.aj
Modified:
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/InstallMongoDatabase.aj
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoUtils.java
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/QueryList.java
Modified: labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/InstallMongoDatabase.aj
URL: http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/InstallMongoDatabase.aj?rev=1359452&r1=1359451&r2=1359452&view=diff
==============================================================================
--- labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/InstallMongoDatabase.aj (original)
+++ labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/InstallMongoDatabase.aj Tue Jul 10 01:20:24 2012
@@ -13,7 +13,7 @@ import com.mongodb.MongoException;
public aspect InstallMongoDatabase {
private MongoDatabase Cycle.currentMDb = null;
- private Mongo m = null;
+ private volatile Mongo m = null;
public pointcut databaseCreation() : call(Database.new(..));
@@ -34,18 +34,22 @@ public aspect InstallMongoDatabase {
Cycle cycle = Cycle.get();
if (cycle.currentMDb == null) {
if (m == null) {
- try {
- m = new Mongo(Settings.get("mongodb.host"));
- String clientThread = Settings.get("mongodb.clientThread");
- if (clientThread != null && clientThread.equalsIgnoreCase("true")) {
- MongoDB sptmongo = new MongoDB(m);
- TransactionSecondPhaseThread spt = new TransactionSecondPhaseThread(sptmongo,Settings.get("mongodb.defaultDb"));
- Thread t = new Thread(spt);
- t.setDaemon(true);
- t.start();
+ synchronized (this) {
+ if (m == null) {
+ try {
+ m = new Mongo(Settings.get("mongodb.host"));
+ String clientThread = Settings.get("mongodb.clientThread");
+ if (clientThread != null && clientThread.equalsIgnoreCase("true")) {
+ MongoDB sptmongo = new MongoDB(m);
+ TransactionSecondPhaseThread spt = new TransactionSecondPhaseThread(sptmongo,Settings.get("mongodb.defaultDb"));
+ Thread t = new Thread(spt);
+ t.setDaemon(true);
+ t.start();
+ }
+ } catch (Exception e) {
+ throw new MagmaException(e, "Error connecting to mongo on {0}", Settings.get("mongodb.host"));
+ }
}
- } catch (Exception e) {
- throw new MagmaException(e, "Error connecting to mongo on {0}", Settings.get("mongodb.host"));
}
}
MongoDB mdb = new MongoDB(m);
Added: labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoGetDatabaseState.aj
URL: http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoGetDatabaseState.aj?rev=1359452&view=auto
==============================================================================
--- labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoGetDatabaseState.aj (added)
+++ labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoGetDatabaseState.aj Tue Jul 10 01:20:24 2012
@@ -0,0 +1,56 @@
+package org.apache.magma.database.mongo;
+
+import org.apache.magma.database.DatabaseState;
+
+public aspect MongoGetDatabaseState {
+
+ public static class MongoDBState extends DatabaseState {
+
+ private MongoEntity entity;
+
+ public MongoDBState(MongoEntity entity) {
+ this.entity = entity;
+ }
+
+ @Override
+ public boolean isFromdb() {
+ return entity.isFromDb();
+ }
+
+ @Override
+ public boolean isDetached() {
+ return false;
+ }
+
+ @Override
+ public boolean isPersisted() {
+ return entity.isOnDb();
+ }
+
+ @Override
+ public boolean isDeleted() {
+ return entity.getPart().isDeleted();
+ }
+
+ @Override
+ public boolean isUpdated() {
+ return entity.isFromDb() && !this.isDeleted();
+ }
+
+ @Override
+ public boolean isDirty() {
+ return entity.isDirty();
+ }
+
+ }
+
+ private MongoDBState MongoEntity.myDatabaseState = null;
+
+ public DatabaseState MongoEntity.getDatabaseState() {
+ if (this.myDatabaseState == null) {
+ this.myDatabaseState = new MongoDBState(this);
+ }
+ return this.myDatabaseState;
+ }
+
+}
Modified: labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoUtils.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoUtils.java?rev=1359452&r1=1359451&r2=1359452&view=diff
==============================================================================
--- labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoUtils.java (original)
+++ labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoUtils.java Tue Jul 10 01:20:24 2012
@@ -190,4 +190,20 @@ public class MongoUtils {
}
}
}
+
+ public static String extractId(Class clazz, BSONObject obj) {
+ Object val = obj.get("_id");
+ if (val == null) return null;
+ // Special case for WithDefaultId, where id is read only from the bean handler
+ if (WithDefaultId.class.isAssignableFrom(clazz)) {
+ long id = 0;
+ if (val instanceof String) {
+ id = Long.parseLong((String)val, 16);
+ } else if (!(val instanceof Long)) {
+ throw new MagmaException("Cannot convert {0} to a long for id", val);
+ }
+ return Long.toString(id);
+ }
+ return val.toString();
+ }
}
Modified: labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/QueryList.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/QueryList.java?rev=1359452&r1=1359451&r2=1359452&view=diff
==============================================================================
--- labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/QueryList.java (original)
+++ labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/QueryList.java Tue Jul 10 01:20:24 2012
@@ -8,6 +8,7 @@ import java.util.List;
import java.util.ListIterator;
import com.mongodb.DBCursor;
+import com.mongodb.DBObject;
public class QueryList<E extends MongoEntity> extends AbstractSequentialList<E> {
@@ -42,9 +43,18 @@ public class QueryList<E extends MongoEn
public E next() {
while (acpos >= loadeds.size()) {
- E ent = (E)MongoUtils.convertToObject(clazz, cursor.next());
- transaction.addEntity(ent);
- ent.setFromDb(true);
+ DBObject next = cursor.next();
+ String idstr = MongoUtils.extractId(clazz, next);
+ E ent = null;
+ if (idstr != null) {
+ ent = transaction.checkCache(clazz, idstr);
+ }
+ if (ent == null) {
+ ent = (E)MongoUtils.convertToObject(clazz, next);
+ transaction.addEntity(ent);
+ transaction.cache(clazz, idstr, ent);
+ ent.setFromDb(true);
+ }
loadeds.add(ent);
}
E ret =loadeds.get(acpos);
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@labs.apache.org
For additional commands, e-mail: commits-help@labs.apache.org