Author: toad
Date: 2008-10-06 17:05:15 +0000 (Mon, 06 Oct 2008)
New Revision: 22955

Modified:
   branches/db4o/freenet/src/freenet/client/async/SimpleManifestPutter.java
Log:
Activation, storage, logging.
Fixes not inserting not-in-container files.
However big directory inserts still don't finish, they reach Fetchable and then 
stall.


Modified: 
branches/db4o/freenet/src/freenet/client/async/SimpleManifestPutter.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/SimpleManifestPutter.java    
2008-10-06 16:49:21 UTC (rev 22954)
+++ branches/db4o/freenet/src/freenet/client/async/SimpleManifestPutter.java    
2008-10-06 17:05:15 UTC (rev 22955)
@@ -114,12 +114,12 @@
                        SimpleManifestPutter.this.onFetchable(this, container);
                        synchronized(SimpleManifestPutter.this) {
                                runningPutHandlers.remove(this);
+                               if(persistent)
+                                       container.store(runningPutHandlers);
                                if(!runningPutHandlers.isEmpty()) {
                                        return;
                                }
                        }
-                       if(persistent)
-                               container.store(runningPutHandlers);
                        insertedAllFiles(container);
                }

@@ -150,7 +150,7 @@

                public void onMetadata(Metadata m, ClientPutState state, 
ObjectContainer container, ClientContext context) {
                        logMINOR = Logger.shouldLog(Logger.MINOR, this);
-                       if(logMINOR) Logger.minor(this, "Assigning metadata: 
"+m+" for "+this+" from "+state,
+                       if(logMINOR) Logger.minor(this, "Assigning metadata: 
"+m+" for "+this+" from "+state+" persistent="+persistent,
                                        new Exception("debug"));
                        if(metadata != null) {
                                Logger.error(this, "Reassigning metadata", new 
Exception("debug"));
@@ -162,11 +162,13 @@
                        }
                        synchronized(SimpleManifestPutter.this) {
                                putHandlersWaitingForMetadata.remove(this);
+                               if(persistent) {
+                                       
container.store(putHandlersWaitingForMetadata);
+                                       container.store(this);
+                               }
                                if(!putHandlersWaitingForMetadata.isEmpty()) 
return;
                        }
                        if(persistent) {
-                               container.store(putHandlersWaitingForMetadata);
-                               container.store(this);
                                container.activate(SimpleManifestPutter.this, 
1);
                        }
                        gotAllMetadata(container, context);
@@ -226,10 +228,10 @@
                        }
                        synchronized(SimpleManifestPutter.this) {
                                waitingForBlockSets.remove(this);
+                               if(persistent)
+                                       container.store(waitingForBlockSets);
                                if(!waitingForBlockSets.isEmpty()) return;
                        }
-                       if(persistent)
-                               container.store(waitingForBlockSets);
                        SimpleManifestPutter.this.blockSetFinalized(container, 
context);
                }

@@ -313,7 +315,7 @@
        public void start(ObjectContainer container, ClientContext context) 
