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 2011/05/25 17:01:51 UTC
svn commit: r1127548 -
/labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/TransactionSecondPhaseThread.java
Author: simoneg
Date: Wed May 25 15:01:50 2011
New Revision: 1127548
URL: http://svn.apache.org/viewvc?rev=1127548&view=rev
Log:
Logme where a runtime exception happen during merge
Modified:
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/TransactionSecondPhaseThread.java
Modified: labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/TransactionSecondPhaseThread.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/TransactionSecondPhaseThread.java?rev=1127548&r1=1127547&r2=1127548&view=diff
==============================================================================
--- labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/TransactionSecondPhaseThread.java (original)
+++ labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/TransactionSecondPhaseThread.java Wed May 25 15:01:50 2011
@@ -11,6 +11,7 @@ import java.util.SortedSet;
import java.util.TreeSet;
import org.apache.commons.beanutils.converters.StringArrayConverter;
+import org.apache.magma.basics.MagmaException;
import org.bson.BSONObject;
import com.mongodb.BasicDBList;
@@ -406,93 +407,95 @@ public class TransactionSecondPhaseThrea
public boolean mergeTransactions(DBObject entdoc, String colldb, String collname, String entid) {
String logid = colldb+":"+collname+":"+entid;
-
- Object entTrObj = entdoc.get("__transactions");
- if (entTrObj == null) {
- logger.warning(logid, "entity has no transactions, probably it has already been committed");
- return true;
- }
- if (!(entTrObj instanceof List)) {
- logger.error(logid,"transactions are not a list !?? Nothing we can do anyway");
- return true;
- }
- List entTr = (List) entTrObj;
- List<TransactionPart> parts = new ArrayList<TransactionPart>();
- for (Object entTrPartObj : entTr) {
- if (!(entTrPartObj instanceof BSONObject)) {
- logger.error(logid,"there is a part which is not a BSONObject!? Nothing we can do anyway");
- continue;
+ try {
+ Object entTrObj = entdoc.get("__transactions");
+ if (entTrObj == null) {
+ logger.warning(logid, "entity has no transactions, probably it has already been committed");
+ return true;
+ }
+ if (!(entTrObj instanceof List)) {
+ logger.error(logid,"transactions are not a list !?? Nothing we can do anyway");
+ return true;
+ }
+ List entTr = (List) entTrObj;
+ List<TransactionPart> parts = new ArrayList<TransactionPart>();
+ for (Object entTrPartObj : entTr) {
+ if (!(entTrPartObj instanceof BSONObject)) {
+ logger.error(logid,"there is a part which is not a BSONObject!? Nothing we can do anyway");
+ continue;
+ }
+ TransactionPart entTrPart = new TransactionPart((BSONObject)entTrPartObj);
+ parts.add(entTrPart);
}
- TransactionPart entTrPart = new TransactionPart((BSONObject)entTrPartObj);
- parts.add(entTrPart);
- }
- Collections.sort(parts);
-
-
- boolean deleted = false;
- boolean runningfound = false;
- List<String> dones = new ArrayList<String>();
- for (TransactionPart part: parts) {
- if (part.isDeleted()) {
- deleted = true;
- break;
- }
- TransactionState ts = loadTransaction(part.getTransactionId());
- if (ts.isDone() || ts.isMissing()) {
- if (!runningfound) {
- if (ts.isMissing()) {
- logger.warning(logid,"refers to the missing transaction " + ts.getId() + ", considering it as done");
+ Collections.sort(parts);
+
+
+ boolean deleted = false;
+ boolean runningfound = false;
+ List<String> dones = new ArrayList<String>();
+ for (TransactionPart part: parts) {
+ if (part.isDeleted()) {
+ deleted = true;
+ break;
+ }
+ TransactionState ts = loadTransaction(part.getTransactionId());
+ if (ts.isDone() || ts.isMissing()) {
+ if (!runningfound) {
+ if (ts.isMissing()) {
+ logger.warning(logid,"refers to the missing transaction " + ts.getId() + ", considering it as done");
+ }
+ part.reapply(entdoc);
+ dones.add(ts.getId());
}
- part.reapply(entdoc);
- dones.add(ts.getId());
+ } else if (ts.isFailed()) {
+ // We consider it done so that it is removed
+ dones.add(ts.getId());
+ } else if (ts.isRunning()) {
+ runningfound = true;
}
- } else if (ts.isFailed()) {
- // We consider it done so that it is removed
- dones.add(ts.getId());
- } else if (ts.isRunning()) {
- runningfound = true;
}
- }
-
- BasicDBObject entsearch = new BasicDBObject();
- entsearch.put("_id", entdoc.get("_id"));
- int version = (Integer) MongoUtils.convertFromMongo(entdoc.get("version"), Integer.TYPE);
- entsearch.put("version", version);
- entdoc.put("version", version + 1);
-
- WriteResult result = null;
- MongoCollection entcoll = db.getCollection(colldb, collname);
- if (deleted) {
- result = entcoll.remove(entsearch, concern);
- if (result.getError() != null) {
- logger.error(logid, "Error " + (deleted ? "deleting":"updating") + " : " + result.getError());
- return false;
- } else if (result.getN() == 0) {
- logger.entitiesSkip++;
- // If we were deleting, we can safely ignore this, maybe someone else deleted it
- return deleted;
+
+ BasicDBObject entsearch = new BasicDBObject();
+ entsearch.put("_id", entdoc.get("_id"));
+ int version = (Integer) MongoUtils.convertFromMongo(entdoc.get("version"), Integer.TYPE);
+ entsearch.put("version", version);
+ entdoc.put("version", version + 1);
+
+ WriteResult result = null;
+ MongoCollection entcoll = db.getCollection(colldb, collname);
+ if (deleted) {
+ result = entcoll.remove(entsearch, concern);
+ if (result.getError() != null) {
+ logger.error(logid, "Error " + (deleted ? "deleting":"updating") + " : " + result.getError());
+ return false;
+ } else if (result.getN() == 0) {
+ logger.entitiesSkip++;
+ // If we were deleting, we can safely ignore this, maybe someone else deleted it
+ return deleted;
+ } else {
+ logger.entitiesDone++;
+ }
} else {
+ // Remove done transaction parts
+ for (Iterator iterator = entTr.iterator(); iterator.hasNext();) {
+ Object entTrPartObj = (Object) iterator.next();
+ if (!(entTrPartObj instanceof BSONObject)) continue;
+ BSONObject entTrPartDoc = (BSONObject)entTrPartObj;
+ String entTrPartTrId = (String) entTrPartDoc.get("__transactionId");
+ if (dones.contains(entTrPartTrId))
+ iterator.remove();
+ }
+
+ // Using normal write concern here .. if it fails for some reason, it will eventually be made consistent again upon read
+ // FIXME does this make sense? It seems to provide no serious improvement
+ result = entcoll.update(entsearch, entdoc, false, false, WriteConcern.NORMAL);
logger.entitiesDone++;
- }
- } else {
- // Remove done transaction parts
- for (Iterator iterator = entTr.iterator(); iterator.hasNext();) {
- Object entTrPartObj = (Object) iterator.next();
- if (!(entTrPartObj instanceof BSONObject)) continue;
- BSONObject entTrPartDoc = (BSONObject)entTrPartObj;
- String entTrPartTrId = (String) entTrPartDoc.get("__transactionId");
- if (dones.contains(entTrPartTrId))
- iterator.remove();
}
- // Using normal write concern here .. if it fails for some reason, it will eventually be made consistent again upon read
- // FIXME does this make sense? It seems to provide no serious improvement
- result = entcoll.update(entsearch, entdoc, false, false, WriteConcern.NORMAL);
- logger.entitiesDone++;
+ return true;
+ } catch (RuntimeException e) {
+ throw new MagmaException(e, "On " + logid);
}
-
- return true;
-
}
public static void main(String[] args) throws Exception {
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@labs.apache.org
For additional commands, e-mail: commits-help@labs.apache.org