Mercurial > hg > Members > riono > TreeVNC_ja_comment
annotate src/main/java/jp/ac/u_ryukyu/treevnc/TreeManagement.java @ 333:1be15ac758b4
rename value in lostNodeConnection, add comment.
author | oc |
---|---|
date | Wed, 04 Feb 2015 17:57:22 +0900 |
parents | 42fcc9419498 |
children | dff2f92ae3ff |
rev | line source |
---|---|
206 | 1 package jp.ac.u_ryukyu.treevnc; |
11 | 2 |
153 | 3 |
4 import java.io.IOException; | |
208 | 5 import java.net.InetAddress; |
153 | 6 import java.util.LinkedList; |
11 | 7 |
153 | 8 public class TreeManagement { |
188 | 9 |
231 | 10 public LinkedList<TreeVNCNode> nodeList = new LinkedList<TreeVNCNode>(); |
223 | 11 boolean runflag = false; |
12 private final int treebranch = 2; | |
13 private boolean showTreeNode = false; | |
14 private byte[] netmask; | |
15 private byte[] netaddress; | |
188 | 16 |
223 | 17 public TreeManagement(String hostName, int vncport, boolean showTree) { |
18 TreeVNCNode me = new TreeVNCNode(hostName, vncport,"localhost"); | |
19 showTreeNode = showTree; | |
20 me.setTreeNum(0); | |
21 nodeList.add(me); | |
22 } | |
23 | |
24 // | |
25 // private boolean checkAddress(String line) { | |
26 // String test[] = line.split("\\."); | |
27 // int a = Integer.parseInt(test[0]); | |
28 // int b = Integer.parseInt(test[1]); | |
29 // if ((192 == a && b == 168) || (172 == a && (b > 15 || b < 32)) | |
30 // || 10 == a) { | |
31 // return true; | |
32 // } else { | |
33 // return false; | |
34 // } | |
35 // } | |
11 | 36 |
138 | 37 |
223 | 38 /** |
39 * a parent is lost, remove from the list and move last one into here | |
40 * @param nodeNum | |
41 * parent value | |
42 */ | |
43 private void moveLastNodeToLostNodePosition(int nodeNum) { | |
44 nodeList.remove(nodeNum); | |
328
1a2ab6bd5ba3
add function lost child node, remove deadChild nodeList.
oc
parents:
251
diff
changeset
|
45 if (nodeNum != nodeList.size()) { |
1a2ab6bd5ba3
add function lost child node, remove deadChild nodeList.
oc
parents:
251
diff
changeset
|
46 TreeVNCNode node = nodeList.removeLast(); |
1a2ab6bd5ba3
add function lost child node, remove deadChild nodeList.
oc
parents:
251
diff
changeset
|
47 node.setTreeNum(nodeNum); |
1a2ab6bd5ba3
add function lost child node, remove deadChild nodeList.
oc
parents:
251
diff
changeset
|
48 nodeList.add(nodeNum, node); |
1a2ab6bd5ba3
add function lost child node, remove deadChild nodeList.
oc
parents:
251
diff
changeset
|
49 } |
223 | 50 } |
11 | 51 |
223 | 52 private void checkParameter(int parent, int counter, int leaderflag2) { |
53 System.out.print("number p =" + parent); | |
54 System.out.print(" number i =" + counter); | |
55 System.out.println(" leaderflag=" + leaderflag2 + "\n"); | |
56 } | |
11 | 57 |
223 | 58 private TreeVNCNode getParentNode(int nodeNum) { |
59 int parentnum = (nodeNum - 1) / treebranch; | |
135
ada4d850a820
lostParent and notFoundParenet
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
134
diff
changeset
|
60 return nodeList.get(parentnum); |
223 | 61 } |
62 | |
63 | |
64 public TreeVNCNode getChildNode(TreeVNCNode newparent, int i) { | |
65 int child = newparent.getTreeNum() * treebranch + i + 1; | |
66 if (child >= nodeList.size()) { | |
67 return(null); | |
68 } else { | |
69 return(nodeList.get(child)); | |
70 } | |
328
1a2ab6bd5ba3
add function lost child node, remove deadChild nodeList.
oc
parents:
251
diff
changeset
|
71 } |
223 | 72 |
73 /** | |
74 * A parent is lost, move last node which has no child to the position | |
75 * @param hostname | |
76 * @param port | |
77 * @param myHostName | |
78 */ | |
195 | 79 public void fixLostParent(String hostname, int port, String myHostName) { |
136 | 80 TreeVNCNode lostParentNode = lookup(nodeList,hostname,port); |
328
1a2ab6bd5ba3
add function lost child node, remove deadChild nodeList.
oc
parents:
251
diff
changeset
|
81 if (lostParentNode == null ) return; // something wrong |
136 | 82 int treeNumber = lostParentNode.getTreeNum(); |
172 | 83 TreeVNCNode deadParent = getParentNode(treeNumber); |
223 | 84 TreeVNCNode me = nodeList.getFirst(); |
85 me.setHostName(myHostName); | |
173 | 86 if (deadParent.getTreeNum() == 0) { |
223 | 87 // if dead root, connect me. |
331
42fcc9419498
add error message, add lostParent case by fail to connectTo.
oc
parents:
329
diff
changeset
|
88 connectTo(me, lostParentNode); |
223 | 89 return; |
173 | 90 } |
91 if (getChildNode(deadParent, 0) == null) return; | |
172 | 92 moveLastNodeToLostNodePosition(deadParent.getTreeNum()); |
93 lostNodeConnection(deadParent); | |
136 | 94 // if lostParentNode is the last one, we don't need reconnection |
95 // Thread.sleep(intv_time); | |
96 } | |
54 | 97 |
328
1a2ab6bd5ba3
add function lost child node, remove deadChild nodeList.
oc
parents:
251
diff
changeset
|
98 public void fixLostChild(String hostname, int port, String myHostName, int clientId) { |
329 | 99 System.out.println("fixLostChild"); |
328
1a2ab6bd5ba3
add function lost child node, remove deadChild nodeList.
oc
parents:
251
diff
changeset
|
100 TreeVNCNode lostChildNode = lookup(nodeList, hostname, port); |
1a2ab6bd5ba3
add function lost child node, remove deadChild nodeList.
oc
parents:
251
diff
changeset
|
101 if (lostChildNode == null) return; |
1a2ab6bd5ba3
add function lost child node, remove deadChild nodeList.
oc
parents:
251
diff
changeset
|
102 TreeVNCNode deadChild = getChildNode(lostChildNode, clientId); |
329 | 103 if (deadChild!=null) { |
104 moveLastNodeToLostNodePosition(deadChild.getTreeNum()); | |
105 lostNodeConnection(deadChild); | |
106 } | |
188 | 107 if (showTreeNode) { |
223 | 108 showTreeNode(); |
188 | 109 } |
136 | 110 } |
54 | 111 |
331
42fcc9419498
add error message, add lostParent case by fail to connectTo.
oc
parents:
329
diff
changeset
|
112 /** |
42fcc9419498
add error message, add lostParent case by fail to connectTo.
oc
parents:
329
diff
changeset
|
113 * send reconnect to all children |
42fcc9419498
add error message, add lostParent case by fail to connectTo.
oc
parents:
329
diff
changeset
|
114 * @param deadNode |
42fcc9419498
add error message, add lostParent case by fail to connectTo.
oc
parents:
329
diff
changeset
|
115 */ |
42fcc9419498
add error message, add lostParent case by fail to connectTo.
oc
parents:
329
diff
changeset
|
116 private void lostNodeConnection(TreeVNCNode deadNode) { |
42fcc9419498
add error message, add lostParent case by fail to connectTo.
oc
parents:
329
diff
changeset
|
117 if (nodeList.size() < deadNode.getTreeNum()+1) { |
42fcc9419498
add error message, add lostParent case by fail to connectTo.
oc
parents:
329
diff
changeset
|
118 return; |
42fcc9419498
add error message, add lostParent case by fail to connectTo.
oc
parents:
329
diff
changeset
|
119 } |
333 | 120 TreeVNCNode newNode = nodeList.get(deadNode.getTreeNum()); |
121 TreeVNCNode parentNode = getParentNode(newNode.getTreeNum()); | |
122 // new node connect to parent node. | |
123 connectTo(parentNode, newNode); | |
124 // if children node exist, children connect to new node. | |
331
42fcc9419498
add error message, add lostParent case by fail to connectTo.
oc
parents:
329
diff
changeset
|
125 for(int i=0; i < treebranch; i++) { |
333 | 126 TreeVNCNode child = getChildNode(newNode, i); |
331
42fcc9419498
add error message, add lostParent case by fail to connectTo.
oc
parents:
329
diff
changeset
|
127 if (child != null) { |
333 | 128 connectTo(newNode, child); |
331
42fcc9419498
add error message, add lostParent case by fail to connectTo.
oc
parents:
329
diff
changeset
|
129 } |
42fcc9419498
add error message, add lostParent case by fail to connectTo.
oc
parents:
329
diff
changeset
|
130 } |
42fcc9419498
add error message, add lostParent case by fail to connectTo.
oc
parents:
329
diff
changeset
|
131 } |
173 | 132 |
133 | |
331
42fcc9419498
add error message, add lostParent case by fail to connectTo.
oc
parents:
329
diff
changeset
|
134 |
42fcc9419498
add error message, add lostParent case by fail to connectTo.
oc
parents:
329
diff
changeset
|
135 public void connectTo(TreeVNCNode newparent, TreeVNCNode n) { |
223 | 136 TreeVncProtocol vc1 = new TreeVncProtocol(n.getHostname(),n.getPort()); |
137 short nodeId = (short) n.getTreeNum(); | |
138 vc1.connectTo(newparent.getHostname(), newparent.getPort(), isLeader(n), nodeId); | |
139 } | |
173 | 140 |
136 | 141 private int isLeader(TreeVNCNode n) { |
142 return ( n.getTreeNum() % treebranch == 1) ? 1 : 0; | |
143 } | |
144 | |
145 private TreeVNCNode lookup(LinkedList<TreeVNCNode> list, String hostname, int port) { | |
223 | 146 for (TreeVNCNode r : list) { |
147 if (r.getHostname().equals(hostname) && r.getPort() == port ) | |
148 return r; | |
149 } | |
150 return null; | |
136 | 151 } |
135
ada4d850a820
lostParent and notFoundParenet
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
134
diff
changeset
|
152 |
223 | 153 /** |
154 * Determine tree topology and send CONNECT_TO command | |
155 * @param hostname | |
156 * @param port | |
157 */ | |
158 public void decideWhereToConnect(String hostname, int port, String localhostname) { | |
147 | 159 TreeVNCNode node = new TreeVNCNode(hostname,port,localhostname); |
136 | 160 node.setTreeNum(nodeList.size()); |
161 nodeList.add(node); | |
223 | 162 if (nodeList.size() >= treebranch + 1) { |
163 TreeVNCNode parent = getParentNode(node.getTreeNum()); | |
164 checkParameter(parent.getTreeNum(), nodeList.size(), isLeader(node)); | |
331
42fcc9419498
add error message, add lostParent case by fail to connectTo.
oc
parents:
329
diff
changeset
|
165 connectTo(parent, node); |
223 | 166 } else { |
167 // connect to me | |
168 TreeVNCNode me = nodeList.getFirst(); | |
169 me.setHostName(localhostname); | |
331
42fcc9419498
add error message, add lostParent case by fail to connectTo.
oc
parents:
329
diff
changeset
|
170 connectTo(me, node); |
223 | 171 } |
172 if (showTreeNode) { | |
173 showTreeNode(); | |
174 } | |
175 } | |
176 | |
177 /** | |
178 * show Tree Node. | |
179 */ | |
180 public void showTreeNode() { | |
181 int nl = 0, pow = 2; | |
163 | 182 for (int i=0; i<nodeList.size(); i++) { |
223 | 183 TreeVNCNode treeNode = nodeList.get(i); |
184 System.out.print(treeNode.getTreeNum() + ":" + treeNode.getPort() + ":" + treeNode.getHostname()); | |
185 if (i==nl) { | |
186 System.out.println(); | |
187 nl = nl + pow; | |
188 pow = pow * pow; | |
189 } else { | |
190 System.out.print(" "); | |
191 } | |
172 | 192 |
163 | 193 } |
188 | 194 System.out.println(); |
223 | 195 } |
11 | 196 |
223 | 197 public LinkedList<TreeVNCNode> getList() { |
198 return nodeList; | |
199 } | |
54 | 200 |
223 | 201 public void setList(LinkedList<TreeVNCNode> _ls) { |
202 nodeList = _ls; | |
203 } | |
54 | 204 |
223 | 205 public int getTreeBranch() { |
206 return treebranch; | |
207 } | |
136 | 208 |
223 | 209 public void setNetMask(byte[] netmask,byte[] netaddress) { |
210 this.netmask = netmask; | |
211 this.netaddress = netaddress; | |
212 } | |
213 | |
214 public boolean onTheSameNetwork(InetAddress adr ) { | |
215 byte [] byteadr = adr.getAddress(); | |
216 if (byteadr.length != netmask.length) return false; | |
217 for(int i=0; i < netmask.length; i++) { | |
218 if ((netmask[i] & byteadr[i])!=netaddress[i]) return false; | |
219 } | |
220 return true; | |
221 } | |
208 | 222 |
54 | 223 } |