# HG changeset patch # User sugi # Date 1384837497 -32400 # Node ID 6e0a909b4b12268a9146431174a96906da2bf046 # Parent de6d7361b5230f0bccee154a8740f7b7598b9b44 add PingScheduler diff -r de6d7361b523 -r 6e0a909b4b12 src/alice/test/topology/aquarium/CheckLocalIndex.java --- a/src/alice/test/topology/aquarium/CheckLocalIndex.java Tue Nov 05 03:55:24 2013 +0900 +++ b/src/alice/test/topology/aquarium/CheckLocalIndex.java Tue Nov 19 14:04:57 2013 +0900 @@ -22,6 +22,7 @@ List r = list.asClass(List.class); for (String node : r) { if (!node.equals(data.from)) { + System.out.println(data.from); ods.update(node, data.key, data.getVal()); } } diff -r de6d7361b523 -r 6e0a909b4b12 src/alice/topology/manager/keeparive/PingScheduler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/alice/topology/manager/keeparive/PingScheduler.java Tue Nov 19 14:04:57 2013 +0900 @@ -0,0 +1,103 @@ +package alice.topology.manager.keeparive; + +import java.util.LinkedList; +import java.util.List; + +import alice.codesegment.CodeSegment; + +public class PingScheduler extends CodeSegment{ + private LinkedList list = new LinkedList(); + private long INTERVAL = 60 * 1000; + + public boolean updateFlag = false; + private boolean interruptFlag = false; + + private long time = 0; + public TaskInfo nowTask; + private long totalTime = 0; + private long postponeTime = 0; + + public long getTotalTime(){ + return totalTime; + } + + public List getTaskList(){ + return list; + } + + public synchronized void postpone(String name){ + long elapsedTime = System.currentTimeMillis() - time; + totalTime += elapsedTime; + postponeTime = nowTask.getSleepTime() - elapsedTime; + if (name.equals(nowTask.getManagerKey())){ + TaskInfo nextTask = list.get(0); + nextTask.setSleepTime(postponeTime + nextTask.getSleepTime()); + nowTask.setSleepTime(INTERVAL); + addTask(nowTask); + + } else { + int cnt = 0; + nowTask.setSleepTime(postponeTime); + list.add(cnt, nowTask); + for (TaskInfo info : list){ + if (name.equals(info.getManagerKey())){ + if (info != list.getLast()){ + TaskInfo nextInfo = list.get(cnt+1); + nextInfo.setSleepTime(nextInfo.getSleepTime() + info.getSleepTime()); + } + list.remove(info); + info.setSleepTime(INTERVAL); + addTask(info); + break; + } + cnt++; + } + } + interruptFlag = true; + notify(); + } + + + public synchronized void addTask(TaskInfo newInfo){ + if (list.isEmpty()) { + list.add(newInfo); + } else { + int cnt = 0; + for (TaskInfo info : list){ + if (info.getSleepTime() < newInfo.getSleepTime()){ + newInfo.setSleepTime(newInfo.getSleepTime() - info.getSleepTime()); + } else if (info.getSleepTime() == newInfo.getSleepTime()){ + newInfo.setSleepTime(newInfo.getSleepTime() - info.getSleepTime()); + cnt++; + break; + } else if (info.getSleepTime() > newInfo.getSleepTime()){ + info.setSleepTime(info.getSleepTime() - newInfo.getSleepTime()); + break; + } + cnt++; + } + list.add(cnt, newInfo); + } + updateFlag = true; + } + + @Override + public synchronized void run() { + try { + while(true){ + nowTask = list.poll(); + time = System.currentTimeMillis(); + if (nowTask.getSleepTime()!=0) + this.wait(nowTask.getSleepTime()); + if (interruptFlag){ + interruptFlag = false; + } else { + ods.put("_SENDPING", nowTask); + totalTime +=nowTask.getSleepTime(); + } + } + } catch (InterruptedException e) { + } + } +} +