changeset 329:35b4e24e3e02

setNowTask method need synchronized. may be...
author sugi
date Mon, 24 Mar 2014 23:52:20 +0900
parents 370a2f63944f
children d35ff0f588e8
files src/alice/topology/manager/keeparive/ListManagerTest.java src/alice/topology/manager/keeparive/RespondPing.java src/alice/topology/manager/keeparive/TaskExecuter.java src/alice/topology/manager/keeparive/TaskInfo.java src/alice/topology/manager/keeparive/TaskType.java
diffstat 5 files changed, 93 insertions(+), 45 deletions(-) [+]
line wrap: on
line diff
--- a/src/alice/topology/manager/keeparive/ListManagerTest.java	Tue Feb 11 16:10:23 2014 +0900
+++ b/src/alice/topology/manager/keeparive/ListManagerTest.java	Mon Mar 24 23:52:20 2014 +0900
@@ -35,6 +35,12 @@
 			manager.showList();
 			i +=1;
 		}
+		
+		manager = new ListManager();
+		System.out.println(TaskExecuter.getInstance().getRemainingTime());
+		TaskExecuter.getInstance().setNowTask(taskA);
+		TaskExecuter.getInstance().skip();
+		System.out.println(TaskExecuter.getInstance().getRemainingTime());
 
 	}
 }
