package com.lodh.arte.test.robustmongo; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; import org.junit.Test; import com.mongodb.BasicDBObject; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.DBObject; import com.mongodb.Mongo; import com.mongodb.MongoOptions; import com.mongodb.ReadPreference; import com.mongodb.ServerAddress; import com.mongodb.WriteConcern; public class ReproducerPrimaryPreferredSystemTest { private static final Logger log = Logger.getLogger(ReproducerPrimaryPreferredSystemTest.class); Mongo createMongo12() throws UnknownHostException { List addresses = new ArrayList(); addresses.add(new ServerAddress("mongo1", 13365)); addresses.add(new ServerAddress("mongo2", 13365)); MongoOptions options = new MongoOptions(); options.connectionsPerHost = 100; options.socketKeepAlive = true; options.socketTimeout = 60000; Mongo mongo = new Mongo(addresses, options); mongo.setReadPreference(ReadPreference.primaryPreferred()); return mongo; } @Test public void writeSecondary() throws Exception { Mongo mongo = createMongo12(); DB db = mongo.getDB("mytest"); DBCollection coll = db.getCollection("mycoll"); BasicDBObject dbObject = new BasicDBObject(); dbObject.put("MYID", "myid"); dbObject.put("MYVALUE", "myvalue"); coll.update(dbObject, dbObject, true, false, WriteConcern.JOURNAL_SAFE); mongo.close(); } @SuppressWarnings("unused") @Test public void readSec2() throws Exception { Mongo mongo = createMongo12(); mongo.setReadPreference(ReadPreference.primaryPreferred()); long startMillis = System.currentTimeMillis(); long lastMillis = startMillis; DBCollection coll1 = mongo.getDB("mytest").getCollection("mycoll"); // coll1.insert( new BasicDBObject() ); long runTime = 40000; int finds = 1; // run for x seconds; runtime while (System.currentTimeMillis() - startMillis < runTime) { lastMillis = System.currentTimeMillis(); DBObject dbobj = coll1.findOne(); // System.out.println(dbobj); finds++; System.out.println("last time: " + (System.currentTimeMillis() - lastMillis) + " ms"); Thread.sleep(500); } System.out.println("ran for " + (System.currentTimeMillis() - startMillis) + " ms and found " + finds + " with 500ms pauses"); } @Test public void readSecondary() throws Exception { log.info("major=" + Mongo.getMajorVersion() + " minor=" + Mongo.getMinorVersion()); Mongo mongo = createMongo12(); DB db = mongo.getDB("mytest"); DBCollection coll = db.getCollection("mycoll"); int errors = 0; for (int i = 0; i < 120; i++) { try { log.info("before test status: " + mongo.getReplicaSetStatus()); long start = System.currentTimeMillis(); BasicDBObject criteria = new BasicDBObject("MYID", "myid"); DBObject dbObj = coll.findOne(criteria); log.info("read my value = " + dbObj.get("MYVALUE") + " in " + (System.currentTimeMillis() - start) + " ms"); Thread.sleep(1000); } catch (Exception e) { log.warn("unable to read object; status = " + mongo.getReplicaSetStatus(), e); errors++; } } log.info("errors = " + errors); mongo.close(); } }