On Fri, Aug 1, 2008 at 6:33 PM, Matthew Toseland <toad at amphibian.dyndns.org> wrote: > On Friday 01 August 2008 03:10, Daniel Cheng wrote: >> On Fri, Aug 1, 2008 at 7:08 AM, Matthew Toseland >> <toad at amphibian.dyndns.org> wrote: >> > It looks like you no longer use a scratch file for resizing...? >> >> no longer used. >> it's just too slow and don't give many help. > > You lose an equal number of blocks with and without one?
lose a little bit lesser with it, but it's more then 2x slower and affect normal operation -- too heavy to do it online. >> >> > >> > On Wednesday 09 July 2008 09:42, j16sdiz at freenetproject.org wrote: >> >> Author: j16sdiz >> >> Date: 2008-07-09 08:42:42 +0000 (Wed, 09 Jul 2008) >> >> New Revision: 21007 >> >> >> >> Modified: >> >> >> > > branches/saltedhashstore/freenet/src/freenet/store/saltedhash/SaltedHashFreenetStore.java >> >> Log: >> >> fix cleaner >> >> >> >> Modified: >> > > branches/saltedhashstore/freenet/src/freenet/store/saltedhash/SaltedHashFreenetStore.java >> >> =================================================================== >> >> --- >> > > branches/saltedhashstore/freenet/src/freenet/store/saltedhash/SaltedHashFreenetStore.java >> > 2008-07-09 08:42:19 UTC (rev 21006) >> >> +++ >> > > branches/saltedhashstore/freenet/src/freenet/store/saltedhash/SaltedHashFreenetStore.java >> > 2008-07-09 08:42:42 UTC (rev 21007) >> >> @@ -463,6 +463,9 @@ >> >> private ByteBuffer toHeaderBuffer() { >> >> assert isEncrypted; // should have encrypted to get > dataEncryptIV in >> > control buffer >> >> >> >> + if (header == null) >> >> + return null; >> >> + >> >> ByteBuffer out = > ByteBuffer.allocate(headerBlockLength); >> >> out.put(header); >> >> assert out.remaining() == 0; >> >> @@ -474,6 +477,9 @@ >> >> private ByteBuffer toDataBuffer() { >> >> assert isEncrypted; // should have encrypted to get > dataEncryptIV in >> > control buffer >> >> >> >> + if (data == null) >> >> + return null; >> >> + >> >> ByteBuffer out = > ByteBuffer.allocate(dataBlockLength); >> >> out.put(data); >> >> assert out.remaining() == 0; >> >> @@ -822,12 +828,9 @@ >> >> cleanerLock.lock(); >> >> try { >> >> long _prevStoreSize; >> >> - boolean _rebuildBloom; >> >> - >> >> configLock.readLock().lock(); >> >> try { >> >> _prevStoreSize = > prevStoreSize; >> >> - _rebuildBloom = ((flags & > FLAG_REBUILD_BLOOM) != 0); >> >> } finally { >> >> > configLock.readLock().unlock(); >> >> } >> >> @@ -840,6 +843,13 @@ >> >> } >> >> } >> >> >> >> + boolean _rebuildBloom; >> >> + configLock.readLock().lock(); >> >> + try { >> >> + _rebuildBloom = ((flags & > FLAG_REBUILD_BLOOM) != 0); >> >> + } finally { >> >> + > configLock.readLock().unlock(); >> >> + } >> >> if (_rebuildBloom && prevStoreSize > == 0 && >> > cleanerGlobalLock.tryLock()) { >> >> try { >> >> rebuildBloom(); >> >> @@ -873,9 +883,6 @@ >> >> * Move old entries to new location and resize store >> >> */ >> >> private void resizeStore(long _prevStoreSize) { >> >> - if (true) // temporary disabled >> >> - return; >> >> - >> >> Logger.normal(this, "Starting datastore resize"); >> >> long startTime = System.currentTimeMillis(); >> >> >> >> @@ -904,20 +911,34 @@ >> >> >> >> batchProcessEntries(curOffset, > RESIZE_MEMORY_ENTRIES, new >> > BatchProcessor() { >> >> public Entry process(Entry entry) { >> >> + if (entry.generation != > generation) { >> >> entry.generation = > generation; >> >> keyCount.incrementAndGet(); >> >> + } >> >> >> >> - if (entry.storeSize == > storeSize) {// new size >> >> + if (entry.storeSize == > storeSize) { >> >> + // new size, don't > have to relocate >> >> + if > (entry.generation != generation) { >> >> + // update > filter >> >> > bloomFilter.updateFilter(entry.getDigestedRoutingKey()); >> >> - >> >> return entry; >> >> + } else { >> >> + return > NOT_MODIFIED; >> >> + } >> >> } >> >> >> >> + // remove from store, > prepare for relocation >> >> + try { >> >> + > entry.setData(readHeader(entry.curOffset), >> > readData(entry.curOffset)); >> >> oldEntryList.add(entry); >> >> + } catch (IOException e) { >> >> + > Logger.error(this, "error reading entry (offset=" + entry.curOffset >> > + ")", e); >> >> + } >> >> return null; >> >> } >> >> }); >> >> >> >> + // shrink data file to current size >> >> if (storeSize < _prevStoreSize) >> >> > setStoreFileSize(Math.max(storeSize, curOffset)); >> >> >> >> @@ -952,9 +973,6 @@ >> >> * Rebuild bloom filter >> >> */ >> >> private void rebuildBloom() { >> >> - if (true) // temporary disabled >> >> - return; >> >> - >> >> if (bloomFilter == null) >> >> return; >> >> >> >> @@ -1022,12 +1040,6 @@ >> >> * otherwise (e.g. can't acquire locks, node > shutting down) >> >> */ >> >> private boolean batchProcessEntries(long offset, int > length, >> > BatchProcessor processor) { >> >> - return false; >> >> - >> >> - /*- temporary disabled >> >> - assert offset % FILE_SPLIT == 0; >> >> - assert length % FILE_SPLIT == 0; >> >> - >> >> boolean[] locked = new boolean[length]; >> >> try { >> >> // acquire all locks in the region, will > unlock in the finally block >> >> @@ -1038,17 +1050,15 @@ >> >> return false; >> >> } >> >> >> >> - long startFileOffset = (offset / > FILE_SPLIT) * entryTotalLength; >> >> - long entriesToRead = length / FILE_SPLIT; >> >> - long bufLen = entryTotalLength * > entriesToRead; >> >> + long startFileOffset = offset * > Entry.METADATA_LENGTH; >> >> + long entriesToRead = length; >> >> + long bufLen = Entry.METADATA_LENGTH * > entriesToRead; >> >> >> >> ByteBuffer buf = ByteBuffer.allocate((int) > bufLen); >> >> - for (int i = 0; i < FILE_SPLIT; i++) { // > for each split file >> >> boolean dirty = false; >> >> - buf.clear(); >> >> try { >> >> while (buf.hasRemaining()) > { >> >> - int status = > storeFC[i].read(buf, startFileOffset + buf.position()); >> >> + int status = > metaFC.read(buf, startFileOffset + buf.position()); >> >> if (status == -1) >> >> break; >> >> } >> >> @@ -1060,35 +1070,36 @@ >> >> buf.flip(); >> >> >> >> try { >> >> - for (int j = 0; buf.limit() >>= j * entryTotalLength; j++) { >> >> - if (shutdown) >> >> - return > false; >> >> - >> >> - buf.position((int) > (j * entryTotalLength)); >> >> - if (buf.remaining() > < entryTotalLength) // EOF >> >> + for (int j = 0; !shutdown && > buf.limit() > j * Entry.METADATA_LENGTH; >> > j++) { >> >> + buf.position(j * > Entry.METADATA_LENGTH); >> >> + if (buf.remaining() < > Entry.METADATA_LENGTH) // EOF >> >> break; >> >> >> >> ByteBuffer enBuf = > buf.slice(); >> >> - enBuf.limit((int) > entryTotalLength); >> >> + > enBuf.limit(Entry.METADATA_LENGTH); >> >> >> >> - Entry entry = new > Entry(enBuf, SaltedHashFreenetStore.this); >> >> - entry.curOffset = > offset + j * FILE_SPLIT + i; >> >> + Entry entry = new > Entry(enBuf, null, null); >> >> + entry.curOffset = offset + > j; >> >> >> >> if (entry.isFree()) >> >> > continue; // not occupied >> >> >> >> Entry newEntry = > processor.process(entry); >> >> if (newEntry == > null) {// free the offset >> >> - > buf.position((int) (j * entryTotalLength)); >> >> - > buf.put(ByteBuffer.allocate((int) entryTotalLength)); >> >> + buf.position(j * > Entry.METADATA_LENGTH); >> >> + > buf.put(ByteBuffer.allocate(Entry.METADATA_LENGTH)); >> >> > keyCount.decrementAndGet(); >> >> >> >> dirty = > true; >> >> } else if (newEntry > == NOT_MODIFIED) { >> >> } else { >> >> // write > back >> >> - > buf.position((int) (j * entryTotalLength)); >> >> - > buf.put(newEntry.toByteBuffer(SaltedHashFreenetStore.this)); >> >> + buf.position(j * > Entry.METADATA_LENGTH); >> >> + > buf.put(newEntry.toMetaDataBuffer()); >> >> + >> >> + assert > newEntry.header == null; // not supported >> >> + assert > newEntry.data == null; // not supported >> >> + >> >> dirty = > true; >> >> } >> >> } >> >> @@ -1099,14 +1110,13 @@ >> >> >> >> try { >> >> while > (buf.hasRemaining()) { >> >> - > storeFC[i].write(buf, startFileOffset + buf.position()); >> >> + > metaFC.write(buf, startFileOffset + buf.position()); >> >> } >> >> } catch > (IOException ioe) { >> >> > Logger.error(this, "unexpected IOException", ioe); >> >> } >> >> } >> >> } >> >> - } >> >> >> >> return true; >> >> } finally { >> >> @@ -1115,7 +1125,6 @@ >> >> if (locked[i]) >> >> > lockManager.unlockEntry(offset + i); >> >> } >> >> - */ >> >> } >> >> >> >> /** >> >> >> >> _______________________________________________ >> >> cvs mailing list >> >> cvs at freenetproject.org >> >> http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs >> >> >> >> >> > >> > _______________________________________________ >> > Devl mailing list >> > Devl at freenetproject.org >> > http://emu.freenetproject.org/cgi-bin/mailman/listinfo/devl >> > >> _______________________________________________ >> Devl mailing list >> Devl at freenetproject.org >> http://emu.freenetproject.org/cgi-bin/mailman/listinfo/devl >> >> > > _______________________________________________ > Devl mailing list > Devl at freenetproject.org > http://emu.freenetproject.org/cgi-bin/mailman/listinfo/devl >