Logo AND Algorithmique Numérique Distribuée

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