Author: nextgens
Date: 2007-11-23 13:37:19 +0000 (Fri, 23 Nov 2007)
New Revision: 15938

Modified:
   trunk/freenet/src/freenet/node/fcp/ClientRequest.java
   trunk/freenet/src/freenet/node/fcp/FCPServer.java
Log:
Fix the persistence of requests. Remove a few fd leaks too.

Modified: trunk/freenet/src/freenet/node/fcp/ClientRequest.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientRequest.java       2007-11-23 
13:18:28 UTC (rev 15937)
+++ trunk/freenet/src/freenet/node/fcp/ClientRequest.java       2007-11-23 
13:37:19 UTC (rev 15938)
@@ -148,7 +148,7 @@

        public static ClientRequest readAndRegister(BufferedReader br, 
FCPServer server) throws IOException {
                boolean logMINOR = Logger.shouldLog(Logger.MINOR, 
ClientRequest.class);
-               Runtime rt = Runtime.getRuntime();;
+               Runtime rt = Runtime.getRuntime();
                if(logMINOR)
                        Logger.minor(ClientRequest.class, 
rt.maxMemory()-rt.freeMemory()+" in use before loading request");
                SimpleFieldSet fs = new SimpleFieldSet(br, false, false); // 
can get enormous

Modified: trunk/freenet/src/freenet/node/fcp/FCPServer.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/FCPServer.java   2007-11-23 13:18:28 UTC 
(rev 15937)
+++ trunk/freenet/src/freenet/node/fcp/FCPServer.java   2007-11-23 13:37:19 UTC 
(rev 15938)
@@ -594,16 +594,17 @@
                                        w = new BufferedWriter(osw);
                                        
w.write(Integer.toString(persistentRequests.length)+ '\n');
                                        for(int 
i=0;i<persistentRequests.length;i++)
-                                               persistentRequests[i].write(w); 
                                       
+                                               persistentRequests[i].write(w); 
                                      
                                } catch (IOException e) {
                                        Logger.error(this, "Cannot write 
persistent requests to disk: "+e);
+                               } finally {
                                         Closer.close(w);
                                         Closer.close(osw);
                                         Closer.close(gos);
                                         Closer.close(bos);
                                         Closer.close(fos);
-                               }
-                                FileUtil.renameTo(compressedTemp, 
compressedTemp);
+                                }
+                                FileUtil.renameTo(compressedTemp, 
compressedFinal);
                        }
                        if(logMINOR) Logger.minor(this, "Stored persistent 
requests");
                } finally {
@@ -624,37 +625,36 @@

        private void loadPersistentRequests() {
                FileInputStream fis = null;
+                BufferedInputStream bis = null;
+                GZIPInputStream gis = null;
                try {
-                       fis = new 
FileInputStream(persistentDownloadsFile+".gz");
-                       GZIPInputStream gis = new GZIPInputStream(fis);
-                       BufferedInputStream bis = new BufferedInputStream(gis);
+                        File file = new File(persistentDownloadsFile+".gz");
+                        if(!file.exists() || !file.canRead() || file.length() 
== 0)
+                            throw new IOException(file.toURI() + " is empty or 
doesn't exist!");
+                       fis = new FileInputStream(file);
+                       gis = new GZIPInputStream(fis);
+                       bis = new BufferedInputStream(gis);
                        loadPersistentRequests(bis);
-                       persistentDownloadsFile.delete();
+                       file.delete();
                } catch (IOException e) {
-                       if(fis != null) {
-                               try {
-                                       fis.close();
-                               } catch (IOException e1) {
-                                       // Ignore
-                               }
-                               fis = null;
-                       }
+                        Logger.error(this, "IOE : " + e.getMessage(), e);
+                        Logger.normal(this, "Let's try to load 
"+persistentDownloadsFile+" then.");
+                        Closer.close(bis);
+                       Closer.close(gis);
+                        Closer.close(fis);
                        try {
                                fis = new 
FileInputStream(persistentDownloadsFile);
-                               BufferedInputStream bis = new 
BufferedInputStream(fis);
+                               bis = new BufferedInputStream(fis);
                                loadPersistentRequests(bis);
                        } catch (IOException e1) {
-                               Logger.normal(this, "Not reading any persistent 
requests from disk: "+e1);
+                               Logger.normal(this, "It's corrupted too : Not 
reading any persistent requests from disk: "+e1);
+                                persistentDownloadsFile.delete();
                                return;
                        }
                } finally {
-                       if(fis != null) {
-                               try {
-                                       fis.close();
-                               } catch (IOException e) {
-                                       // Ignore
-                               }
-                       }
+                        Closer.close(gis);
+                        Closer.close(bis);
+                        Closer.close(fis);
                }
        }

@@ -662,20 +662,25 @@
                synchronized(persistenceSync) {
                        InputStreamReader ris = new InputStreamReader(is, 
"UTF-8");
                        BufferedReader br = new BufferedReader(ris);
-                       String r = br.readLine();
-                       int count;
-                       try {
-                               count = Integer.parseInt(r);
-                       } catch (NumberFormatException e) {
-                               Logger.error(this, "Corrupt persistent 
downloads file: "+persistentDownloadsFile);
-                               throw new IOException(e.toString());
-                       }
-                       for(int i=0;i<count;i++) {
-                               WrapperManager.signalStarting(20*60*1000);  // 
20 minutes per request; must be >ds lock timeout (10 minutes)
-                               System.out.println("Loading persistent request 
"+(i+1)+" of "+count+"..."); // humans count from 1..
-                               ClientRequest.readAndRegister(br, this);
-                       }
-                       br.close();
+                        try {
+                            String r = br.readLine();
+                            int count;
+                            try {
+                                count = Integer.parseInt(r);
+                            } catch(NumberFormatException e) {
+                                Logger.error(this, "Corrupt persistent 
downloads file");
+                                throw new IOException(e.toString());
+                            }
+                            for(int i = 0; i < count; i++) {
+                                WrapperManager.signalStarting(20 * 60 * 1000); 
 // 20 minutes per request; must be >ds lock timeout (10 minutes)
+                                System.out.println("Loading persistent request 
" + (i + 1) + " of " + count + "..."); // humans count from 1..
+                                ClientRequest.readAndRegister(br, this);
+                            }
+                        }
+                        finally {
+                            Closer.close(br);
+                            Closer.close(ris);
+                        }
                }
        }

@@ -746,7 +751,7 @@
                                                                String id = 
"FProxy:"+Base64.encode(buf);
                                                                
innerMakePersistentGlobalRequest(fetchURI, persistence, returnType, id, 
returnFilename, returnTempFilename);
                                                                return;
-                                                       } catch 
(IdentifierCollisionException e3) {};
+                                                       } catch 
(IdentifierCollisionException e3) {}
                                                }
                                        }
                                }


Reply via email to