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