throws InsertException {
                logMINOR = Logger.shouldLog(Logger.MINOR, this);
                if (logMINOR)
-                       Logger.minor(this, "Starting " + this);
+                       Logger.minor(this, "Starting " + this+" 
persistence="+persistent());
                PutHandler[] running;

                if(persistent()) {
@@ -384,6 +386,8 @@
                                                        (bytesOnZip + sz < 
((2048-64)*1024))) { // totally dumb heuristic!
                                                bytesOnZip += sz;
                                                // Put it in the zip.
+                                               if(logMINOR)
+                                                       Logger.minor(this, 
"Putting into ZIP: "+name);
                                                ph = new PutHandler(this, name, 
ZipPrefix+element.fullName, cm, data);
                                                elementsToPutInZip.add(ph);
                                                numberOfFiles++;
@@ -393,6 +397,8 @@
                                                runningPutHandlers.add(ph);
                                                
putHandlersWaitingForMetadata.add(ph);
                                                
putHandlersWaitingForFetchable.add(ph);
+                                               if(logMINOR)
+                                                       Logger.minor(this, 
"Inserting separately as PutHandler: "+name+" : "+ph+" 
persistent="+ph.persistent()+":"+ph.persistent);
                                                numberOfFiles++;
                                                totalSize += data.size();
                                        }
@@ -418,7 +424,7 @@
                }
                if(logMINOR) Logger.minor(this, "Got all metadata");
                HashMap namesToByteArrays = new HashMap();
-               namesToByteArrays(putHandlersByName, namesToByteArrays);
+               namesToByteArrays(putHandlersByName, namesToByteArrays, 
container);
                if(defaultName != null) {
                        Metadata meta = (Metadata) 
namesToByteArrays.get(defaultName);
                        if(meta == null) {
@@ -440,6 +446,7 @@
                        
Metadata.mkRedirectionManifestWithMetadata(namesToByteArrays);
                if(persistent()) {
                        container.store(baseMetadata);
+                       container.store(this);
                }
                resolveAndStartBase(container, context);

@@ -474,6 +481,8 @@
                        if(hasResolvedBase) return;
                        hasResolvedBase = true;
                }
+               if(persistent())
+                       container.store(this);
                InsertBlock block;
                boolean isMetadata = true;
                boolean insertAsArchiveManifest = false;
@@ -586,19 +595,29 @@
                return mustWait;
        }

-       private void namesToByteArrays(HashMap putHandlersByName, HashMap 
namesToByteArrays) {
+       private void namesToByteArrays(HashMap putHandlersByName, HashMap 
namesToByteArrays, ObjectContainer container) {
                Iterator i = putHandlersByName.keySet().iterator();
                while(i.hasNext()) {
                        String name = (String) i.next();
                        Object o = putHandlersByName.get(name);
                        if(o instanceof PutHandler) {
                                PutHandler ph = (PutHandler) o;
+                               if(persistent())
+                                       container.activate(ph, 1);
                                Metadata meta = ph.metadata;
+                               if(ph.metadata == null)
+                                       Logger.error(this, "Metadata for 
"+name+" : "+ph+" is null");
+                               if(persistent())
+                                       container.activate(meta, 100);
+                               Logger.minor(this, "Putting "+name);
                                namesToByteArrays.put(name, meta);
                        } else if(o instanceof HashMap) {
                                HashMap subMap = new HashMap();
+                               if(persistent())
+                                       container.activate(o, 1);
                                namesToByteArrays.put(name, subMap);
-                               namesToByteArrays((HashMap)o, subMap);
+                               Logger.minor(this, "Putting directory: "+name);
+                               namesToByteArrays((HashMap)o, subMap, 
container);
                        } else
                                throw new IllegalStateException();
                }
@@ -610,10 +629,14 @@
                        insertedAllFiles = true;
                        if(finished || cancelled) {
                                if(logMINOR) Logger.minor(this, "Already 
"+(finished?"finished":"cancelled"));
+                               if(persistent())
+                                       container.store(this);
                                return;
                        }
                        if(!insertedManifest) {
                                if(logMINOR) Logger.minor(this, "Haven't 
inserted manifest");
+                               if(persistent())
+                                       container.store(this);
                                return;
                        }
                        finished = true;
@@ -681,10 +704,14 @@
                        insertedManifest = true;
                        if(finished) {
                                if(logMINOR) Logger.minor(this, "Already 
finished");
+                               if(persistent())
+                                       container.store(this);
                                return;
                        }
                        if(!insertedAllFiles) {
                                if(logMINOR) Logger.minor(this, "Not inserted 
all files");
+                               if(persistent())
+                                       container.store(this);
                                return;
                        }
                        finished = true;
@@ -741,7 +768,11 @@
        public void onBlockSetFinished(ClientPutState state, ObjectContainer 
container, ClientContext context) {
                synchronized(this) {
                        this.metadataBlockSetFinalized = true;
-                       if(!waitingForBlockSets.isEmpty()) return;
+                       if(!waitingForBlockSets.isEmpty()) {
+                               if(persistent())
+                                       container.store(this);
+                               return;
+                       }
                }
                this.blockSetFinalized(container, context);
                if(persistent())


Reply via email to