From: Sébastien Miquée Date: Tue, 9 Feb 2010 06:49:01 +0000 (+0100) Subject: Adding / completing mechanisms for fault tolerance. X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/jaceP2P.git/commitdiff_plain/2f8cb53ab8fcc4e0d37bfab739df71432bf68a5e Adding / completing mechanisms for fault tolerance. - Completing function calls for the Mapping library; - Including the resource lock on the gnodes variable, in order to prevent inconsistent states during a mapping function call. --- diff --git a/src/jaceP2P/JaceSuperNodeInterface.java b/src/jaceP2P/JaceSuperNodeInterface.java index 66c1906..9f9573f 100644 --- a/src/jaceP2P/JaceSuperNodeInterface.java +++ b/src/jaceP2P/JaceSuperNodeInterface.java @@ -52,6 +52,8 @@ public interface JaceSuperNodeInterface extends Remote { public void setMapping( Algo al ) throws RemoteException ; + public boolean blockForMapping(); + } /** ! **/ diff --git a/src/jaceP2P/JaceSuperNodeServer.java b/src/jaceP2P/JaceSuperNodeServer.java index de7b876..8809d17 100644 --- a/src/jaceP2P/JaceSuperNodeServer.java +++ b/src/jaceP2P/JaceSuperNodeServer.java @@ -27,6 +27,7 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements private ArrayList gnodes = null; private Algo al = null ; private int count = 0 ; + private boolean inDemand = false, operating = false ; // private boolean daemonListChange ; // Constructors @@ -132,6 +133,9 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements g.setNode(noeud); g.setId( noeud.getId() ) ; + + workingOnGnodes() ; + gnodes.add(g); // daemonListChange = true ; @@ -152,6 +156,8 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements SuperNodeListe.Instance().forwardCountNode(); SuperNodeListe.Instance().addGNode( g ) ; + + operating = false ; } /****************************************************/ @@ -205,6 +211,8 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements /** Creation of an empty new Register **/ Register reg = new Register() ; + workingOnGnodes() ; + /** Initialization of Grid architecture (G5K for now) **/ Grid grid = Utils.createGridG5k(gnodes); grid.initClusters(); @@ -288,36 +296,16 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements } } -// else { -// al = new DefaultMapping( graph, grid, gnodes ) ; -// /** Launching the Mapping **/ -// al.map(); -// -// /** Transforming mapping in register **/ -// Mapping mp = al.getMapping(); -// -// /** Creating the register **/ -// ArrayList ag = mp.getMappedGNodes(); -// -// for (int i = 0; i < ag.size(); i++) { -// reg.addNode((Node) ag.get(i).getNode()); -// gnodes.remove(ag.get(i)); -// Register.Instance().removeNode((Node) ag.get(i).getNode()); -// } -// -// if (ag.size() != 0) { -// SuperNodeListe.Instance().forwardCountNode(); -// } -// return getRegisterSpawner(spawnerIP, nbTasks); -// } // daemonListChange = false ; System.out.println( "Spawner returned reg: " + reg ) ; - /* Mapping distribution over other Super Nodes */ + /** Mapping distribution over other Super Nodes */ SuperNodeListe.Instance().setMapping( al ) ; + operating = false ; + /* Returning result */ return reg ; } @@ -330,55 +318,76 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements protected GNode delGNodeFromList( Node _n ) { - GNode deadGNode = null ; + GNode removedGNode = null ; - for( int i = 0 ; i < gnodes.size() ; i++ ) - { - if( ((Node)gnodes.get(i).getNode()).getId() == _n.getId() ) + if( _n != null ) + { + workingOnGnodes() ; + + for( int i = 0 ; i < gnodes.size() ; i++ ) { - deadGNode = gnodes.remove( i ) ; - break ; + if( ((Node)gnodes.get(i).getNode()).getId() == _n.getId() ) + { + removedGNode = gnodes.remove( i ) ; + break ; + } } - } // daemonListChange = true ; - SuperNodeListe.Instance().removeGNode( deadGNode ) ; + SuperNodeListe.Instance().removeGNode( removedGNode ) ; + + operating = false ; + + } - return deadGNode ; + return removedGNode ; } - + + private void workingOnGnodes() + { + boolean tmp = true ; + + inDemand = false ; + operating = false ; + + while( ! operating ) + { + inDemand = true ; + + tmp = tmp && SuperNodeListe.Instance().workingOnGnodes() ; + + operating = tmp ; + + if( ! tmp ) + { + inDemand = false ; + + try { + Thread.sleep( 10 ) ; + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + + inDemand = false ; + } + + public Node getNewNode( String _spawnerIP, Node _deadNode ) throws RemoteException { Node node = null ; GNode remp = null, gnode = null ; + /** Can we use gnodes ?**/ + workingOnGnodes() ; if( _deadNode != null ) { gnode = delGNodeFromList( _deadNode ) ; - /* TODO */ - Mapping mp = al.getMapping() ; - -// ArrayList mapped = mp.getMappedGNodes() ; - - mp.removeGNode( gnode ) ; - - /*****************/ - // mettre directement dans Algo ! -// for( int i = 0 ; i < mapped.size() ; i++ ) -// { -// gnode = mapped.get( i ) ; -// tmp = (Node) gnode.getNode() ; -// if( tmp.getId() == _deadNode.getId() ) -// { -// mapped.remove( i ) ; -// break ; -// } -// } - remp = al.replaceNode( gnode, gnodes ) ; if( remp != null ) @@ -386,223 +395,45 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements System.out.println( "Replacing node found." ) ; node = (Node) remp.getNode() ; delGNodeFromList( node ) ; -// gnodes.remove( remp ) ; -// Register.Instance().removeNode( node ); SuperNodeListe.Instance().forwardCountNode(); } else { System.err.println( "Replacing node not found !!" ) ; } } else { - remp = al.getOtherGNode() ; + remp = al.getOtherGNode( gnodes ) ; if( remp != null ) { System.out.println( "Other new node found." ) ; node = (Node) remp.getNode() ; delGNodeFromList( node ) ; -// gnodes.remove( remp ) ; -// Register.Instance().removeNode( node ); SuperNodeListe.Instance().forwardCountNode(); } else { System.err.println( "Other new node not found !!" ) ; } } + /** Free the gnodes use **/ + operating = false ; + return node ; } /**********************************************************/ /**********************************************************/ - - -// public Node getNewNode(String spawnerIP) throws RemoteException { -// boolean found = false; -// int i = 0; -// Node tmpNode = null; -// SuperNodeData d = null; -// //int passage = 0; -// String snode_IP; -// JaceSuperNodeInterface stub = null; -// -// try { -// System.out.println("\n" + spawnerIP -// + " (spawner) requests a new node : "); -// while (i < Register.Instance().getSize() && found == false) { -// tmpNode = Register.Instance().getNodeAt(i); -// -// if (tmpNode.getAppliName() == null -// && tmpNode.getAliveFlag() == true) { -// tmpNode.setAppliName("notnull"); -// found = true; -// -// // enlever maintenant le noeud du register de -// // SuperNode?????? -// // System.out.println("je remove le noeud car il va beater le spawner (getNewNode)"); -// // Register.Instance().removeNodeAt(i); -// Register.Instance().removeNode(tmpNode); -// // Register.Instance().removeNode(tmpNode.getIP()); -// -// int index = SuperNodeListe.Instance().existSuperNode( -// LocalHost.Instance().getIP()); -// -// ((SuperNodeData) SuperNodeListe.Instance().getListe() -// .elementAt(index)).setNbOfNodes(Register.Instance() -// .getSize()); -// SuperNodeListe.Instance().forwardCountNode(); -// } -// i++; -// } -// } catch (Exception e1) { -// System.out.println("... plante en cherchant chez moi"); -// } -// -// // Register.Instance().viewAll(); -// SuperNodeListe.Instance().viewAll(); -// -// try { -// // si pas assez de noeud sur ce superNode, -// if (found == false) { -// System.out.println("pas de noeud dispo chez moi"); -// -// SuperNodeListe snodeListTmp = SuperNodeListe.Instance().clone(); -// // while ( (found == false) && (passage < -// // SuperNodeListe.Instance().getSize()) ) { -// while ((found == false) && (snodeListTmp.getSize() > 0)) { -// // System.out.println("passage = " + passage); -// // d = SuperNodeListe.Instance().getBestSuperNodeData(); -// d = snodeListTmp.getBestSuperNodeData(); -// System.out.println("KKKKKKKKKKKKKKK ......... le best c " -// + d.getIP() + " il en a " + d.getNbOfNodes()); -// if (d != null) { -// snode_IP = d.getIP(); -// // si c moi, je passe au suivant -// if (LocalHost.Instance().getIP().equals(snode_IP)) { -// // passage++; -// System.out -// .println("OUUUUPS, c moi dc je tente un autre"); -// snodeListTmp.removeSuperNode(d); -// continue; -// } -// -// stub = d.getStub(); -// -// if (stub != null) { -// try { -// Register tmpReg = stub.reserveLocalNodes(1); -// if (tmpReg != null) { -// // for (int j = 0; j < tmpReg.getSize(); -// // j++) { -// System.out.println("IL EN A 1 !!!!!!!"); -// tmpNode = tmpReg.getNodeAt(0); -// found = true; -// System.out.println("le snode " + snode_IP -// + " me reserve le noeud demande"); -// } else { -// System.out -// .println("MERDE !!! pas de noeud dispo sur " -// + snode_IP); -// System.out -// .println("Je demande un noeud a un autre"); -// } -// -// } catch (Exception e) { -// System.out -// .println("le snode est mort, je demande les noeuds a un autre"); -// // remettre localement a 0 le nb de noeuds de ce -// // superNode -// SuperNodeListe.Instance().modifCountNode( -// snode_IP, 0); -// snodeListTmp = SuperNodeListe.Instance() -// .clone(); -// } -// } -// } else { -// System.out -// .println("PUTAIN !!!! aucun noeud encore dispo sur les snode"); -// // passage = SuperNodeListe.Instance().getSize(); -// } -// // passage++; -// snodeListTmp.removeSuperNode(d); -// } -// } -// } catch (Exception e2) { -// System.out.println("plante en cherchant chez les autres"); -// } -// -// // si pas assez de noeud sur tous les superNode, -// if (found == false) { -// System.out.println("aucun noeud dispo dans le systeme"); -// } else { -// System.out.println("je lui donne son noeud"); -// } -// -// return tmpNode; -// } - -// public Register reserveLocalNodes(int nb) throws RemoteException { -// Register reg = null; -// System.out -// .println("\nA superNode or a Spawner asks me for a register of " -// + nb + " Daemons"); -// -// int count = 0; -// int i = 0; -// Node tmpNode; -// -// if (Register.Instance().getSize() == 0) { -// return new Register(); -// } else { -// reg = new Register(); -// -// while (i < Register.Instance().getSize() && count < nb) { -// tmpNode = Register.Instance().getNodeAt(i); -// -// if (tmpNode.getAppliName() == null -// && tmpNode.getAliveFlag() == true -// /* && tmpNode.getNbOfBeats() > 10 */) { -// // if node available, alive and not recently connected, then -// tmpNode.setAppliName("notnull"); -// reg.addNode(tmpNode); -// -// // remove now the node from SuperNode or later ? -// // System.out.println("I remove the Node from SuperNode beating it will now beat the Spawner"); -// Register.Instance().removeNode(tmpNode); -// count++; -// } -// // increment counter only y Node NOT REMOVED -// else { -// i++; -// } -// } -// -// // Register.Instance().viewAll(); -// System.out.println("Number of Daemons reserved on me : " + count); -// // Inform other SuperNodes that some Daemons initialy registered on -// // me -// // are no longer available because reserved for the spawner that -// // invoked me -// int index = SuperNodeListe.Instance().existSuperNode( -// LocalHost.Instance().getIP()); -// ((SuperNodeData) SuperNodeListe.Instance().getListe().elementAt( -// index)).setNbOfNodes(Register.Instance().getSize()); -// -// if (count != 0) { -// SuperNodeListe.Instance().forwardCountNode(); -// } -// -// System.out.println("I return " + count + " nodes"); -// // System.out.println( reg ) ; -// // SuperNodeListe.Instance().viewAll() ; -// return reg; -// } -// } @Override public void addGNode( GNode _g ) throws RemoteException { if( _g != null ) - gnodes.add( _g ) ; + { + workingOnGnodes() ; + + gnodes.add( _g ) ; + + operating = false ; + } } @@ -611,6 +442,8 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements { if( _g != null ) { + workingOnGnodes() ; + for( int i = 0 ; i < gnodes.size() ; i++ ) { if( ((Node)gnodes.get(i).getNode()).getId() == ((Node)_g.getNode()).getId() ) @@ -619,6 +452,8 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements break ; } } + + operating = false ; } } @@ -629,6 +464,32 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements { al = _al ; } + + @Override + /** + * Allow or deny the use of operations on the gnodes list, in order to + * do a mapping operation. + * @author miquee + * @return The authorization or not to block gnodes + */ + public boolean blockForMapping() + { + while( inDemand ) + { + try { + Thread.sleep( 10 ) ; + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + if( operating ) + { + return false ; + } else { + return true ; + } + } } diff --git a/src/jaceP2P/SuperNodeListe.java b/src/jaceP2P/SuperNodeListe.java index 8dfbe8b..a0b1ca4 100644 --- a/src/jaceP2P/SuperNodeListe.java +++ b/src/jaceP2P/SuperNodeListe.java @@ -393,6 +393,32 @@ public class SuperNodeListe implements Cloneable { } } } + + + protected boolean workingOnGnodes() + { + boolean ok = true ; + + SuperNodeData d = null ; + JaceSuperNodeInterface remoteStub = null ; + + for( int i = 0 ; i < liste.size() ; i++ ) + { + d = (SuperNodeData) liste.elementAt( i ) ; + if( ! d.getIP().equals(LocalHost.Instance().getIP() ) ) + { + // if not me, I inform the other super nodes + remoteStub = d.getStub() ; + try { + ok = ok && remoteStub.blockForMapping() ; + } catch( Exception e ) { + System.err.println( "Unable to remove GNode at SuperNode " + d.getIP() ) ; + } + } + } + + return ok ; + } public void setMapping( Algo al ) {