package jelectrum.db.slopbucket; import jelectrum.db.DB; import jelectrum.db.DBMap; import jelectrum.db.DBMapSet; import slopbucket.Slopbucket; import jelectrum.Config; import jelectrum.EventLog; import java.io.File; import java.util.ArrayList; import java.util.TreeMap; import java.util.Map; import com.google.protobuf.ByteString; public class SlopbucketDB extends DB { private EventLog log; private TreeMap<String, Slopbucket> slops; private File dir; public SlopbucketDB(Config conf, EventLog log) throws Exception { super(conf); this.log = log; conf.require("slopbucket_path"); dir = new File(conf.get("slopbucket_path")); dir.mkdirs(); slops=new TreeMap<>(); open(); } protected DBMap openMap(String name) throws Exception { Slopbucket slop = getBucketForName(name); slop.addTrough(name); boolean comp = false; if (name.equals("block_map")) comp=true; return new SlopbucketMap(this, name, slop, comp); } protected DBMapSet openMapSet(String name) throws Exception { Slopbucket slop = getBucketForName(name); slop.addTrough(name); return new SlopbucketMapSet(this, name, slop); } protected Slopbucket getBucketForName(String name) throws Exception { synchronized(slops) { if (slops.containsKey(name)) return slops.get(name); File subfile = new File(dir, name +".slop"); Slopbucket slop = new Slopbucket(subfile, log); slops.put(name, slop); return slop; } } /*protected Slopbucket getBucketForKey(ByteString key) { int h = Math.abs(key.hashCode() % SLOP_COUNT); if (h < 0) h = 0; return slops.get(h); }*/ protected EventLog getLog() { return log;} @Override protected void dbShutdownHandler() throws Exception { log.alarm("Slopbucket: flushing"); for(Map.Entry<String, Slopbucket> me : slops.entrySet()) { String name = me.getKey(); Slopbucket bucket = me.getValue(); log.log("Slopbucket: flushing " + name); bucket.flush(true); } log.alarm("Slopbucket: Complete"); } }