Author: toad
Date: 2008-06-30 14:57:18 +0000 (Mon, 30 Jun 2008)
New Revision: 20876

Modified:
   branches/db4o/freenet/src/freenet/support/SortedVectorByNumber.java
Log:
Activate all datums before doing binary search in SortedVectorByNumber.
OUCH. All testers *may* have data corruption, resulting in: "Verify failed! at 
<num> this=<num> but last=<num>"
If you have this, delete your node.db4o and start again. :(

Modified: branches/db4o/freenet/src/freenet/support/SortedVectorByNumber.java
===================================================================
--- branches/db4o/freenet/src/freenet/support/SortedVectorByNumber.java 
2008-06-30 14:52:52 UTC (rev 20875)
+++ branches/db4o/freenet/src/freenet/support/SortedVectorByNumber.java 
2008-06-30 14:57:18 UTC (rev 20876)
@@ -40,8 +40,11 @@
        }

        public synchronized void remove(int item, ObjectContainer container) {
-               if(persistent)
+               if(persistent) {
                        container.activate(this, 1);
+                       for(int i=0;i<length;i++)
+                               container.activate(data[i], 1);
+               }
                int x = Arrays.binarySearch(data, new Integer(item), 
comparator);
                if(x >= 0) {
                        if(x < length-1)
@@ -79,8 +82,11 @@
         * @return True if we added the item.
         */
        public synchronized boolean push(IntNumberedItem grabber, 
ObjectContainer container) {
-               if(persistent)
+               if(persistent) {
                        container.activate(this, 1);
+                       for(int i=0;i<length;i++)
+                               container.activate(data[i], 1);
+               }
                int x = Arrays.binarySearch(data, new 
Integer(grabber.getNumber()), comparator);
                if(x >= 0) return false;
                // insertion point
@@ -90,8 +96,11 @@
        }

        public synchronized void add(IntNumberedItem grabber, ObjectContainer 
container) {
-               if(persistent)
+               if(persistent) {
                        container.activate(this, 1);
+                       for(int i=0;i<length;i++)
+                               container.activate(data[i], 1);
+               }
                int x = Arrays.binarySearch(data, new 
Integer(grabber.getNumber()), comparator);
                if(x >= 0) {
                        if(grabber != data[x])
@@ -104,8 +113,11 @@
        }

        private synchronized void push(IntNumberedItem grabber, int x, 
ObjectContainer container) {
-               if(persistent)
+               if(persistent) {
                        container.activate(this, 1);
+                       for(int i=0;i<length;i++)
+                               container.activate(data[i], 1);
+               }
                boolean logMINOR = Logger.shouldLog(Logger.MINOR, this);
                if(logMINOR) Logger.minor(this, "Insertion point: "+x);
                // Move the data


Reply via email to