From 75b8c0f2d17fa325685084522752884ef794febf Mon Sep 17 00:00:00 2001 From: =?utf8?q?S=C3=A9bastien=20Miqu=C3=A9e?= Date: Thu, 18 Feb 2010 02:03:17 +0100 Subject: [PATCH 1/1] Correcting some bugs about nodes fault tolerance. - Problem in some methods are corrected. --- src/jaceP2P/JaceSpawner.java | 3 ++ src/jaceP2P/JaceSuperNode.java | 2 +- src/jaceP2P/JaceSuperNodeInterface.java | 2 +- src/jaceP2P/JaceSuperNodeServer.java | 62 ++++++++++++++++++------- src/jaceP2P/SuperNodeListe.java | 8 ++-- 5 files changed, 54 insertions(+), 23 deletions(-) diff --git a/src/jaceP2P/JaceSpawner.java b/src/jaceP2P/JaceSpawner.java index 66be55a..a6b1244 100644 --- a/src/jaceP2P/JaceSpawner.java +++ b/src/jaceP2P/JaceSpawner.java @@ -406,6 +406,9 @@ public class JaceSpawner { if( node != null ) { found = true ; + } else { + Thread.sleep( 1000 ) ; + System.out.println("Pas de bon retour !"); } } catch (Exception e) { // trouver un autre superNode et lui demander le noeud a lui diff --git a/src/jaceP2P/JaceSuperNode.java b/src/jaceP2P/JaceSuperNode.java index 7774b86..c4238b7 100644 --- a/src/jaceP2P/JaceSuperNode.java +++ b/src/jaceP2P/JaceSuperNode.java @@ -152,7 +152,7 @@ public class JaceSuperNode { index)).setNbOfNodes(Register.Instance().getSize()); SuperNodeListe.Instance().forwardCountNode(); - GNode deadGNode = snodeServer.delGNodeFromList( host ) ; + GNode deadGNode = snodeServer.delGNodeFromList( host, 0 ) ; SuperNodeListe.Instance().removeGNode( deadGNode ) ; // Register.Instance().viewAll(); diff --git a/src/jaceP2P/JaceSuperNodeInterface.java b/src/jaceP2P/JaceSuperNodeInterface.java index 4ae6445..9779ef3 100644 --- a/src/jaceP2P/JaceSuperNodeInterface.java +++ b/src/jaceP2P/JaceSuperNodeInterface.java @@ -54,7 +54,7 @@ public interface JaceSuperNodeInterface extends Remote { public void setMapping( Algo al ) throws RemoteException ; - public void updateMappedNode(GNode dead, GNode remp); + public void updateMappedNode(GNode dead, GNode remp) throws RemoteException ; } /** ! **/ diff --git a/src/jaceP2P/JaceSuperNodeServer.java b/src/jaceP2P/JaceSuperNodeServer.java index 1963ff7..1b06066 100644 --- a/src/jaceP2P/JaceSuperNodeServer.java +++ b/src/jaceP2P/JaceSuperNodeServer.java @@ -293,7 +293,7 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements for (int i = 0; i < ag.size(); i++) { reg.addNode((Node) ag.get(i).getNode()); - delGNodeFromList( (Node) ag.get(i).getNode() ) ; + delGNodeFromList( (Node) ag.get(i).getNode(), 0 ) ; // gnodes.remove(ag.get(i)); // Register.Instance().removeNode((Node) ag.get(i).getNode()); } @@ -309,7 +309,7 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements { sup = al.getOtherGNode( gnodes ) ; reg.addNodeBeg( (Node) sup.getNode() ) ; - delGNodeFromList( (Node) sup.getNode() ) ; + delGNodeFromList( (Node) sup.getNode(), 0 ) ; } } @@ -340,7 +340,7 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements /** Recherche nouveau noeud **/ /*****************************************/ - protected GNode delGNodeFromList( Node _n ) + protected GNode delGNodeFromList( Node _n, int _mode ) { GNode removedGNode = null ; @@ -354,15 +354,36 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements free = true ; } - for( int i = 0 ; i < gnodes.size() ; i++ ) + /** The dead node is not in the mapping **/ + if( _mode == 0 ) { - if( ((Node)gnodes.get(i).getNode()).getId() == _n.getId() ) + for( int i = 0 ; i < gnodes.size() ; i++ ) { - removedGNode = gnodes.remove( i ) ; - Register.Instance().removeNodeOfName( removedGNode.getName() ) ; - break ; + if( ((Node)gnodes.get(i).getNode()).getId() == _n.getId() ) + { + removedGNode = gnodes.remove( i ) ; + Register.Instance().removeNodeOfName( removedGNode.getName() ) ; + break ; + } } } + + /** The dead node is in the mapping **/ + if( _mode == 1 ) + { + ArrayList temp = al.getMapping().getMappedGNodes() ; + + for( int i = 0 ; i < temp.size() ; i++ ) + { + if( ((Node)temp.get(i).getNode()).getId() == _n.getId() ) + { + removedGNode = temp.get( i ) ; + Register.Instance().removeNodeOfName( removedGNode.getName() ) ; + break ; + } + } + } + // daemonListChange = true ; @@ -421,8 +442,10 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements if( _deadNode != null ) { - gnode = delGNodeFromList( _deadNode ) ; - + authorized = true ; + + gnode = delGNodeFromList( _deadNode, 1 ) ; + remp = al.replaceNode( gnode, gnodes ) ; if( remp != null ) @@ -430,9 +453,7 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements System.out.println( "Replacing node found." ) ; node = (Node) remp.getNode() ; - authorized = true ; - - delGNodeFromList( node ) ; + delGNodeFromList( node, 0 ) ; /** Updating all mapping **/ updateMappedNode( gnode, remp ) ; @@ -454,7 +475,7 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements authorized = true ; - delGNodeFromList( node ) ; + delGNodeFromList( node, 0 ) ; authorized = false ; @@ -493,7 +514,7 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements * @param _dead The fallen node * @param _remp The replacing node */ - private void propagateReplaceNode( GNode _dead, GNode _remp ) + private void propagateReplaceNode( GNode _dead, GNode _remp ) throws RemoteException { if( _dead != null && _remp != null ) { @@ -513,11 +534,18 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements { if( _g != null ) { - workingOnGnodes() ; + boolean free = false ; + + if( ! operating ) + { + workingOnGnodes() ; + free = true ; + } gnodes.add( _g ) ; - operating = false ; + if( free ) + operating = false ; } } diff --git a/src/jaceP2P/SuperNodeListe.java b/src/jaceP2P/SuperNodeListe.java index 82facfc..df26230 100644 --- a/src/jaceP2P/SuperNodeListe.java +++ b/src/jaceP2P/SuperNodeListe.java @@ -412,7 +412,7 @@ public class SuperNodeListe implements Cloneable { try { ok = ok && remoteStub.blockForMapping() ; } catch( Exception e ) { - System.err.println( "Unable to remove GNode at SuperNode " + d.getIP() ) ; + System.err.println( "Unable to remove GNode on SuperNode " + d.getIP() ) ; } } } @@ -437,7 +437,7 @@ public class SuperNodeListe implements Cloneable { try { remoteStub.setMapping( al ) ; } catch( Exception e ) { - System.err.println( "Unable to set mapping data at SuperNode " + d.getIP() ) ; + System.err.println( "Unable to set mapping data on SuperNode " + d.getIP() ) ; } } } @@ -454,14 +454,14 @@ public class SuperNodeListe implements Cloneable { for( int i = 0 ; i < liste.size() ; i++ ) { d = (SuperNodeData) liste.elementAt( i ) ; - if( ! d.getIP().equals(LocalHost.Instance().getIP() ) ) + if( ! d.getIP().equals( LocalHost.Instance().getIP() ) ) { // if not me, I inform the other super nodes remoteStub = d.getStub() ; try { remoteStub.updateMappedNode( _dead, _remp ) ; } catch( Exception e ) { - System.err.println( "Unable to set mapping data at SuperNode " + d.getIP() ) ; + System.err.println( "Unable to propagate replacing node on SuperNode " + d.getIP() ) ; } } } -- 2.20.1