package org.yamcs.cli; import java.util.ArrayList; import java.util.List; import org.rocksdb.ColumnFamilyDescriptor; import org.rocksdb.ColumnFamilyHandle; import org.rocksdb.ColumnFamilyOptions; import org.rocksdb.CompactionStyle; import org.rocksdb.DBOptions; import org.rocksdb.Options; import org.rocksdb.RocksDB; import org.yamcs.yarch.rocksdb.YRDB; import com.beust.jcommander.Parameter; import com.beust.jcommander.Parameters; /** * Command line utility for doing rocksdb operations * * * @author nm * */ @Parameters(commandDescription = "Provides low-level RocksDB data operations") public class RocksDbCli extends Command { public RocksDbCli(YamcsCli yamcsCli) { super("rocksdb", yamcsCli); addSubCommand(new RocksdbCompact()); } @Override public void execute() throws Exception { RocksDB.loadLibrary(); super.execute(); } @Parameters(commandDescription = "Compact rocksdb database") private class RocksdbCompact extends Command { @Parameter(names="--dbDir", description="database directory", required=true) String dbDir; @Parameter(names="--sizeMB", description="target size of each SST files in MB (by default 256 MB)", required=false) int sizeMB = 256; public RocksdbCompact() { super("compact", RocksDbCli.this); } @Override void execute() throws Exception { Options opt = new Options(); List<byte[]> cfl = RocksDB.listColumnFamilies(opt, dbDir); List<ColumnFamilyDescriptor> cfdList = new ArrayList<>(cfl.size()); ColumnFamilyOptions cfoptions = new ColumnFamilyOptions(); cfoptions.setCompactionStyle(CompactionStyle.UNIVERSAL); cfoptions.setTargetFileSizeBase(1024L*1024*sizeMB); for(byte[] b: cfl) { cfdList.add(new ColumnFamilyDescriptor(b, cfoptions)); } List<ColumnFamilyHandle> cfhList = new ArrayList<>(cfl.size()); DBOptions dbOptions = new DBOptions(); RocksDB db = RocksDB.open(dbOptions, dbDir, cfdList, cfhList); for(int i=0;i<cfhList.size(); i++) { ColumnFamilyHandle cfh = cfhList.get(i); console.println("Compacting Column Family "+YRDB.cfNameToString(cfl.get(i))); db.compactRange(cfh); } db.close(); dbOptions.close(); cfoptions.close(); opt.close(); } } }