Changeset 9a63be8


Ignore:
Timestamp:
Jan 9, 2011 1:03:05 AM (9 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
fd4e4fbc
Parents:
212c87f
Message:
  • NetDB: Don't rescan netDb directory unless changed,

to reduce Hash cache thrash (backport from test4)

Location:
router/java/src/net/i2p/router/networkdb/kademlia
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java

    r212c87f r9a63be8  
    248248       
    249249        _kb = new KBucketSet(_context, ri.getIdentity().getHash());
    250         _ds = new PersistentDataStore(_context, dbDir, this);
     250        try {
     251            _ds = new PersistentDataStore(_context, dbDir, this);
     252        } catch (IOException ioe) {
     253            throw new RuntimeException("Unable to initialize netdb storage", ioe);
     254        }
    251255        //_ds = new TransientDataStore();
    252256//        _exploreKeys = new HashSet(64);
  • router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java

    r212c87f r9a63be8  
    4040 */
    4141class PersistentDataStore extends TransientDataStore {
    42     private Log _log;
    43     private String _dbDir;
    44     private KademliaNetworkDatabaseFacade _facade;
    45     private Writer _writer;
    46     private ReadJob _readJob;
     42    private final Log _log;
     43    private final File _dbDir;
     44    private final KademliaNetworkDatabaseFacade _facade;
     45    private final Writer _writer;
     46    private final ReadJob _readJob;
    4747    private boolean _initialized;
    4848   
    4949    private final static int READ_DELAY = 60*1000;
    5050   
    51     public PersistentDataStore(RouterContext ctx, String dbDir, KademliaNetworkDatabaseFacade facade) {
     51    /**
     52     *  @param dbDir relative path
     53     */
     54    public PersistentDataStore(RouterContext ctx, String dbDir, KademliaNetworkDatabaseFacade facade) throws IOException {
    5255        super(ctx);
    5356        _log = ctx.logManager().getLog(PersistentDataStore.class);
    54         _dbDir = dbDir;
     57        _dbDir = getDbDir(dbDir);
    5558        _facade = facade;
    5659        _readJob = new ReadJob();
     
    8083    public void restart() {
    8184        super.restart();
    82         _dbDir = _facade.getDbDir();
    8385    }
    8486   
     
    161163                _log.info("Removing key " + _key /* , getAddedBy() */);
    162164            try {
    163                 File dbDir = getDbDir();
    164                 removeFile(_key, dbDir);
     165                removeFile(_key, _dbDir);
    165166            } catch (IOException ioe) {
    166167                _log.error("Error removing key " + _key, ioe);
     
    237238                if (key != null) {
    238239                    if (data != null) {
    239                         write(key, data);
     240                        // synch with the reader job
     241                        synchronized (_dbDir) {
     242                            write(key, data);
     243                        }
    240244                        data = null;
    241245                    }
     
    279283        try {
    280284            String filename = null;
    281             File dbDir = getDbDir();
    282285
    283286            if (data instanceof LeaseSet)
     
    288291                throw new IOException("We don't know how to write objects of type " + data.getClass().getName());
    289292
    290             dbFile = new File(dbDir, filename);
     293            dbFile = new File(_dbDir, filename);
    291294            long dataPublishDate = getPublishDate(data);
    292295            if (dbFile.lastModified() < dataPublishDate) {
     
    327330    private class ReadJob extends JobImpl {
    328331        private boolean _alreadyWarned;
     332        private long _lastModified;
     333
    329334        public ReadJob() {
    330335            super(PersistentDataStore.this._context);
    331336            _alreadyWarned = false;
    332337        }
     338
    333339        public String getName() { return "DB Read Job"; }
     340
    334341        public void runJob() {
    335             _log.info("Rereading new files");
    336             readFiles();
     342            // check directory mod time to save a lot of object churn in scanning all the file names
     343            long lastMod = _dbDir.lastModified();
     344            if (lastMod > _lastModified) {
     345                _lastModified = lastMod;
     346                _log.info("Rereading new files");
     347                // synch with the writer job
     348                synchronized (_dbDir) {
     349                    readFiles();
     350                }
     351            }
    337352            requeue(READ_DELAY);
    338353        }
     
    344359        private void readFiles() {
    345360            int routerCount = 0;
    346             try {
    347                 File dbDir = getDbDir();
    348                 File routerInfoFiles[] = dbDir.listFiles(RouterInfoFilter.getInstance());
     361
     362                File routerInfoFiles[] = _dbDir.listFiles(RouterInfoFilter.getInstance());
    349363                if (routerInfoFiles != null) {
    350364                    routerCount += routerInfoFiles.length;
     
    361375                    }
    362376                }
    363             } catch (IOException ioe) {
    364                 _log.error("Error reading files in the db dir", ioe);
    365             }
    366377           
    367378            if (!_alreadyWarned) {
     
    443454   
    444455   
    445     private File getDbDir() throws IOException {
    446         File f = new SecureDirectory(_context.getRouterDir(), _dbDir);
     456    private File getDbDir(String dbDir) throws IOException {
     457        File f = new SecureDirectory(_context.getRouterDir(), dbDir);
    447458        if (!f.exists()) {
    448459            boolean created = f.mkdirs();
Note: See TracChangeset for help on using the changeset viewer.