package com.sleepycat.je.util; import java.io.File; import java.text.DecimalFormat; import com.sleepycat.je.CheckpointConfig; import com.sleepycat.je.Cursor; import com.sleepycat.je.Database; import com.sleepycat.je.DatabaseConfig; import com.sleepycat.je.DatabaseEntry; import com.sleepycat.je.DatabaseException; import com.sleepycat.je.DbInternal; import com.sleepycat.je.Environment; import com.sleepycat.je.EnvironmentConfig; import com.sleepycat.je.EnvironmentMutableConfig; import com.sleepycat.je.LockMode; import com.sleepycat.je.OperationStatus; import com.sleepycat.je.Transaction; import com.sleepycat.je.config.EnvironmentParams; import com.sleepycat.je.dbi.EnvironmentImpl; import com.sleepycat.je.utilint.CmdUtil; import de.ovgu.cide.jakutil.*; /** * DbRunAction is a debugging aid that runs one of the background activities * (cleaning, compressing, evicting, checkpointing). */ public class DbRunAction { private static final int CLEAN=1; private static final int CHECKPOINT=4; public static void main( String[] argv){ new DbRunAction_main(argv).execute(); } private static String getSecs( long start, long end){ return (end - start) / 1000 + " secs"; } private static void preload( Environment env, String dbName) throws DatabaseException { System.out.println("Preload starting"); Database db=env.openDatabase(null,dbName,null); Cursor cursor=db.openCursor(null,null); try { DatabaseEntry key=new DatabaseEntry(); DatabaseEntry data=new DatabaseEntry(); int count=0; while (cursor.getNext(key,data,LockMode.DEFAULT) == OperationStatus.SUCCESS) { count++; if ((count % 50000) == 0) { System.out.println(count + "..."); } } System.out.println("Preloaded " + count + " records"); } finally { cursor.close(); db.close(); } } private static void usage(){ System.out.println("Usage: \n " + CmdUtil.getJavaCommand(DbRunAction.class)); System.out.println(" -h <environment home> "); System.out.println(" -a <clean|compress|evict|checkpoint|removedb>"); System.out.println(" -ro (read-only - defaults to read-write)"); System.out.println(" -s <dbName> (for preloading of evict or db remove)"); } @MethodObject static class DbRunAction_main { DbRunAction_main( String[] argv){ this.argv=argv; } void execute(){ recoveryStart=0; actionStart=0; actionEnd=0; try { whichArg=0; if (argv.length == 0) { usage(); System.exit(1); } dbName=null; doAction=0; envHome="."; readOnly=false; while (whichArg < argv.length) { nextArg=argv[whichArg]; if (nextArg.equals("-h")) { whichArg++; envHome=CmdUtil.getArg(argv,whichArg); } else if (nextArg.equals("-a")) { whichArg++; action=CmdUtil.getArg(argv,whichArg); if (action.equalsIgnoreCase("clean")) { doAction=CLEAN; } else { this.hook841(); } } else if (nextArg.equals("-ro")) { readOnly=true; } else if (nextArg.equals("-s")) { dbName=argv[++whichArg]; } else { throw new IllegalArgumentException(nextArg + " is not a supported option."); } whichArg++; } envConfig=new EnvironmentConfig(); this.hook848(); this.hook847(); this.hook845(); recoveryStart=System.currentTimeMillis(); env=new Environment(new File(envHome),envConfig); forceConfig=new CheckpointConfig(); forceConfig.setForce(true); actionStart=System.currentTimeMillis(); if (doAction == CLEAN) { while (true) { nFiles=env.cleanLog(); System.out.println("Files cleaned: " + nFiles); if (nFiles == 0) { break; } } env.checkpoint(forceConfig); } this.hook840(); this.hook844(); if (doAction == CHECKPOINT) { env.checkpoint(forceConfig); } this.hook842(); this.hook838(); actionEnd=System.currentTimeMillis(); env.close(); } catch ( Exception e) { e.printStackTrace(); System.out.println(e.getMessage()); usage(); System.exit(1); } finally { f=new DecimalFormat(); f.setMaximumFractionDigits(2); recoveryDuration=actionStart - recoveryStart; System.out.println("\nrecovery time = " + f.format(recoveryDuration) + " millis "+ f.format((double)recoveryDuration / 60000)+ " minutes"); actionDuration=actionEnd - actionStart; System.out.println("action time = " + f.format(actionDuration) + " millis "+ f.format(actionDuration / 60000)+ " minutes"); } } protected String[] argv; protected long recoveryStart; protected long actionStart; protected long actionEnd; protected int whichArg; protected String dbName; protected int doAction; protected String envHome; protected boolean readOnly; protected String nextArg; protected String action; protected EnvironmentConfig envConfig; protected Environment env; protected CheckpointConfig forceConfig; protected int nFiles; protected DatabaseConfig dbConfig; protected Database db; protected DecimalFormat f; protected long recoveryDuration; protected long actionDuration; protected void hook838() throws Exception { } protected void hook839() throws Exception { usage(); System.exit(1); } protected void hook840() throws Exception { } protected void hook841() throws Exception { if (action.equalsIgnoreCase("checkpoint")) { doAction=CHECKPOINT; } else { this.hook846(); } } protected void hook842() throws Exception { } protected void hook843() throws Exception { this.hook839(); } protected void hook844() throws Exception { } protected void hook845() throws Exception { } protected void hook846() throws Exception { this.hook843(); } protected void hook847() throws Exception { } protected void hook848() throws Exception { } } }