Search in sources :

Example 1 with IdSetIterator

use of de.fhg.igd.mongomvcc.helper.IdSetIterator in project mongomvcc by igd-geo.

the class MongoDBVBranch method commit.

@Override
public long commit() {
    Index idx = getIndex();
    // clone dirty objects because we clear them below
    Map<String, IdMap> dos = new HashMap<String, IdMap>(idx.getDirtyObjects());
    Commit head = getHeadCommit();
    Commit c = new Commit(_db.getCounter().getNextId(), head.getCID(), _rootCid, dos);
    _tree.addCommit(c);
    updateHead(c);
    // mark deleted objects as deleted in the database
    DB db = _db.getDB();
    String lifetimeAttr = MongoDBConstants.LIFETIME + "." + getRootCid();
    for (Map.Entry<String, IdSet> e : idx.getDeletedOids().entrySet()) {
        DBCollection dbc = db.getCollection(e.getKey());
        IdSetIterator li = e.getValue().iterator();
        while (li.hasNext()) {
            long oid = li.next();
            // save the CID of the commit where the object has been deleted
            dbc.update(new BasicDBObject(MongoDBConstants.ID, oid), new BasicDBObject("$set", new BasicDBObject(lifetimeAttr, head.getCID())));
        }
    }
    // mark dirty objects as inserted
    String instimeAttr = MongoDBConstants.LIFETIME + ".i" + getRootCid();
    for (Map.Entry<String, IdMap> e : dos.entrySet()) {
        DBCollection dbc = db.getCollection(e.getKey());
        IdMap m = e.getValue();
        IdMapIterator li = m.iterator();
        while (li.hasNext()) {
            li.advance();
            long oid = li.value();
            if (oid == -1) {
                // do not save time of insertion
                continue;
            }
            // save the CID of the commit where the object has been inserted
            dbc.update(new BasicDBObject(MongoDBConstants.ID, oid), new BasicDBObject("$set", new BasicDBObject(instimeAttr, head.getCID())));
        }
    }
    // reset index
    idx.clearDirtyObjects();
    // update named branch's head
    if (_name != null) {
        // and then update it
        synchronized (this) {
            // check for conflicts (i.e. if another thread has already updated the branch's head)
            if (_tree.resolveBranch(_name).getCID() != c.getParentCID()) {
                throw new VException("Branch " + _name + " has already been " + "updated by another commit");
            }
            _tree.updateBranchHead(_name, c.getCID());
        }
    }
    return c.getCID();
}
Also used : HashMap(java.util.HashMap) IdMapIterator(de.fhg.igd.mongomvcc.helper.IdMapIterator) Index(de.fhg.igd.mongomvcc.impl.internal.Index) IdSetIterator(de.fhg.igd.mongomvcc.helper.IdSetIterator) DBCollection(com.mongodb.DBCollection) BasicDBObject(com.mongodb.BasicDBObject) IdMap(de.fhg.igd.mongomvcc.helper.IdMap) Commit(de.fhg.igd.mongomvcc.impl.internal.Commit) IdSet(de.fhg.igd.mongomvcc.helper.IdSet) VException(de.fhg.igd.mongomvcc.VException) HashMap(java.util.HashMap) IdMap(de.fhg.igd.mongomvcc.helper.IdMap) Map(java.util.Map) DB(com.mongodb.DB)

Aggregations

BasicDBObject (com.mongodb.BasicDBObject)1 DB (com.mongodb.DB)1 DBCollection (com.mongodb.DBCollection)1 VException (de.fhg.igd.mongomvcc.VException)1 IdMap (de.fhg.igd.mongomvcc.helper.IdMap)1 IdMapIterator (de.fhg.igd.mongomvcc.helper.IdMapIterator)1 IdSet (de.fhg.igd.mongomvcc.helper.IdSet)1 IdSetIterator (de.fhg.igd.mongomvcc.helper.IdSetIterator)1 Commit (de.fhg.igd.mongomvcc.impl.internal.Commit)1 Index (de.fhg.igd.mongomvcc.impl.internal.Index)1 HashMap (java.util.HashMap)1 Map (java.util.Map)1