org.s1.mongodb.cluster.MongoDBOperationLog Maven / Gradle / Ivy
/*
* Copyright 2014 Grigory Pykhov
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.s1.mongodb.cluster;
import com.mongodb.*;
import org.s1.S1SystemError;
import org.s1.cluster.dds.DistributedDataSource;
import org.s1.cluster.dds.OperationLog;
import org.s1.cluster.dds.beans.MessageBean;
import org.s1.misc.Closure;
import org.s1.mongodb.MongoDBConnectionHelper;
import org.s1.mongodb.MongoDBFormat;
import org.s1.objects.Objects;
import org.s1.options.Options;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Map;
/**
* MongoDB cluster log implementation
*/
public class MongoDBOperationLog extends OperationLog {
private static final Logger LOG = LoggerFactory.getLogger(MongoDBOperationLog.class);
@Override
public void initialize() {
super.initialize();
DBCollection coll = getCollection();
coll.ensureIndex(new BasicDBObject("id",1));
coll.ensureIndex(new BasicDBObject("done",1));
LOG.info("Operation write log initialized, indexes checked");
}
@Override
public void listFrom(long id, Closure cl) {
DBCollection coll = getCollection();
DBCursor cur = coll.find(new BasicDBObject("id",new BasicDBObject("$gt",id)))
.sort(new BasicDBObject("id", 1));
while(cur.hasNext()){
DBObject o = cur.next();
Map m1 = MongoDBFormat.toMap(o);
MessageBean mb = new MessageBean();
mb.fromMap(m1);
cl.call(mb);
}
}
@Override
public void listUndone(Closure cl) {
DBCollection coll = getCollection();
DBCursor cur = coll.find(new BasicDBObject("done",false))
.sort(new BasicDBObject("id", 1));
while(cur.hasNext()){
DBObject o = cur.next();
Map m1 = MongoDBFormat.toMap(o);
MessageBean mb = new MessageBean();
mb.fromMap(m1);
cl.call(mb);
}
}
@Override
public void addToLocalLog(MessageBean m) {
DBCollection coll = getCollection();
Map m1 = m.toMap();
m1.put("done", false);
coll.insert(MongoDBFormat.fromMap(m1), WriteConcern.FSYNC_SAFE);
if(LOG.isTraceEnabled()){
LOG.trace("Node write log new record: "+m.toString(true));
}else if(LOG.isDebugEnabled()){
LOG.debug("Node write log new record: "+m.toString(false));
}
}
@Override
public void markDone(long id) {
DBCollection coll = getCollection();
coll.update(new BasicDBObject("id",id),
new BasicDBObject("$set",new BasicDBObject("done",true)),false,false, WriteConcern.FSYNC_SAFE);
if(LOG.isDebugEnabled())
LOG.debug("Node write log record #"+id+" marked as done:true");
}
@Override
public long getLastId() {
DBCollection coll = getCollection();
DBCursor cur = coll.find().sort(new BasicDBObject("id", -1)).limit(1);
DBObject o = null;
if(cur.hasNext())
o = cur.next();
if(o!=null){
return (Long)o.get("id");
}
return 0;
}
private static DBCollection coll;
private static DBCollection getCollection(){
if(coll==null) {
synchronized (MongoDBOperationLog.class){
if(coll==null){
String c = Options.getStorage().get("MongoDB", "connections.clusterLog.collection", "clusterLog");
coll = MongoDBConnectionHelper.getConnection("clusterLog").getCollection(c);
}
}
}
return coll;
}
}