Author: nextgens
Date: 2006-07-10 10:34:33 +0000 (Mon, 10 Jul 2006)
New Revision: 9541

Modified:
   trunk/freenet/src/freenet/node/updater/NodeUpdater.java
Log:
Fix the locking in NodeUpdater

Modified: trunk/freenet/src/freenet/node/updater/NodeUpdater.java
===================================================================
--- trunk/freenet/src/freenet/node/updater/NodeUpdater.java     2006-07-10 
10:22:11 UTC (rev 9540)
+++ trunk/freenet/src/freenet/node/updater/NodeUpdater.java     2006-07-10 
10:34:33 UTC (rev 9541)
@@ -39,7 +39,7 @@
        private FetcherContext ctxRevocation;
        private FetchResult result;
        private ClientGetter cg;
-       private boolean finalCheck = false;
+       private boolean finalCheck;
        private final FreenetURI URI;
        private final FreenetURI revocationURI;
        private final Node node;
@@ -51,8 +51,8 @@
        private boolean hasBeenBlown;
        private int revocationDNFCounter;

-       private boolean isRunning = false;
-       private boolean isFetching = false;
+       private boolean isRunning;
+       private boolean isFetching;

        public boolean isAutoUpdateAllowed;

@@ -126,17 +126,16 @@
                }
        }

