You might be interested in refactoring BDBFS into IndexedFreenetStore and
BDBFS itself. There's a lot of code (e.g. reconstruction) that will be common
to any indexed store implementation, although you'll need to find a clever
way to do the transaction locking in the right places.
On Wednesday 09 April 2008 07:40, j16sdiz at freenetproject.org wrote:
> Author: j16sdiz
> Date: 2008-04-09 06:40:53 +0000 (Wed, 09 Apr 2008)
> New Revision: 19109
>
> Modified:
> trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java
> Log:
> remove duplicated code in BerkeleyDBFreenetStore constructors
>
>
> Modified: trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java
> ===================================================================
> --- trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java
> 2008-04-09
06:40:36 UTC (rev 19108)
> +++ trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java
> 2008-04-09
06:40:53 UTC (rev 19109)
> @@ -250,7 +250,7 @@
> * @param noCheck
> * If <code>true</code>, don't check for holes etc.
> * @param wipe
> - * If <code>true</code>, wipe the database first.
> + * If <code>true</code>, wipe and reconstruct the database.
> * @param storeShutdownHook
> * {@link SemiOrderedShutdownHook} for hooking database
shutdown
> * hook.
> @@ -267,116 +267,136 @@
> File reconstructFile, StoreCallback callback) throws
> IOException,
DatabaseException {
> logMINOR = Logger.shouldLog(Logger.MINOR, this);
> logDEBUG = Logger.shouldLog(Logger.DEBUG, this);
> +
> + this.environment = env;
> + this.name = prefix;
> + this.fixSecondaryFile = fixSecondaryFile;
> + this.maxBlocksInStore = maxChkBlocks;
> + this.reconstructFile = reconstructFile;
> this.callback = callback;
> this.collisionPossible = callback.collisionPossible();
> this.dataBlockSize = callback.dataLength();
> this.headerBlockSize = callback.headerLength();
> this.keyLength = callback.fullKeyLength();
> callback.setStore(this);
> +
> this.freeBlocks = new SortedLongSet();
> - name = prefix;
> -
> - this.maxBlocksInStore=maxChkBlocks;
> - this.reconstructFile = reconstructFile;
> -
> - environment = env;
> -
> +
> + // Delete old database(s).
> + if (wipe) {
> + System.err.println("Wiping old database for " + prefix);
> + wipeOldDatabases(environment, prefix);
> + }
> +
> // Initialize CHK database
> DatabaseConfig dbConfig = new DatabaseConfig();
> dbConfig.setAllowCreate(true);
> dbConfig.setTransactional(true);
> - if(wipe) {
> - System.err.println("Wiping old database for "+prefix);
> - wipeOldDatabases(environment, prefix);
> - }
> -
> +
> keysDB = environment.openDatabase(null,prefix+"CHK",dbConfig);
> System.err.println("Opened main database for "+prefix);
>
> - this.fixSecondaryFile = fixSecondaryFile;
> if(fixSecondaryFile.exists()) {
> fixSecondaryFile.delete();
> removeSecondaryDatabase();
> }
> -
> +
> storeBlockTupleBinding = new StoreBlockTupleBinding();
>
> // Initialize secondary CHK database sorted on accesstime
> - accessTimeDB = openSecondaryDataBase(prefix + "CHK_accessTime",
keysDB.count() == 0, false, new AccessTimeKeyCreator(
> + accessTimeDB = openSecondaryDataBase(prefix + "CHK_accessTime",
keysDB.count() == 0 || wipe, wipe, true, new AccessTimeKeyCreator(
> storeBlockTupleBinding));
> -
> +
> // Initialize other secondary database sorted on block number
> - blockNumDB = openSecondaryDataBase(prefix + "CHK_blockNum",
keysDB.count() == 0, false, new BlockNumberKeyCreator(
> + blockNumDB = openSecondaryDataBase(prefix + "CHK_blockNum",
keysDB.count() == 0 || wipe, wipe, false, new BlockNumberKeyCreator(
> storeBlockTupleBinding));
> -
> +
> // Initialize the store file
> try {
> if(!storeFile.exists())
> if(!storeFile.createNewFile())
> - throw new DatabaseException("can't
> create a new
file "+storeFile+" !");
> + throw new IOException("Can't create a
> new file " + storeFile + " !");
> storeRAF = new RandomAccessFile(storeFile,"rw");
> -
> - if(!lruFile.exists())
> +
> + if(!lruFile.exists())
> if(!lruFile.createNewFile())
> - throw new DatabaseException("can't
> create a new file "+lruFile+" !");
> + throw new IOException("Can't create a
> new file " + lruFile + " !");
> lruRAF = new RandomAccessFile(lruFile,"rw");
> -
> +
> if(keysFile != null) {
> if(!keysFile.exists())
> if(!keysFile.createNewFile())
> - throw new
> DatabaseException("can't create a new
file "+keysFile+" !");
> + throw new IOException("Can't
> create a new file " + keysFile + " !");
> keysRAF = new RandomAccessFile(keysFile,"rw");
> } else keysRAF = null;
> -
> - boolean dontCheckForHolesShrinking = false;
> -
> - long chkBlocksInDatabase =
> highestBlockNumberInDatabase();
> - blocksInStore = chkBlocksInDatabase;
> - long chkBlocksFromFile = countCHKBlocksFromFile();
> - lastRecentlyUsed = getMaxRecentlyUsed();
>
> - System.out.println("Keys in store: db
> "+chkBlocksInDatabase+"
file "+chkBlocksFromFile+" / max "+maxChkBlocks);
> -
> - if(chkBlocksInDatabase > chkBlocksFromFile) {
> - System.out.println("More keys in database than
> in store!");
> -
> - //throw new DatabaseException("More keys in
> database than in store!");
> - // FIXME reinstate if handling code doesn't work
> - // FIXME we can do a cleverer recovery: Find
> all keys whose block
number is > chkBlocksFromFile and delete them
> - }
> -
> - if(((blocksInStore == 0) && (chkBlocksFromFile != 0)) ||
> - (((blocksInStore + 10) * 1.1) <
> chkBlocksFromFile)) {
> - try {
> - close(false);
> - } catch (Throwable t) {
> - Logger.error(this, "Failed to close:
> "+t, t);
> - System.err.println("Failed to close:
> "+t);
> - t.printStackTrace();
> + if (wipe) {
> + // wipe and reconstruct
> + blocksInStore = 0;
> + lastRecentlyUsed = 0;
> +
> + reconstruct();
> +
> + blocksInStore = countCHKBlocksFromFile();
> + lastRecentlyUsed = getMaxRecentlyUsed();
> +
> + if (!noCheck)
> + maybeOfflineShrink(true);
> + } else {
> + // just open
> + boolean dontCheckForHolesShrinking = false;
> +
> + long chkBlocksInDatabase =
highestBlockNumberInDatabase();
> + blocksInStore = chkBlocksInDatabase;
> + long chkBlocksFromFile =
> countCHKBlocksFromFile();
> + lastRecentlyUsed = getMaxRecentlyUsed();
> +
> + System.out.println("Keys in store: db
> "+chkBlocksInDatabase+"
file "+chkBlocksFromFile+" / max "+maxChkBlocks);
> +
> + if(chkBlocksInDatabase > chkBlocksFromFile) {
> + System.out.println("More keys in
> database than in store!");
> +
> + //throw new DatabaseException("More
> keys in database than in store!");
> + // FIXME reinstate if handling code
> doesn't work
> + // FIXME we can do a cleverer recovery:
> Find all keys whose block
number is > chkBlocksFromFile and delete them
> }
> - throw new DatabaseException("Keys in database:
> "+blocksInStore+" but
keys in file: "+chkBlocksFromFile);
> - }
> -
> - blocksInStore = Math.max(blocksInStore,
> chkBlocksFromFile);
> - if(logMINOR) Logger.minor(this, "Keys in store:
> "+blocksInStore);
> -
> - if(!noCheck) {
> - maybeOfflineShrink(dontCheckForHolesShrinking);
> - chkBlocksFromFile = countCHKBlocksFromFile();
> +
> + if(((blocksInStore == 0) && (chkBlocksFromFile
> != 0)) ||
> + (((blocksInStore + 10) * 1.1) <
chkBlocksFromFile)) {
> + try {
> + close(false);
> + } catch (Throwable t) {
> + Logger.error(this, "Failed to
> close: "+t, t);
> + System.err.println("Failed to
> close: "+t);
> + t.printStackTrace();
> + }
> + throw new DatabaseException("Keys in
> database: "+blocksInStore+" but
keys in file: "+chkBlocksFromFile);
> + }
> +
> blocksInStore = Math.max(blocksInStore,
> chkBlocksFromFile);
> + if(logMINOR) Logger.minor(this, "Keys in store:
> "+blocksInStore);
> +
> + if(!noCheck) {
> +
> maybeOfflineShrink(dontCheckForHolesShrinking);
> + chkBlocksFromFile =
> countCHKBlocksFromFile();
> + blocksInStore = Math.max(blocksInStore,
> chkBlocksFromFile);
> + }
> }
> -
> +
> // Add shutdownhook
> storeShutdownHook.addEarlyJob(new ShutdownHook());
> } catch (DatabaseException t) {
> - System.err.println("Caught exception, closing database:
> "+t);
> + Logger.error(this, "Caught exception, closing database:
> " + prefix, t);
> + System.err.println("Caught exception, closing database:
> " + prefix + "
(" + t + ")");
> t.printStackTrace();
> - Logger.error(this, "Caught "+t, t);
> close(false);
> +
> throw t;
> } catch (IOException t) {
> - Logger.error(this, "Caught "+t, t);
> + System.err.println("Caught exception, closing database:
> " + prefix + "
(" + t + ")");
> + Logger.error(this, "Caught exception, closing database:
> " + prefix, t);
> close(false);
> +
> throw t;
> }
> }
> @@ -915,80 +935,8 @@
> private BerkeleyDBFreenetStore(Environment env, String prefix, File
storeFile, File lruFile, File keysFile,
> File fixSecondaryFile, long maxChkBlocks, boolean
> noCheck,
SemiOrderedShutdownHook storeShutdownHook,
> File reconstructFile, StoreCallback callback) throws
> DatabaseException,
IOException {
> - logMINOR = Logger.shouldLog(Logger.MINOR, this);
> - this.callback = callback;
> - this.keyLength = callback.fullKeyLength();
> - this.dataBlockSize = callback.dataLength();
> - this.headerBlockSize = callback.headerLength();
> - this.collisionPossible = callback.collisionPossible();
> - callback.setStore(this);
> - this.freeBlocks = new SortedLongSet();
> - this.maxBlocksInStore=maxChkBlocks;
> - this.environment = env;
> - this.reconstructFile = reconstructFile;
> - name = prefix;
> -
> - wipeOldDatabases(environment, prefix);
> -
> - // Delete old database(s).
> -
> - // Initialize CHK database
> - DatabaseConfig dbConfig = new DatabaseConfig();
> - dbConfig.setAllowCreate(true);
> - dbConfig.setTransactional(true);
> -
> - keysDB = environment.openDatabase(null,prefix+"CHK",dbConfig);
> -
> - if(keysDB.count() > 0)
> - throw new IllegalStateException("Wiped old store but it
> still
contains "+keysDB.count()+" keys!");
> -
> - this.fixSecondaryFile = fixSecondaryFile;
> - fixSecondaryFile.delete();
> -
> - storeBlockTupleBinding = new StoreBlockTupleBinding();
> -
> - // Initialize secondary CHK database sorted on accesstime
> - accessTimeDB = openSecondaryDataBase(prefix + "CHK_accessTime",
> true,
true, new AccessTimeKeyCreator(
> - storeBlockTupleBinding));
> -
> - // Initialize other secondary database sorted on block number
> - blockNumDB = openSecondaryDataBase(prefix + "CHK_blockNum",
> true, true,
new BlockNumberKeyCreator(
> - storeBlockTupleBinding));
> -
> - // Initialize the store file
> - if(!storeFile.exists())
> - if(!storeFile.createNewFile())
> - throw new DatabaseException("can't create a new
> file "+storeFile+" !");
> - storeRAF = new RandomAccessFile(storeFile,"rw");
> -
> - if(!lruFile.exists())
> - if(!lruFile.createNewFile())
> - throw new DatabaseException("can't create a new
> file "+lruFile+" !");
> - lruRAF = new RandomAccessFile(lruFile,"rw");
> -
> - if(keysFile != null) {
> - if(!keysFile.exists())
> - if(!keysFile.createNewFile())
> - throw new DatabaseException("can't
> create a new file "+keysFile+" !");
> - keysRAF = new RandomAccessFile(keysFile,"rw");
> - } else
> - keysRAF = null;
> -
> - blocksInStore = 0;
> -
> - lastRecentlyUsed = 0;
> -
> - reconstruct();
> -
> - blocksInStore = countCHKBlocksFromFile();
> - lastRecentlyUsed = getMaxRecentlyUsed();
> -
> - if(!noCheck) {
> - maybeOfflineShrink(true);
> - }
> -
> - // Add shutdownhook
> - storeShutdownHook.addEarlyJob(new ShutdownHook());
> + this(env, prefix, storeFile, lruFile, keysFile,
> fixSecondaryFile,
maxChkBlocks, noCheck, true,
> + storeShutdownHook, reconstructFile, callback);
> }
>
> private static void wipeOldDatabases(Environment env, String prefix) {
> @@ -1955,11 +1903,11 @@
> * @throws DatabaseException
> */
> private SecondaryDatabase openSecondaryDataBase(String dbName, boolean
create, boolean populate,
> - SecondaryKeyCreator secondaryKeyCreator) throws
> DatabaseException {
> + boolean sortedDuplicates, SecondaryKeyCreator
> secondaryKeyCreator)
throws DatabaseException {
> SecondaryDatabase db = null;
> SecondaryConfig secDbConfig = new SecondaryConfig();
> secDbConfig.setAllowCreate(create);
> - secDbConfig.setSortedDuplicates(true);
> + secDbConfig.setSortedDuplicates(sortedDuplicates);
> secDbConfig.setTransactional(true);
> secDbConfig.setAllowPopulate(populate);
> secDbConfig.setKeyCreator(secondaryKeyCreator);
>
> _______________________________________________
> cvs mailing list
> cvs at freenetproject.org
> http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs
>
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL:
<https://emu.freenetproject.org/pipermail/devl/attachments/20080409/d3441d3d/attachment.pgp>