package voldemort.store.bdb.dataconversion; import java.io.File; import org.apache.log4j.Logger; import voldemort.cluster.Cluster; import voldemort.xml.ClusterMapper; import com.sleepycat.je.Cursor; import com.sleepycat.je.Database; import com.sleepycat.je.DatabaseConfig; import com.sleepycat.je.Durability; import com.sleepycat.je.Environment; import com.sleepycat.je.EnvironmentConfig; public abstract class AbstractBdbConversion { String storeName; Database srcDB; Environment srcEnv; Database dstDB; Environment dstEnv; Cluster cluster; Cursor cursor; Logger logger = Logger.getLogger(BdbConvertData.class); AbstractBdbConversion(String storeName, String clusterXmlPath, String sourceEnvPath, String destEnvPath, int logFileSize, int nodeMax) throws Exception { this.cluster = new ClusterMapper().readCluster(new File(clusterXmlPath)); this.storeName = storeName; // Configure src environment handle EnvironmentConfig envConfig = new EnvironmentConfig(); envConfig.setTransactional(true); envConfig.setAllowCreate(false); envConfig.setReadOnly(false); envConfig.setCacheSize(1024 * 1024 * 1024); DatabaseConfig dbConfig = new DatabaseConfig(); dbConfig.setTransactional(true); dbConfig.setAllowCreate(false); dbConfig.setSortedDuplicates(areDuplicatesNeededForSrc()); dbConfig.setReadOnly(true); srcEnv = new Environment(new File(sourceEnvPath), envConfig); srcDB = srcEnv.openDatabase(null, storeName, dbConfig); // Configure dest environment handle File newEnvDir = new File(destEnvPath); if(!newEnvDir.exists()) { newEnvDir.mkdirs(); } envConfig = new EnvironmentConfig(); envConfig.setTransactional(false); envConfig.setAllowCreate(true); envConfig.setReadOnly(false); envConfig.setCacheSize(1024 * 1024 * 1024); envConfig.setConfigParam(EnvironmentConfig.LOG_FILE_MAX, Long.toString(logFileSize * 1024L * 1024L)); envConfig.setDurability(Durability.COMMIT_NO_SYNC); dbConfig = new DatabaseConfig(); dbConfig.setTransactional(false); dbConfig.setAllowCreate(true); dbConfig.setSortedDuplicates(areDuplicatesNeededForDest()); dbConfig.setDeferredWrite(true); dbConfig.setNodeMaxEntries(nodeMax); dstEnv = new Environment(newEnvDir, envConfig); dstDB = dstEnv.openDatabase(null, storeName, dbConfig); } public void close() { if(cursor != null) cursor.close(); srcDB.close(); srcEnv.close(); dstDB.sync(); dstDB.close(); dstEnv.close(); } public abstract void transfer() throws Exception; public abstract boolean areDuplicatesNeededForSrc(); public abstract boolean areDuplicatesNeededForDest(); }