Mercurial > hg > Database > Alice
annotate src/main/java/alice/topology/manager/keeparive/TaskExecuter.java @ 599:3284428f525e dispose
add MetaCodeSegment & MetaDSM
author | Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 15 Feb 2016 01:16:35 +0900 |
parents | 28627bb3eeda |
children |
rev | line source |
---|---|
345 | 1 package alice.topology.manager.keeparive; |
2 | |
3 import alice.codesegment.CodeSegment; | |
599
3284428f525e
add MetaCodeSegment & MetaDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
507
diff
changeset
|
4 import alice.codesegment.MetaCodeSegment; |
345 | 5 import alice.datasegment.CommandType; |
6 import alice.datasegment.DataSegment; | |
7 import alice.datasegment.Receiver; | |
8 | |
599
3284428f525e
add MetaCodeSegment & MetaDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
507
diff
changeset
|
9 public class TaskExecuter extends MetaCodeSegment { |
419 | 10 private Receiver info = ids.create(CommandType.TAKE); |
11 private TaskInfo nowTask; | |
12 private boolean sleepFlag = false; | |
13 private boolean skipFlag = false; | |
14 private long startTime = 0; | |
467 | 15 private long remainingTime = 0; |
419 | 16 private static TaskExecuter instance = new TaskExecuter(); |
17 | |
18 private TaskExecuter() {} | |
19 public static TaskExecuter getInstance() { | |
20 return instance; | |
21 } | |
22 | |
23 public void setKey() { | |
24 ids.init(); | |
507 | 25 info.setKey("_SCHEDULER"); |
419 | 26 } |
345 | 27 |
419 | 28 @Override |
29 public synchronized void run() { | |
30 ListManager list = info.asClass(ListManager.class); | |
31 if (list.getTaskList().size() == 0){ | |
499 | 32 TaskInfo task = new TaskInfo(TaskType.CREATE); |
504
ece6a109b64c
DataSegment.remove API need only call in DeleteConnectoin
sugi
parents:
500
diff
changeset
|
33 task.setSleepTime(3000); |
499 | 34 list.addTask(task); |
507 | 35 ods.update("_SCHEDULER", list); |
419 | 36 remainingTime = 0; |
37 } else { | |
38 nowTask = list.getTaskList().poll(); | |
499 | 39 if (nowTask.getType() !=TaskType.PING) |
507 | 40 ods.update("_SCHEDULER", list); |
419 | 41 if (skipFlag) { |
42 skipFlag = false; | |
43 nowTask.setSleepTime(remainingTime + nowTask.getSleepTime()); | |
44 remainingTime = 0; | |
45 } | |
46 startTime = System.currentTimeMillis(); | |
47 if (nowTask.getSleepTime() != 0){ | |
48 sleepFlag = true; | |
49 try { | |
50 wait(nowTask.getSleepTime()); | |
51 } catch (InterruptedException e) { | |
52 e.printStackTrace(); | |
53 } | |
54 sleepFlag = false; | |
55 } | |
345 | 56 |
419 | 57 if (!skipFlag){ |
58 // ping or close | |
59 if (nowTask.getType() == TaskType.PING) { | |
60 ods.ping(nowTask.getManagerKey(), nowTask.getReturnKey()); | |
61 TaskInfo task = new TaskInfo(TaskType.CLOSE); | |
62 task.setInfo(nowTask.getManagerKey(), 10 * 1000); | |
499 | 63 list.addTask(task); |
507 | 64 ods.update("_SCHEDULER", list); |
419 | 65 new RespondPing(nowTask.getReturnKey()); |
66 } else if (nowTask.getType() == TaskType.CLOSE) { | |
67 // no response from the Remote DataSegment. So close this connection. | |
471
be0b61986ff7
checking having DataSegmentManger before get DataSegmentManager
sugi
parents:
468
diff
changeset
|
68 if (DataSegment.contains(nowTask.getManagerKey())) { |
be0b61986ff7
checking having DataSegmentManger before get DataSegmentManager
sugi
parents:
468
diff
changeset
|
69 DataSegment.get(nowTask.getManagerKey()).shutdown(); |
be0b61986ff7
checking having DataSegmentManger before get DataSegmentManager
sugi
parents:
468
diff
changeset
|
70 System.out.println(nowTask.getManagerKey() +" IS SHOTDOWN"); |
be0b61986ff7
checking having DataSegmentManger before get DataSegmentManager
sugi
parents:
468
diff
changeset
|
71 } else { |
be0b61986ff7
checking having DataSegmentManger before get DataSegmentManager
sugi
parents:
468
diff
changeset
|
72 System.out.println(nowTask.getManagerKey() +" IS ALREADY SHOTDOWN"); |
be0b61986ff7
checking having DataSegmentManger before get DataSegmentManager
sugi
parents:
468
diff
changeset
|
73 } |
468 | 74 } else if (nowTask.getType() == TaskType.CREATE) { |
75 new CreateTask(); | |
419 | 76 } |
77 } | |
78 nowTask = null; | |
79 startTime = 0; | |
80 } | |
81 setKey(); | |
82 } | |
83 | |
84 public synchronized void skip() { | |
85 if (sleepFlag){ | |
86 skipFlag = true; | |
87 if (startTime == 0){ | |
88 remainingTime = nowTask.getSleepTime(); | |
89 } else { | |
90 remainingTime = nowTask.getSleepTime() - (System.currentTimeMillis() - startTime); | |
91 } | |
467 | 92 nowTask = null; |
419 | 93 notify(); |
94 } | |
95 } | |
345 | 96 |
419 | 97 public synchronized void ignore() { |
98 if (sleepFlag){ | |
99 skipFlag = true; | |
100 remainingTime = 0; | |
101 nowTask = null; | |
467 | 102 notify(); |
419 | 103 } |
104 } | |
345 | 105 |
419 | 106 public synchronized TaskInfo getNowTask() { |
107 return nowTask; | |
108 } | |
345 | 109 |
419 | 110 // only use in ListManagerTest |
111 public synchronized void setNowTask(TaskInfo info) { | |
112 nowTask = info; | |
113 } | |
345 | 114 |
419 | 115 public synchronized long getRemainingTime() { |
116 if (sleepFlag) { | |
117 if (startTime !=0) { | |
118 return nowTask.getSleepTime() - (System.currentTimeMillis() - startTime); | |
119 } else { | |
120 return nowTask.getSleepTime(); | |
121 } | |
122 } else { | |
123 return remainingTime; | |
124 } | |
125 } | |
345 | 126 |
498 | 127 public synchronized boolean compareAndSkip(TaskInfo task) { |
419 | 128 if (nowTask != null){ |
129 if (nowTask.getType().equals(task.getType()) | |
130 && nowTask.getManagerKey().equals(task.getManagerKey())){ | |
498 | 131 skip(); |
419 | 132 return true; |
467 | 133 } |
419 | 134 } |
135 return false; | |
136 } | |
345 | 137 |
138 } |