Author: toad Date: 2008-11-03 22:32:53 +0000 (Mon, 03 Nov 2008) New Revision: 23300
Modified: branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSegment.java Log: YET ANOTHER HORRIBLE DB4O BUG! I HAVE PROOF! Have a workaround, but *I am not going to take this logging out!*. It might cause chaos in other places... http://tracker.db4o.com/browse/COR-1447 Modified: branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSegment.java =================================================================== --- branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSegment.java 2008-11-03 22:30:01 UTC (rev 23299) +++ branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSegment.java 2008-11-03 22:32:53 UTC (rev 23300) @@ -380,10 +380,12 @@ for(int i=0;i<dataBuckets.length;i++) { // The FECCodec won't set them. // But they should be active. + if(logMINOR) + Logger.minor(this, "Data block "+i+" is "+dataBuckets[i]); if(!container.ext().isStored(dataBuckets[i])) Logger.error(this, "Data block "+i+" is not stored!"); else if(!container.ext().isActive(dataBuckets[i])) - Logger.error(this, "Data block "+i+" is inactive!"); + Logger.error(this, "Data block "+i+" is inactive! : "+dataBuckets[i]); if(dataBuckets[i] == null) Logger.error(this, "Data block "+i+" is null!"); else if(dataBuckets[i].data == null) @@ -467,7 +469,6 @@ public void onEncodedSegment(ObjectContainer container, ClientContext context, FECJob job, Bucket[] dataBuckets2, Bucket[] checkBuckets2, SplitfileBlock[] dataBlockStatus, SplitfileBlock[] checkBlockStatus) { if(persistent) { - container.activate(this, 1); container.activate(parent, 1); } if(logMINOR) @@ -478,7 +479,30 @@ // Now insert *ALL* blocks on which we had at least one failure, and didn't eventually succeed for(int i=0;i<dataBuckets.length;i++) { boolean heal = false; + if(dataBuckets[i] == null) { + Logger.error(this, "Data bucket "+i+" is null in onEncodedSegment on "+this); + continue; + } + if(dataBuckets[i] != dataBlockStatus[i]) { + Logger.error(this, "Data block "+i+" : ours is "+dataBuckets[i]+" codec's is "+dataBlockStatus[i]); + if(persistent) { + if(container.ext().getID(dataBuckets[i]) == container.ext().getID(dataBlockStatus[i])) + Logger.error(this, "DB4O BUG DETECTED: SAME UID FOR TWO OBJECTS: "+dataBuckets[i]+"="+container.ext().getID(dataBuckets[i])+" and "+dataBlockStatus[i]+"="+container.ext().getID(dataBlockStatus[i])+" ... attempting workaround ..."); + Logger.error(this, "Ours is "+(container.ext().isStored(dataBuckets[i])?"stored ":"")+(container.ext().isActive(dataBuckets[i])?"active ":"")+" UUID "+container.ext().getID(dataBuckets[i])); + Logger.error(this, "Theirs is "+(container.ext().isStored(dataBlockStatus[i])?"stored ":"")+(container.ext().isActive(dataBlockStatus[i])?"active ":"")+" UUID "+container.ext().getID(dataBlockStatus[i])); + } + dataBuckets[i] = (MinimalSplitfileBlock) dataBlockStatus[i]; + } Bucket data = dataBuckets[i].getData(); + if(data == null) { + Logger.error(this, "Data bucket "+i+" has null contents in onEncodedSegment on "+this+" for block "+dataBuckets[i]); + if(!container.ext().isStored(dataBuckets[i])) + Logger.error(this, "Splitfile block appears not to be stored"); + else if(!container.ext().isActive(dataBuckets[i])) + Logger.error(this, "Splitfile block appears not to be active"); + continue; + } + if(dataRetries[i] > 0) heal = true; if(heal) { @@ -496,9 +520,27 @@ boolean heal = false; // Check buckets will already be active because the FEC codec // has been using them. + if(checkBuckets[i] == null) { + Logger.error(this, "Check bucket "+i+" is null in onEncodedSegment on "+this); + continue; + } + if(checkBuckets[i] != checkBlockStatus[i]) { + Logger.error(this, "Check block "+i+" : ours is "+checkBuckets[i]+" codec's is "+checkBlockStatus[i]); + if(persistent) { + if(container.ext().getID(checkBuckets[i]) == container.ext().getID(checkBlockStatus[i])) + Logger.error(this, "DB4O BUG DETECTED: SAME UID FOR TWO OBJECTS: "+checkBuckets[i]+"="+container.ext().getID(checkBuckets[i])+" and "+checkBlockStatus[i]+"="+container.ext().getID(checkBlockStatus[i])+" ... attempting workaround ..."); + Logger.error(this, "Ours is "+(container.ext().isStored(checkBuckets[i])?"stored ":"")+(container.ext().isActive(checkBuckets[i])?"active ":"")+" UUID "+container.ext().getID(checkBuckets[i])); + Logger.error(this, "Theirs is "+(container.ext().isStored(checkBlockStatus[i])?"stored ":"")+(container.ext().isActive(checkBlockStatus[i])?"active ":"")+" UUID "+container.ext().getID(checkBlockStatus[i])); + } + checkBuckets[i] = (MinimalSplitfileBlock) checkBlockStatus[i]; + } Bucket data = checkBuckets[i].getData(); if(data == null) { - Logger.error(this, "Check block "+i+" is null on "+this); + Logger.error(this, "Check bucket "+i+" has null contents in onEncodedSegment on "+this+" for block "+checkBuckets[i]); + if(!container.ext().isStored(dataBuckets[i])) + Logger.error(this, "Splitfile block appears not to be stored"); + else if(!container.ext().isActive(dataBuckets[i])) + Logger.error(this, "Splitfile block appears not to be active"); continue; } try {