-       public void maybeUpdate(){
-               synchronized(this) {
-                       try{
-                               if(isFetching || (!isRunning) || 
(!isUpdatable())) return;
-                       }catch (PrivkeyHasBeenBlownException e){
-                               // Handled in blow().
-                               isRunning=false;
-                               return;
-                       }
+       public synchronized void maybeUpdate(){
+               try{
+                       if(isFetching || (!isRunning) || (!isUpdatable())) 
return;
+               }catch (PrivkeyHasBeenBlownException e){
+                       // Handled in blow().
+                       isRunning=false;
+                       return;
                }
-               
+
+
                alert.set(availableVersion,false);
                alert.isValid(true);
                Logger.normal(this,"Starting the update process");
@@ -159,7 +158,7 @@

        private volatile Object updateSync = new Object();

-       public void Update() {
+       public synchronized void Update() {
                if(!isRunning) return;
                synchronized(updateSync) {
                        innerUpdate();
@@ -170,47 +169,45 @@
         * We try to update the node :p
         * Must run on its own thread.
         */
-       void innerUpdate(){
+       private synchronized void innerUpdate(){
                Logger.minor(this, "Update() called");
-               synchronized(this) {
-                       if((result == null) || hasBeenBlown) {
-                               Logger.minor(this, "Returning: 
result="+result+", isAutoUpdateAllowed="+isAutoUpdateAllowed+", 
hasBeenBlown="+hasBeenBlown);
-                               return;
-                       }
-                       
-                       this.revocationDNFCounter = 0;
-                       this.finalCheck = true;
+               if((result == null) || hasBeenBlown) {
+                       Logger.minor(this, "Returning: result="+result+", 
isAutoUpdateAllowed="+isAutoUpdateAllowed+", hasBeenBlown="+hasBeenBlown);
+                       return;
                }
-               
+
+               this.revocationDNFCounter = 0;
+               this.finalCheck = true;
+
+
                System.err.println("Searching for revocation key");
                this.queueFetchRevocation(100);
-               synchronized(this) {
-                       while(revocationDNFCounter < 3) {
-                               System.err.println("Revocation counter: 
"+revocationDNFCounter);
-                               if(this.hasBeenBlown) {
-                                       Logger.error(this, "The revocation key 
has been found on the network : blocking auto-update");
-                                       return;
-                               }
-                               try {
-                                       wait(100*1000);
-                               } catch (InterruptedException e) {
-                                       // Ignore
-                               }
+               while(revocationDNFCounter < 3) {
+                       System.err.println("Revocation counter: 
"+revocationDNFCounter);
+                       if(this.hasBeenBlown) {
+                               Logger.error(this, "The revocation key has been 
found on the network : blocking auto-update");
+                               return;
                        }
+                       try {
+                               wait(100*1000);
+                       } catch (InterruptedException e) {
+                               // Ignore
+                       }
                }

+
                System.err.println("Update in progress");
                Logger.normal(this, "Update in progress");
                try{
                        ArrayBucket bucket = (ArrayBucket) result.asBucket();
                        byte[] data = bucket.toByteArray();
-                       
+
                        File fRunning = new File("freenet-cvs-snapshot.jar");
                        File fNew = new File("freenet-cvs-snapshot.jar.new");
-                       
+
                        boolean nastyRestart = false;
-                       
-                       if(File.separatorChar != '\\') {
+
+                       if(File.separatorChar == '\\') {
                                // Do nothing.
                        } else {
                                nastyRestart = true;
@@ -239,11 +236,11 @@
                                        }
                                }
                        }
-                       
+
                        fNew.delete();
-                       
+
                        FileOutputStream fos = new FileOutputStream(fNew);
-                       
+
                        fos.write(data);
                        fos.flush();
                        fos.close();
@@ -260,27 +257,27 @@
                                }
                        } else {
                                // Hard way.
-                               
+
                                
if(!WrapperManager.isControlledByNativeWrapper()) {
                                        Logger.error(this, "Cannot update 
because not running under wrapper");
                                        System.err.println("Cannot update 
because not running under wrapper");
                                        return;
                                }
-                               
+
                                try {
-                                       
+
                                        File oldConfig = new 
File("wrapper.conf");
                                        File newConfig = new 
File("wrapper.conf.new");
-                                       
+
                                        FileInputStream fis = new 
FileInputStream(oldConfig);
                                        BufferedInputStream bis = new 
BufferedInputStream(fis);
                                        InputStreamReader isr = new 
InputStreamReader(bis);
                                        BufferedReader br = new 
BufferedReader(isr);
-                                       
+
                                        fos = new FileOutputStream(newConfig);
                                        OutputStreamWriter osw = new 
OutputStreamWriter(fos);
                                        BufferedWriter bw = new 
BufferedWriter(osw);
-                                       
+
                                        String line;
                                        boolean succeeded = false;
                                        boolean stillSucceeded = false;
@@ -299,19 +296,19 @@
                                        }
                                        bw.close();
                                        br.close();
-                                       
+
                                        if(!succeeded) {
                                                System.err.println("Not able to 
update because of non-standard config");
                                                Logger.error(this, "Not able to 
update because of non-standard config");
                                                return;
                                        }
-                                       
+
                                        if(!stillSucceeded) {
                                                System.err.println("Not able to 
update because of non-standard or old config, add a line saying 
\"wrapper.restart.reload_configuration=TRUE\"");
                                                Logger.error(this, "Not able to 
update because of non-standard or old config, add a line saying 
\"wrapper.restart.reload_configuration=TRUE\"");
                                                return;
                                        }
-                                       
+
                                        if(!newConfig.renameTo(oldConfig)) {
                                                oldConfig.delete();
                                                
if(!newConfig.renameTo(oldConfig)) {
@@ -320,9 +317,9 @@
                                                        return;
                                                }
                                        }
-                                       
+
                                        // New config installed.
-                                       
+
                                } catch (IOException e) {
                                        Logger.error(this, "Not able to update 
because of I/O error: "+e, e);
                                        System.err.println("Not able to update 
because of I/O error: "+e);
@@ -337,7 +334,7 @@
                                node.exit();
                        }
                        System.err.println("WTF? Restart returned!?");
-                       
+
                }catch(Exception e){
                        Logger.error(this, "Error while updating the node : 
"+e);
                        System.out.println("Exception : "+e);
@@ -345,18 +342,16 @@
                }
        }

-       public void onSuccess(FetchResult result, ClientGetter state) {
+       public synchronized void onSuccess(FetchResult result, ClientGetter 
state) {
                if(!state.getURI().equals(revocationURI)){
                        System.out.println("Found "+availableVersion);
                        Logger.normal(this, "Found a new version! (" + 
availableVersion + ", setting up a new UpdatedVersionAviableUserAlert");
                        alert.set(availableVersion,true);
                        alert.isValid(true);            
-                       synchronized(this){
-                               this.cg = state;
-                               this.result = result;
-                               if(this.isAutoUpdateAllowed)
-                                       scheduleUpdate();
-                       }
+                       this.cg = state;
+                       this.result = result;
+                       if(this.isAutoUpdateAllowed)
+                               scheduleUpdate();
                }else{
                        // The key has been blown !
                        // FIXME: maybe we need a bigger warning message.
@@ -378,7 +373,7 @@
                }
        }

-       public void onFailure(FetchException e, ClientGetter state) {
+       public synchronized void onFailure(FetchException e, ClientGetter 
state) {
                int errorCode = e.getMode();

                if(!state.getURI().equals(revocationURI)){      
@@ -395,23 +390,21 @@
                        } else
                                Logger.error(this, "Canceling fetch : "+ 
e.getMessage());
                }else{
-                       synchronized(this) {
-                               if(errorCode == FetchException.DATA_NOT_FOUND){
-                                       revocationDNFCounter++;
-                               }
-                               if(e.isFatal()) this.blow("Permanent error 
fetching revocation (invalid data inserted?): "+e.toString());
-                               // Start it again
-                               if(this.finalCheck) {
-                                       if(revocationDNFCounter < 3)
-                                               queueFetchRevocation(1000);
-                                       else
-                                               notifyAll();
-                               } else {
-                                       boolean pause = (revocationDNFCounter 
== 3);
-                                       if(pause) revocationDNFCounter = 0;
-                                       queueFetchRevocation(pause ? 60*60*1000 
: 5000);
-                               }
+                       if(errorCode == FetchException.DATA_NOT_FOUND){
+                               revocationDNFCounter++;
                        }
+                       if(e.isFatal()) this.blow("Permanent error fetching 
revocation (invalid data inserted?): "+e.toString());
+                       // Start it again
+                       if(this.finalCheck) {
+                               if(revocationDNFCounter < 3)
+                                       queueFetchRevocation(1000);
+                               else
+                                       notifyAll();
+                       } else {
+                               boolean pause = (revocationDNFCounter == 3);
+                               if(pause) revocationDNFCounter = 0;
+                               queueFetchRevocation(pause ? 60*60*1000 : 5000);
+                       }
                }
        }

@@ -454,14 +447,14 @@
                // Impossible
        }

-       public boolean isUpdatable() throws PrivkeyHasBeenBlownException{
+       public synchronized boolean isUpdatable() throws 
PrivkeyHasBeenBlownException{
                if(hasBeenBlown) 
                        throw new 
PrivkeyHasBeenBlownException(revocationMessage);
                else 
                        return (currentVersion<availableVersion);
        }

-       public boolean isRunning(){
+       public synchronized boolean isRunning(){
                return isRunning;
        }



Reply via email to