\ No newline at end of file
--- a/src/alice/topology/manager/keeparive/RespondPing.java	Tue Feb 11 16:10:23 2014 +0900
+++ b/src/alice/topology/manager/keeparive/RespondPing.java	Mon Mar 24 23:52:20 2014 +0900
@@ -29,7 +29,7 @@
 			task.setInfo(d.from, null, 0);
 			if (exec.compareNowTask(task)){
 				// case: remove task is state countdown.
-				exec.skip();
+				exec.skip(); // countdown 
 			} else {
 				// case: remove task is still in the waiting queue.
 				ods.put("_REMOVETASK",task);
--- a/src/alice/topology/manager/keeparive/TaskExecuter.java	Tue Feb 11 16:10:23 2014 +0900
+++ b/src/alice/topology/manager/keeparive/TaskExecuter.java	Mon Mar 24 23:52:20 2014 +0900
@@ -5,76 +5,121 @@
 import alice.datasegment.DataSegment;
 import alice.datasegment.Receiver;
 
-public class TaskExecuter extends CodeSegment{
+public class TaskExecuter extends CodeSegment {
 	private Receiver info = ids.create(CommandType.TAKE);
 	private TaskInfo nowTask;
 	private boolean skipFlag = false;
 	private long startTime = 0;
+	private long remainingTime = 0; 
 	private static TaskExecuter instance = new TaskExecuter();
 
-	private TaskExecuter(){}
-	public static TaskExecuter getInstance(){
+	private TaskExecuter() {}
+	public static TaskExecuter getInstance() {
 		return instance;
 	}
 
-	public void setKey(){
+	public void setKey() {
 		ids.init();
 		info.setKey("_WAITINGLIST");
 	}
 
 	@Override
-	public synchronized void run(){
+	public synchronized void run()  {
 		ListManager list = info.asClass(ListManager.class);	
 		if (list.getTaskList().size() == 0){
+			if (remainingTime !=0){
+				TaskInfo info = new TaskInfo(TaskType.SKIP);
+				info.setSleepTime(remainingTime);
+				remainingTime = 0;
+				list.addTask(info);
+			}
 			ods.update("_WAITINGLIST", list);
-			setKey();
-			return;
-		}
-		nowTask = list.getTaskList().poll();
-		ods.update("_WAITINGLIST", list);
-		if (skipFlag){
-			skipFlag = false;
+		} else {
+			setNowTask(list.getTaskList().poll());
+			ods.update("_WAITINGLIST", list);
+			
+			if (skipFlag) {
+				skipFlag = false;
+				nowTask.setSleepTime(remainingTime + nowTask.getSleepTime());
+				remainingTime = 0;
+			}
+			
+			startTime = System.currentTimeMillis();
+			System.out.println(nowTask.getSleepTime()+" "+nowTask.getType());
+			if (nowTask.getSleepTime() != 0){
+				try {
+					wait(nowTask.getSleepTime());
+				} catch (InterruptedException e) {
+					e.printStackTrace();
+				}
+			}
+			setNowTask(null);
+			startTime = 0;
+			
+			if (!skipFlag){
+				// ping or close
+				/*
+				if (nowTask.getType() == TaskType.PING) {
+					ods.ping(nowTask.getManagerKey(), nowTask.getReturnKey());
+					TaskInfo task = new TaskInfo(TaskType.CLOSE);
+					task.setInfo(nowTask.getManagerKey(), 60 * 1000);
+					ods.put("_TASKINFO", task);
+					new RespondPing(nowTask.getReturnKey());
+				} else {
+					// no response from the Remote DataSegment. So close this connection.
+					DataSegment.get(nowTask.getManagerKey()).close();
+				}
+				 */	
+			}
 		}
-		startTime = System.currentTimeMillis();
-		System.out.println(nowTask.getSleepTime()+" "+nowTask.getType());
-		if (nowTask.getSleepTime()!=0){
-			try {
-				this.wait(nowTask.getSleepTime());
-			} catch (InterruptedException e){}
-		}
-		if (!skipFlag){
-			if (nowTask.getType() == TaskType.PING){
-				ods.ping(nowTask.getManagerKey(), nowTask.getReturnKey());
-				TaskInfo task = new TaskInfo(TaskType.CLOSE);
-				task.setInfo(nowTask.getManagerKey(), 60 * 1000);
-				ods.put("_TASKINFO", task);
-				new RespondPing(nowTask.getReturnKey());
-			} else {
-				// no response from the Remote DataSegment. So close this connection.
-				DataSegment.get(nowTask.getManagerKey()).close();
-			}		
+		setKey();
+	}
+
+	public synchronized void skip() {
+		skipFlag = true;
+		if (startTime == 0){
+			remainingTime = nowTask.getSleepTime();
+		} else {
+			remainingTime = nowTask.getSleepTime() - (System.currentTimeMillis() - startTime);
 		}
 		nowTask = null;
-		setKey();
+		notify();
 	}
-	
-	public synchronized long skip(){
+
+	public synchronized void ignore() {
 		skipFlag = true;
-		long remainingTime = nowTask.getSleepTime() - (System.currentTimeMillis() - startTime);
+		remainingTime = 0;
 		nowTask = null;
 		notify();
-		return remainingTime;
 	}
 
-	public TaskInfo getNowTask(){
+	public TaskInfo getNowTask() {
 		return nowTask;
 	}
 
-	public long getStartTime(){
-		return startTime;
+	public synchronized void setNowTask(TaskInfo info) {
+		nowTask = info;
 	}
-	
-	public boolean compareNowTask(TaskInfo task){
+
+	public long getRemainingTime() {
+		if (nowTask != null) {
+			if (startTime !=0) {
+				return nowTask.getSleepTime() - (System.currentTimeMillis() - startTime);
+			} else {
+				return nowTask.getSleepTime();
+			}
+		} else {
+			return remainingTime;
+		}
+	}
+
+	public long initRemainingTime() {
+		long time = remainingTime;
+		remainingTime = 0;
+		return time;
+	}
+
+	public boolean compareNowTask(TaskInfo task) {
 		if (nowTask != null){
 			if (nowTask.getType().equals(task.getType())
 					&& nowTask.getManagerKey().equals(task.getManagerKey())){
--- a/src/alice/topology/manager/keeparive/TaskInfo.java	Tue Feb 11 16:10:23 2014 +0900
+++ b/src/alice/topology/manager/keeparive/TaskInfo.java	Mon Mar 24 23:52:20 2014 +0900
@@ -30,9 +30,6 @@
 	}
 	
 	public void setSleepTime(long time){
-		if (time < 0 ){
-			System.out.println(time);
-		}
 		sleepTime = time;
 	}
 
--- a/src/alice/topology/manager/keeparive/TaskType.java	Tue Feb 11 16:10:23 2014 +0900
+++ b/src/alice/topology/manager/keeparive/TaskType.java	Mon Mar 24 23:52:20 2014 +0900
@@ -3,5 +3,5 @@
 public enum TaskType {
 	PING,
 	CLOSE,
-	WAIT
+	SKIP,
 }