Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Adapatation for fault tolerance with the Mapping library.
[jaceP2P.git] / src / jaceP2P / TokenThread.java
1 package jaceP2P;
2
3 import java.rmi.RemoteException;
4 import java.util.ArrayList;
5 import java.util.Vector;
6 import and.Mapping.*;
7
8 public class TokenThread extends Thread {
9
10         public static TokenThread Instance = null;
11
12         public boolean token = false;
13
14         public TokenThread() {
15         }
16
17         public boolean getToken() {
18                 return token;
19         }
20
21         public static TokenThread Instance() {
22
23                 if (Instance == null)
24                         Instance = new TokenThread();
25                 return Instance;
26         }
27
28         public void run() {
29
30                 while (true) {
31                         try {
32                                 Thread.sleep(2000);
33                                 // System.out.println("TokenThread still alive");
34                                 if (token) {
35                                         // System.out.println("distribute!!!!");
36                                         distribute();
37                                 } else {
38                                         // System.out.println("waiting !!!! token="+token);
39                                         wait();
40
41                                 }
42                         } catch (Exception e) {
43                         }
44                 }
45         }
46
47         public void setToken() {
48                 token = true;
49                 ScanThreadSuperNode.Instance().setToken(false);
50                 System.out.println("The token is put to true in the tokenthread");
51                 try {
52                         synchronized (TokenThread.Instance()) {
53                                 TokenThread.Instance().notify();
54                         }
55                 } catch (Exception e) {
56                         System.err.println("Unable to notify :" + e);
57                 }
58                 // System.out.println("finished set token");
59         }
60
61         @SuppressWarnings("unchecked")
62         public void distribute() {
63                 System.out.println("totalDaemons="
64                                 + SuperNodeListe.Instance().getTotalDaemons());
65                 int nbLocal = Register.Instance().getSize();
66                 int totalDaemons;
67                 Vector liste = SuperNodeListe.Instance().getListe();
68                 
69                 /******* Sébastien Miquée ********/
70                 ArrayList<GNode> gnodes = null ;
71                 try {
72                         gnodes = SuperNodeListe.Instance().getStubOf(LocalHost.Instance().getIP()).getGNodes() ;
73                 } catch (RemoteException e1) {
74                         System.err.println( "Unable to retrieve local gnodes list !" ) ;
75                         e1.printStackTrace();
76                 }
77                 
78                 synchronized (SuperNodeListe.Instance()) {
79                         synchronized (Register.Instance()) {
80                                 if (nbLocal > 5) {
81                                         totalDaemons = SuperNodeListe.Instance().getTotalDaemons();
82                                         int nbDaemons = totalDaemons / liste.size();
83                                         // System.out.println("nbDaemons="+nbDaemons+" totalDaemons="+totalDaemons+" nbLocal="+nbLocal);
84                                         if (nbDaemons < nbLocal)
85                                                 for (int i = 0; i < liste.size(); i++)
86                                                         if (((SuperNodeData) liste.get(i)).getNbOfNodes() < nbDaemons)
87                                                                 try {
88                                                                         // System.out.println("Snode="+i+" nodes="+((SuperNodeData)liste.get(i)).getNbOfNodes());
89                                                                         Vector nodes = Register.Instance()
90                                                                                         .getListe();
91                                                                         int amountToSend = nbDaemons
92                                                                                         - ((SuperNodeData) liste.get(i))
93                                                                                                         .getNbOfNodes();
94                                                                         Vector newVector = new Vector();
95                                                                         for (int j = 0; j < amountToSend; j++) {
96                                                                                 newVector.add(nodes.elementAt(j));
97                                                                         }
98                                                                         ((SuperNodeData) liste.get(i)).getStub()
99                                                                                         .sendSurplus(newVector, gnodes);
100                                                                         for (int j = 0; j < amountToSend; j++)
101                                                                                 nodes.remove(0);
102                                                                         int index = SuperNodeListe.Instance()
103                                                                                         .existSuperNode(
104                                                                                                         LocalHost.Instance()
105                                                                                                                         .getIP());
106                                                                         ((SuperNodeData) SuperNodeListe.Instance()
107                                                                                         .getListe().get(index))
108                                                                                         .setNbOfNodes(Register.Instance()
109                                                                                                         .getSize());
110                                                                         System.out.println("size reg="
111                                                                                         + Register.Instance().getSize()
112                                                                                         + " liste="
113                                                                                         + ((SuperNodeData) SuperNodeListe
114                                                                                                         .Instance().getListe().get(
115                                                                                                                         index))
116                                                                                                         .getNbOfNodes());
117                                                                         new ForwardCount().start();
118                                                                 } catch (Exception e) {
119
120                                                                         System.err
121                                                                                         .println("Unable to send surplus to "
122                                                                                                         + ((SuperNodeData) liste
123                                                                                                                         .get(i)).getIP()
124                                                                                                         + " :" + e);
125                                                                 }
126
127                                 }
128                         }
129                 }
130                 boolean sendToken = true;
131                 while (sendToken) {
132                         // index of local node
133                         int index = SuperNodeListe.Instance().existSuperNode(
134                                         LocalHost.Instance().getIP());
135                         // index of next node
136
137                         // System.out.println("index="+index);
138                         // System.out.println(SuperNodeListe.Instance().getListe().size());
139                         // System.out.println(((SuperNodeData)SuperNodeListe.Instance().getListe().elementAt(0)).getIP());
140                         index = (index + 1) % SuperNodeListe.Instance().getListe().size();
141                         // System.out.println("index="+index);
142                         try {
143                                 ((SuperNodeData) liste.elementAt(index)).getStub().setToken();
144                                 if (index != SuperNodeListe.Instance().existSuperNode(
145                                                 LocalHost.Instance().getIP()))
146                                         token = false;
147                                 sendToken = false;
148                                 System.out.println("Passing token to " + index);
149                         } catch (Exception e) {
150                                 try {
151                                         System.err.println("Unable to send Token to "
152                                                         + ((SuperNodeData) liste.elementAt(index)).getIP()
153                                                         + " :" + e);
154                                         /*
155                                          * SuperNodeListe.Instance().removeSuperNode(((SuperNodeData)
156                                          * liste.elementAt(index)));
157                                          * 
158                                          * try{ for(int
159                                          * i=0;i<SuperNodeListe.Instance().getListe().size();i++)
160                                          * 
161                                          * ((SuperNodeData)SuperNodeListe.Instance().getListe().
162                                          * elementAt
163                                          * (i)).getStub.removeSuperNode(((SuperNodeData)liste
164                                          * .elementAt(index)));
165                                          * 
166                                          * }catch(Exception e2){System.out.println(
167                                          * "diffuse the message concerning a dead superNode: "+e2);
168                                          * } if(index==SuperNodeListe.Instance().getListe().size())
169                                          * index=0;
170                                          * HeartBeatThread.Instance().setServer(((SuperNodeData
171                                          * )liste.elementAt(index)).getStub()); try{
172                                          */
173
174                                         Thread.sleep(HeartBeatSNode.Instance().getHeartTime());
175                                 } catch (Exception e2) {
176                                         System.out.println("-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_");
177                                 }
178                         }
179                 }
180         }
181 }