changeset 303:6e0a909b4b12

add PingScheduler
author sugi
date Tue, 19 Nov 2013 14:04:57 +0900
parents de6d7361b523
children 366742c2b07d
files src/alice/test/topology/aquarium/CheckLocalIndex.java src/alice/topology/manager/keeparive/PingScheduler.java
diffstat 2 files changed, 104 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- 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<String> 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());
 			}
 		}
--- /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<TaskInfo> list = new LinkedList<TaskInfo>();
+	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<TaskInfo> 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) {
+		}
+	}
+}
+