annotate src/main/java/jp/ac/u_ryukyu/treevnc/TreeManagement.java @ 464:a817fa255673

fix onTheSame Network
author kono
date Tue, 12 Jul 2016 18:52:27 +0900
parents 5bef0f09f088
children f7210f834403
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
206
2b3eb4a9492f MyRfbProto reorganization
oc
parents: 195
diff changeset
1 package jp.ac.u_ryukyu.treevnc;
11
57ae9fbb1245 add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2
153
e68dfd1972ac fix bad names.
oc
parents: 147
diff changeset
3
e68dfd1972ac fix bad names.
oc
parents: 147
diff changeset
4 import java.io.IOException;
208
f1d7cb4a1868 compute netmask and netaddress
oc
parents: 206
diff changeset
5 import java.net.InetAddress;
337
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
6 import java.net.UnknownHostException;
153
e68dfd1972ac fix bad names.
oc
parents: 147
diff changeset
7 import java.util.LinkedList;
11
57ae9fbb1245 add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8
153
e68dfd1972ac fix bad names.
oc
parents: 147
diff changeset
9 public class TreeManagement {
188
f176bffcdc4a add showTreeNode option.
oc
parents: 178
diff changeset
10
462
b5459c7c8e4d only one treeManager in a network interface
kono
parents: 427
diff changeset
11
b5459c7c8e4d only one treeManager in a network interface
kono
parents: 427
diff changeset
12 private final int treeId;
231
0e0e6744432c get new nodeList for checkDelay.
oc
parents: 223
diff changeset
13 public LinkedList<TreeVNCNode> nodeList = new LinkedList<TreeVNCNode>();
463
5bef0f09f088 create NetworkAddress class
mir3636
parents: 462
diff changeset
14 public LinkedList<NetworkAddress> treeAddresses = new LinkedList<NetworkAddress>();
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
15 private final int treebranch = 2;
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
16 private boolean showTreeNode = false;
462
b5459c7c8e4d only one treeManager in a network interface
kono
parents: 427
diff changeset
17 // node id
b5459c7c8e4d only one treeManager in a network interface
kono
parents: 427
diff changeset
18 // ttttnnnnnnnnnnnn
b5459c7c8e4d only one treeManager in a network interface
kono
parents: 427
diff changeset
19 // tttt 4bit tree number
b5459c7c8e4d only one treeManager in a network interface
kono
parents: 427
diff changeset
20 // nnnnnnnnnnnn 12bit node number
b5459c7c8e4d only one treeManager in a network interface
kono
parents: 427
diff changeset
21 public final int MAX_TREE = 15;
b5459c7c8e4d only one treeManager in a network interface
kono
parents: 427
diff changeset
22 public final int MAX_TREE_NODE = (1<<12)-1;
188
f176bffcdc4a add showTreeNode option.
oc
parents: 178
diff changeset
23
462
b5459c7c8e4d only one treeManager in a network interface
kono
parents: 427
diff changeset
24 public TreeManagement(String hostName, int vncport, boolean showTree, int id) {
b5459c7c8e4d only one treeManager in a network interface
kono
parents: 427
diff changeset
25 treeId = id;
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
26 TreeVNCNode me = new TreeVNCNode(hostName, vncport,"localhost");
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
27 showTreeNode = showTree;
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
28 me.setTreeNum(0);
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
29 nodeList.add(me);
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
30 }
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
31
463
5bef0f09f088 create NetworkAddress class
mir3636
parents: 462
diff changeset
32 private class NetworkAddress {
5bef0f09f088 create NetworkAddress class
mir3636
parents: 462
diff changeset
33 InetAddress inetaddress;
5bef0f09f088 create NetworkAddress class
mir3636
parents: 462
diff changeset
34 byte [] address;
5bef0f09f088 create NetworkAddress class
mir3636
parents: 462
diff changeset
35 byte [] netmask;
5bef0f09f088 create NetworkAddress class
mir3636
parents: 462
diff changeset
36
5bef0f09f088 create NetworkAddress class
mir3636
parents: 462
diff changeset
37 public NetworkAddress(InetAddress ipaddress, byte[] netaddress, byte[] netmask) {
5bef0f09f088 create NetworkAddress class
mir3636
parents: 462
diff changeset
38 inetaddress = ipaddress;
5bef0f09f088 create NetworkAddress class
mir3636
parents: 462
diff changeset
39 address = netaddress;
5bef0f09f088 create NetworkAddress class
mir3636
parents: 462
diff changeset
40 this.netmask = netmask;
5bef0f09f088 create NetworkAddress class
mir3636
parents: 462
diff changeset
41 }
5bef0f09f088 create NetworkAddress class
mir3636
parents: 462
diff changeset
42 }
5bef0f09f088 create NetworkAddress class
mir3636
parents: 462
diff changeset
43
462
b5459c7c8e4d only one treeManager in a network interface
kono
parents: 427
diff changeset
44 public int getTreeId() {
b5459c7c8e4d only one treeManager in a network interface
kono
parents: 427
diff changeset
45 return treeId;
b5459c7c8e4d only one treeManager in a network interface
kono
parents: 427
diff changeset
46 }
138
c3761c896607 minor fix
oc
parents: 136
diff changeset
47
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
48 /**
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
49 * a parent is lost, remove from the list and move last one into here
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
50 * @param nodeNum
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
51 * parent value
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
52 */
418
0543c380308c Move bottleneck Node to outside node list
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 342
diff changeset
53 public void moveLastNodeToLostNodePosition(int nodeNum) {
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
54 nodeList.remove(nodeNum);
328
1a2ab6bd5ba3 add function lost child node, remove deadChild nodeList.
oc
parents: 251
diff changeset
55 if (nodeNum != nodeList.size()) {
1a2ab6bd5ba3 add function lost child node, remove deadChild nodeList.
oc
parents: 251
diff changeset
56 TreeVNCNode node = nodeList.removeLast();
1a2ab6bd5ba3 add function lost child node, remove deadChild nodeList.
oc
parents: 251
diff changeset
57 node.setTreeNum(nodeNum);
1a2ab6bd5ba3 add function lost child node, remove deadChild nodeList.
oc
parents: 251
diff changeset
58 nodeList.add(nodeNum, node);
1a2ab6bd5ba3 add function lost child node, remove deadChild nodeList.
oc
parents: 251
diff changeset
59 }
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
60 }
11
57ae9fbb1245 add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
61
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
62 private void checkParameter(int parent, int counter, int leaderflag2) {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
63 System.out.print("number p =" + parent);
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
64 System.out.print(" number i =" + counter);
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
65 System.out.println(" leaderflag=" + leaderflag2 + "\n");
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
66 }
11
57ae9fbb1245 add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
67
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
68 private TreeVNCNode getParentNode(int nodeNum) {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
69 int parentnum = (nodeNum - 1) / treebranch;
135
ada4d850a820 lostParent and notFoundParenet
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
70 return nodeList.get(parentnum);
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
71 }
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
72
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
73
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
74 public TreeVNCNode getChildNode(TreeVNCNode newparent, int i) {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
75 int child = newparent.getTreeNum() * treebranch + i + 1;
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
76 if (child >= nodeList.size()) {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
77 return(null);
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
78 } else {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
79 return(nodeList.get(child));
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
80 }
328
1a2ab6bd5ba3 add function lost child node, remove deadChild nodeList.
oc
parents: 251
diff changeset
81 }
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
82
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
83 /**
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
84 * A parent is lost, move last node which has no child to the position
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
85 * @param hostname
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
86 * @param port
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
87 * @param myHostName
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
88 */
195
a204b53a30c7 set connectTo localhostname.
oc
parents: 188
diff changeset
89 public void fixLostParent(String hostname, int port, String myHostName) {
136
81b558b38b9f reconnection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 135
diff changeset
90 TreeVNCNode lostParentNode = lookup(nodeList,hostname,port);
328
1a2ab6bd5ba3 add function lost child node, remove deadChild nodeList.
oc
parents: 251
diff changeset
91 if (lostParentNode == null ) return; // something wrong
136
81b558b38b9f reconnection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 135
diff changeset
92 int treeNumber = lostParentNode.getTreeNum();
172
73c42f9d04a8 fix send connectTo command when lostNodeConnection.
oc
parents: 169
diff changeset
93 TreeVNCNode deadParent = getParentNode(treeNumber);
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
94 TreeVNCNode me = nodeList.getFirst();
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
95 me.setHostName(myHostName);
173
70068c2642de fix lostParent.
oc
parents: 172
diff changeset
96 if (deadParent.getTreeNum() == 0) {
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
97 // if dead root, connect me.
337
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
98 try {
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
99 connectTo(me, lostParentNode);
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
100 } catch (IOException e) {
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
101 e.printStackTrace();
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
102 }
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
103 return;
173
70068c2642de fix lostParent.
oc
parents: 172
diff changeset
104 }
70068c2642de fix lostParent.
oc
parents: 172
diff changeset
105 if (getChildNode(deadParent, 0) == null) return;
172
73c42f9d04a8 fix send connectTo command when lostNodeConnection.
oc
parents: 169
diff changeset
106 moveLastNodeToLostNodePosition(deadParent.getTreeNum());
73c42f9d04a8 fix send connectTo command when lostNodeConnection.
oc
parents: 169
diff changeset
107 lostNodeConnection(deadParent);
136
81b558b38b9f reconnection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 135
diff changeset
108 // if lostParentNode is the last one, we don't need reconnection
81b558b38b9f reconnection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 135
diff changeset
109 // Thread.sleep(intv_time);
81b558b38b9f reconnection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 135
diff changeset
110 }
54
0ae87c7e767c bug fix
one
parents: 53
diff changeset
111
328
1a2ab6bd5ba3 add function lost child node, remove deadChild nodeList.
oc
parents: 251
diff changeset
112 public void fixLostChild(String hostname, int port, String myHostName, int clientId) {
1a2ab6bd5ba3 add function lost child node, remove deadChild nodeList.
oc
parents: 251
diff changeset
113 TreeVNCNode lostChildNode = lookup(nodeList, hostname, port);
1a2ab6bd5ba3 add function lost child node, remove deadChild nodeList.
oc
parents: 251
diff changeset
114 if (lostChildNode == null) return;
334
dff2f92ae3ff change lost left/right child to lost child.
oc
parents: 333
diff changeset
115 int lostChildNodeNum;
dff2f92ae3ff change lost left/right child to lost child.
oc
parents: 333
diff changeset
116 // if isTreeManager
dff2f92ae3ff change lost left/right child to lost child.
oc
parents: 333
diff changeset
117 if (lostChildNode.getTreeNum() == 0) {
dff2f92ae3ff change lost left/right child to lost child.
oc
parents: 333
diff changeset
118 lostChildNodeNum = clientId + 1;
dff2f92ae3ff change lost left/right child to lost child.
oc
parents: 333
diff changeset
119 } else {
dff2f92ae3ff change lost left/right child to lost child.
oc
parents: 333
diff changeset
120 lostChildNodeNum = (lostChildNode.getTreeNum() * treebranch) + clientId + 1;
dff2f92ae3ff change lost left/right child to lost child.
oc
parents: 333
diff changeset
121 }
dff2f92ae3ff change lost left/right child to lost child.
oc
parents: 333
diff changeset
122 TreeVNCNode deadChild;
423
ffe01c959cdd Fix LostChild for root node
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 418
diff changeset
123 fixLostChild1(lostChildNodeNum);
136
81b558b38b9f reconnection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 135
diff changeset
124 }
54
0ae87c7e767c bug fix
one
parents: 53
diff changeset
125
427
ed15f0bd8dfa Remove shareScrrenNumber for ScreenChangeRequest Message
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 423
diff changeset
126 public void fixLostChild1(int nodeNum) {
ed15f0bd8dfa Remove shareScrrenNumber for ScreenChangeRequest Message
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 423
diff changeset
127 TreeVNCNode deadNode;
ed15f0bd8dfa Remove shareScrrenNumber for ScreenChangeRequest Message
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 423
diff changeset
128 try {
ed15f0bd8dfa Remove shareScrrenNumber for ScreenChangeRequest Message
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 423
diff changeset
129 deadNode = nodeList.get(nodeNum);
ed15f0bd8dfa Remove shareScrrenNumber for ScreenChangeRequest Message
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 423
diff changeset
130 } catch (IndexOutOfBoundsException e) {
ed15f0bd8dfa Remove shareScrrenNumber for ScreenChangeRequest Message
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 423
diff changeset
131 // this node became new node instead of deathChild.
ed15f0bd8dfa Remove shareScrrenNumber for ScreenChangeRequest Message
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 423
diff changeset
132 deadNode = null;
ed15f0bd8dfa Remove shareScrrenNumber for ScreenChangeRequest Message
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 423
diff changeset
133 }
ed15f0bd8dfa Remove shareScrrenNumber for ScreenChangeRequest Message
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 423
diff changeset
134 if (deadNode != null) {
ed15f0bd8dfa Remove shareScrrenNumber for ScreenChangeRequest Message
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 423
diff changeset
135 moveLastNodeToLostNodePosition(deadNode.getTreeNum());
ed15f0bd8dfa Remove shareScrrenNumber for ScreenChangeRequest Message
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 423
diff changeset
136 lostNodeConnection(deadNode);
ed15f0bd8dfa Remove shareScrrenNumber for ScreenChangeRequest Message
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 423
diff changeset
137 }
ed15f0bd8dfa Remove shareScrrenNumber for ScreenChangeRequest Message
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 423
diff changeset
138 if (showTreeNode) {
ed15f0bd8dfa Remove shareScrrenNumber for ScreenChangeRequest Message
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 423
diff changeset
139 showTreeNode();
ed15f0bd8dfa Remove shareScrrenNumber for ScreenChangeRequest Message
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 423
diff changeset
140 }
ed15f0bd8dfa Remove shareScrrenNumber for ScreenChangeRequest Message
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 423
diff changeset
141 }
ed15f0bd8dfa Remove shareScrrenNumber for ScreenChangeRequest Message
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 423
diff changeset
142
331
42fcc9419498 add error message, add lostParent case by fail to connectTo.
oc
parents: 329
diff changeset
143 /**
42fcc9419498 add error message, add lostParent case by fail to connectTo.
oc
parents: 329
diff changeset
144 * send reconnect to all children
42fcc9419498 add error message, add lostParent case by fail to connectTo.
oc
parents: 329
diff changeset
145 * @param deadNode
42fcc9419498 add error message, add lostParent case by fail to connectTo.
oc
parents: 329
diff changeset
146 */
418
0543c380308c Move bottleneck Node to outside node list
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 342
diff changeset
147 public void lostNodeConnection(TreeVNCNode deadNode) {
331
42fcc9419498 add error message, add lostParent case by fail to connectTo.
oc
parents: 329
diff changeset
148 if (nodeList.size() < deadNode.getTreeNum()+1) {
42fcc9419498 add error message, add lostParent case by fail to connectTo.
oc
parents: 329
diff changeset
149 return;
42fcc9419498 add error message, add lostParent case by fail to connectTo.
oc
parents: 329
diff changeset
150 }
333
1be15ac758b4 rename value in lostNodeConnection, add comment.
oc
parents: 331
diff changeset
151 TreeVNCNode newNode = nodeList.get(deadNode.getTreeNum());
1be15ac758b4 rename value in lostNodeConnection, add comment.
oc
parents: 331
diff changeset
152 TreeVNCNode parentNode = getParentNode(newNode.getTreeNum());
1be15ac758b4 rename value in lostNodeConnection, add comment.
oc
parents: 331
diff changeset
153 // new node connect to parent node.
337
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
154 try {
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
155 connectTo(parentNode, newNode);
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
156 } catch (IOException e) {
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
157 e.printStackTrace();
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
158 }
333
1be15ac758b4 rename value in lostNodeConnection, add comment.
oc
parents: 331
diff changeset
159 // 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
160 for(int i=0; i < treebranch; i++) {
333
1be15ac758b4 rename value in lostNodeConnection, add comment.
oc
parents: 331
diff changeset
161 TreeVNCNode child = getChildNode(newNode, i);
331
42fcc9419498 add error message, add lostParent case by fail to connectTo.
oc
parents: 329
diff changeset
162 if (child != null) {
337
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
163 try {
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
164 connectTo(newNode, child);
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
165 } catch (IOException e) {
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
166 e.printStackTrace();
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
167 }
331
42fcc9419498 add error message, add lostParent case by fail to connectTo.
oc
parents: 329
diff changeset
168 }
42fcc9419498 add error message, add lostParent case by fail to connectTo.
oc
parents: 329
diff changeset
169 }
42fcc9419498 add error message, add lostParent case by fail to connectTo.
oc
parents: 329
diff changeset
170 }
173
70068c2642de fix lostParent.
oc
parents: 172
diff changeset
171
337
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
172 public void connectTo(TreeVNCNode newparent, TreeVNCNode n) throws IOException {
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
173 TreeVncProtocol vc1 = new TreeVncProtocol(n.getHostname(),n.getPort());
462
b5459c7c8e4d only one treeManager in a network interface
kono
parents: 427
diff changeset
174 short nodeId = (short) ( n.getTreeNum() + ( treeId << 12 ));
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
175 vc1.connectTo(newparent.getHostname(), newparent.getPort(), isLeader(n), nodeId);
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
176 }
173
70068c2642de fix lostParent.
oc
parents: 172
diff changeset
177
136
81b558b38b9f reconnection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 135
diff changeset
178 private int isLeader(TreeVNCNode n) {
81b558b38b9f reconnection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 135
diff changeset
179 return ( n.getTreeNum() % treebranch == 1) ? 1 : 0;
81b558b38b9f reconnection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 135
diff changeset
180 }
81b558b38b9f reconnection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 135
diff changeset
181
81b558b38b9f reconnection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 135
diff changeset
182 private TreeVNCNode lookup(LinkedList<TreeVNCNode> list, String hostname, int port) {
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
183 for (TreeVNCNode r : list) {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
184 if (r.getHostname().equals(hostname) && r.getPort() == port )
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
185 return r;
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
186 }
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
187 return null;
136
81b558b38b9f reconnection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 135
diff changeset
188 }
135
ada4d850a820 lostParent and notFoundParenet
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
189
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
190 /**
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
191 * Determine tree topology and send CONNECT_TO command
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
192 * @param hostname
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
193 * @param port
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
194 */
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
195 public void decideWhereToConnect(String hostname, int port, String localhostname) {
423
ffe01c959cdd Fix LostChild for root node
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 418
diff changeset
196 TreeVNCNode node = new TreeVNCNode(hostname, port, localhostname);
136
81b558b38b9f reconnection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 135
diff changeset
197 node.setTreeNum(nodeList.size());
337
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
198
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
199 InetAddress ipAddress = null;
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
200 try {
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
201 ipAddress = InetAddress.getByName(hostname);
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
202 } catch (UnknownHostException e) {
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
203 System.out.println("root : whereToConnect : cannot get ipAddress" + hostname);
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
204 return;
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
205 }
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
206 if (onTheSameNetwork(ipAddress))
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
207 nodeList.add(node);
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
208 if (nodeList.size() >= treebranch + 1) {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
209 TreeVNCNode parent = getParentNode(node.getTreeNum());
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
210 checkParameter(parent.getTreeNum(), nodeList.size(), isLeader(node));
337
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
211 try {
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
212 connectTo(parent, node);
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
213 } catch (IOException e) {
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
214 nodeList.remove(node);
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
215 System.out.println("root : whereToConnect : Connection Faild" + hostname);
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
216 return;
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
217 }
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
218 } else {
337
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
219 // connect to me
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
220 TreeVNCNode me = nodeList.getFirst();
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
221 me.setHostName(localhostname);
337
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
222 try {
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
223 connectTo(me, node);
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
224 } catch (IOException e) {
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
225 nodeList.remove(node);
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
226 System.out.println("root : whereToConnect : Connection Faild" + hostname);
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
227 return;
c455b05f163b in decideWhereToConnect, host on a different network isn't add to nodeList.
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 334
diff changeset
228 }
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
229 }
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
230 if (showTreeNode) {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
231 showTreeNode();
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
232 }
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
233 }
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
234
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
235 /**
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
236 * show Tree Node.
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
237 */
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
238 public void showTreeNode() {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
239 int nl = 0, pow = 2;
163
c850c2fce039 add showTreeNode method.
oc
parents: 153
diff changeset
240 for (int i=0; i<nodeList.size(); i++) {
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
241 TreeVNCNode treeNode = nodeList.get(i);
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
242 System.out.print(treeNode.getTreeNum() + ":" + treeNode.getPort() + ":" + treeNode.getHostname());
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
243 if (i==nl) {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
244 System.out.println();
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
245 nl = nl + pow;
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
246 pow = pow * pow;
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
247 } else {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
248 System.out.print(" ");
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
249 }
172
73c42f9d04a8 fix send connectTo command when lostNodeConnection.
oc
parents: 169
diff changeset
250
163
c850c2fce039 add showTreeNode method.
oc
parents: 153
diff changeset
251 }
188
f176bffcdc4a add showTreeNode option.
oc
parents: 178
diff changeset
252 System.out.println();
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
253 }
11
57ae9fbb1245 add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
254
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
255 public LinkedList<TreeVNCNode> getList() {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
256 return nodeList;
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
257 }
54
0ae87c7e767c bug fix
one
parents: 53
diff changeset
258
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
259 public void setList(LinkedList<TreeVNCNode> _ls) {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
260 nodeList = _ls;
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
261 }
54
0ae87c7e767c bug fix
one
parents: 53
diff changeset
262
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
263 public int getTreeBranch() {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
264 return treebranch;
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
265 }
136
81b558b38b9f reconnection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 135
diff changeset
266
463
5bef0f09f088 create NetworkAddress class
mir3636
parents: 462
diff changeset
267 public void setNetMask(byte[] netmask, byte[] netaddress, InetAddress ipaddress) {
5bef0f09f088 create NetworkAddress class
mir3636
parents: 462
diff changeset
268 treeAddresses.add(new NetworkAddress(ipaddress,netaddress,netmask) );
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
269 }
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
270
342
4c670edf3065 fix setting remote id
oc
parents: 337
diff changeset
271 public boolean onTheSameNetwork(InetAddress adr) {
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
272 byte [] byteadr = adr.getAddress();
463
5bef0f09f088 create NetworkAddress class
mir3636
parents: 462
diff changeset
273 for (NetworkAddress n : treeAddresses) {
5bef0f09f088 create NetworkAddress class
mir3636
parents: 462
diff changeset
274 byte [] netmask = n.netmask;
5bef0f09f088 create NetworkAddress class
mir3636
parents: 462
diff changeset
275 byte [] netaddress = n.address;
5bef0f09f088 create NetworkAddress class
mir3636
parents: 462
diff changeset
276 if (byteadr.length != netmask.length) continue;
464
a817fa255673 fix onTheSame Network
kono
parents: 463
diff changeset
277 int i;
a817fa255673 fix onTheSame Network
kono
parents: 463
diff changeset
278 for (i = 0; i < netmask.length; i++) {
a817fa255673 fix onTheSame Network
kono
parents: 463
diff changeset
279 if ((netmask[i] & byteadr[i]) != netaddress[i]) break;
463
5bef0f09f088 create NetworkAddress class
mir3636
parents: 462
diff changeset
280 }
464
a817fa255673 fix onTheSame Network
kono
parents: 463
diff changeset
281 if (i < netmask.length) continue;
463
5bef0f09f088 create NetworkAddress class
mir3636
parents: 462
diff changeset
282 return true;
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
283 }
463
5bef0f09f088 create NetworkAddress class
mir3636
parents: 462
diff changeset
284 return false;
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
285 }
54
0ae87c7e767c bug fix
one
parents: 53
diff changeset
286 }