Author: toad
Date: 2008-06-26 21:13:30 +0000 (Thu, 26 Jun 2008)
New Revision: 20784

Modified:
   branches/db4o/freenet/src/freenet/support/SectoredRandomGrabArray.java
Log:
Fix NPEs related to getObject() result not being activated

Modified: branches/db4o/freenet/src/freenet/support/SectoredRandomGrabArray.java
===================================================================
--- branches/db4o/freenet/src/freenet/support/SectoredRandomGrabArray.java      
2008-06-26 19:24:24 UTC (rev 20783)
+++ branches/db4o/freenet/src/freenet/support/SectoredRandomGrabArray.java      
2008-06-26 21:13:30 UTC (rev 20784)
@@ -103,16 +103,18 @@
                                if(persistent) // deactivate to save memory
                                        container.deactivate(item, 1);
                                if(rga.isEmpty()) {
+                                       Object client = rga.getObject();
+                                       if(persistent)
+                                               container.activate(client, 1);
                                        if(logMINOR)
                                                Logger.minor(this, "Removing 
only grab array (0) : "+rga+" for "+rga.getObject()+" (is empty)");
-                                       Object client = rga.getObject();
                                        grabArraysByClient.remove(client);
                                        grabArrays = new 
RemoveRandomWithObject[0];
                                        if(persistent)
                                                container.set(this);
                                }
                                if(logMINOR)
-                                       Logger.minor(this, "Returning (one item 
only) "+item+" for "+rga+" for "+rga.getObject());
+                                       Logger.minor(this, "Returning (one item 
only) "+item+" for "+rga);
                                return item;
                        }
                        if(grabArrays.length == 2) {
@@ -130,12 +132,21 @@
                                                container.activate(rga, 1);
                                        item = rga.removeRandom(excluding, 
container, context);
                                        if(firstRGA.isEmpty() && rga.isEmpty()) 
{
+                                               Object rgaClient = 
rga.getObject();
+                                               Object firstClient = 
firstRGA.getObject();
+                                               if(persistent) {
+                                                       
container.activate(rgaClient, 1);
+                                                       
container.activate(firstClient, 1);
+                                               }
                                                
grabArraysByClient.remove(rga.getObject());
                                                
grabArraysByClient.remove(firstRGA.getObject());
                                                grabArrays = new 
RemoveRandomWithObject[0];
                                                if(persistent)
                                                        container.set(this);
                                        } else if(firstRGA.isEmpty()) {
+                                               if(persistent) {
+                                                       
container.activate(firstRGA, 1);
+                                               }
                                                
grabArraysByClient.remove(firstRGA.getObject());
                                                grabArrays = new 
RemoveRandomWithObject[] { rga };
                                                if(persistent)
@@ -146,13 +157,13 @@
                                                container.deactivate(firstRGA, 
1);
                                        }
                                        if(logMINOR)
-                                               Logger.minor(this, "Returning 
(two items only) "+item+" for "+rga+" for "+rga.getObject());
+                                               Logger.minor(this, "Returning 
(two items only) "+item+" for "+rga);
                                        return item;
                                } else {
                                        if(persistent)
                                                container.deactivate(rga, 1);
                                        if(logMINOR)
-                                               Logger.minor(this, "Returning 
(two items only) "+item+" for "+rga+" for "+rga.getObject());
+                                               Logger.minor(this, "Returning 
(two items only) "+item+" for "+rga);
                                        return item;
                                }
                        }
@@ -161,7 +172,7 @@
                        if(persistent)
                                container.activate(rga, 1);
                        if(logMINOR)
-                               Logger.minor(this, "Picked "+x+" of 
"+grabArrays.length+" : "+rga+" : "+rga.getObject()+" on "+this);
+                               Logger.minor(this, "Picked "+x+" of 
"+grabArrays.length+" : "+rga+" on "+this);
                        RandomGrabArrayItem item = rga.removeRandom(excluding, 
container, context);
                        if(logMINOR)
                                Logger.minor(this, "RGA has picked 
"+x+"/"+grabArrays.length+": "+item+
@@ -172,8 +183,10 @@
                        final int grabArraysLength = grabArrays.length;
                        if(rga.isEmpty()) {
                                if(logMINOR)
-                                       Logger.minor(this, "Removing grab array 
"+x+" : "+rga+" for "+rga.getObject()+" (is empty)");
+                                       Logger.minor(this, "Removing grab array 
"+x+" : "+rga+" (is empty)");
                                Object client = rga.getObject();
+                               if(persistent)
+                                       container.activate(client, 1);
                                grabArraysByClient.remove(client);
                                RemoveRandomWithObject[] newArray = new 
RemoveRandomWithObject[grabArraysLength > 1 ? grabArraysLength-1 : 0];
                                if(x > 0)


Reply via email to