changeset 434:0e72945867bb

merge on going...
author one
date Tue, 12 Jan 2010 02:24:29 +0900
parents bd883b059360
children 2b034d12170e
files Todo rep/handler/Editor.java rep/handler/Translator.java
diffstat 3 files changed, 54 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/Todo	Sun Jan 03 19:09:50 2010 +0900
+++ b/Todo	Tue Jan 12 02:24:29 2010 +0900
@@ -1,3 +1,28 @@
+Tue Jan 12 01:20:12 JST 2010
+
+sentList の先頭を削除するのは、Merge が終った後。一周した部分は、
+確定するはずなので全部削除で良い。その後、来た、Ack などは無視して良い。
+
+quit を早く処理してしまう場合があるらしい。
+
+だいぶ近くなって来た気がする。
+
+Sat Jan  9 15:36:35 JST 2010
+
+やっぱり全部ソートしちゃいけないのかな...
+
+Merge のtriggerになるコマンドは、sentList の先頭
+sort してはいけないものとは?
+
+unMergedList は、Editor に送ったコマンド全部
+sentList は、外部のエディタに送り出したもの全部
+
+そっか、やっぱり、current command が外されちゃっているのはまずいらしい。
+あと、sort の順序も良くない。
+
+一回、sort したものは、外して良いっぽい。(ACKが来たものまでは確定)
+
+
 Sat Jan  2 20:52:17 JST 2010
 
 uMergeList のDELETE command のdeleted text が正しくない...
--- a/rep/handler/Editor.java	Sun Jan 03 19:09:50 2010 +0900
+++ b/rep/handler/Editor.java	Tue Jan 12 02:24:29 2010 +0900
@@ -85,7 +85,8 @@
 			if (waitingRequired(command)) return;
 			if (command.eid==eid) {
 				// Second Phase が終わって同期が終了。
-				removeFromSentList(command);
+				checkAck(command);
+				// sentList.remove(0);
 				SessionManager.logger.writeLog("Complete "+command);
 				checkQuit();
 				return;
@@ -222,31 +223,30 @@
 	 * @param command
 	 */
 	void checkReturnedCommand(REPCommand command) {
-		if (removeFromSentList(command))
+		if (checkAck(command))
 			startMerge(command);
 		return;
 	}
 
-	private boolean removeFromSentList(REPCommand command) {
+	private boolean checkAck(REPCommand command) {
 		assert(!merging);
-		if (sentList.size()==0) {
-			ServerMainLoop.logger.writeLog("Editor eid="+eid+" looped command not registered: "+command);
-			assert(command.cmd==REP.REPCMD_DELETE_ACK||
-					command.cmd==REP.REPCMD_INSERT_ACK);
-			return false;
-		}
-		REPCommand prev = sentList.remove(0);
-		// ServerMainLoop.logger.writeLog("Editor eid="+eid+" remove sentList:"+(prev==null?"null":prev));
-		if (prev==null || prev.seq != command.seq || prev.eid!=command.eid) {
-			String err = "Editor eid="+eid+" checkReturnedCommand() : command = " + command + " prev="+
-				(prev==null?"null":prev)+" sentList=";
-			err += sentList;
-			ServerMainLoop.logger.writeLog(err);
-			assert(command.cmd==REP.REPCMD_DELETE_ACK||
-					command.cmd==REP.REPCMD_INSERT_ACK);
-			sentList.add(0,prev);
-			return false;
-		}
+//		if (sentList.size()==0) {
+//			ServerMainLoop.logger.writeLog("Editor eid="+eid+" looped command not registered: "+command);
+//			assert(command.cmd==REP.REPCMD_DELETE_ACK||
+//					command.cmd==REP.REPCMD_INSERT_ACK);
+//			return false;
+//		}
+//		REPCommand prev = sentList.get(0);
+//		// ServerMainLoop.logger.writeLog("Editor eid="+eid+" remove sentList:"+(prev==null?"null":prev));
+//		if (prev==null || prev.seq != command.seq || prev.eid!=command.eid) {
+//			String err = "Editor eid="+eid+" checkReturnedCommand() : command = " + command + " prev="+
+//				(prev==null?"null":prev)+" sentList=";
+//			err += sentList;
+//			ServerMainLoop.logger.writeLog(err);
+//			assert(command.cmd==REP.REPCMD_DELETE_ACK||
+//					command.cmd==REP.REPCMD_INSERT_ACK);
+//			return false;
+//		}
 		return true;
 	}
 
@@ -297,7 +297,7 @@
 
 	void checkEndMerge() {
 		if (merging) {
-			if(translator.isMerging()) return;
+			if (translator.isMerging()) return;
 			endMerge();
 			merging = false;
 		}
@@ -307,6 +307,8 @@
 	private void endMerge() {
 		REPCommand mergeEnd = new REPCommand(REP.SMCMD_END_MERGE,sid,eid,seq(),0,"");
 		send(mergeEnd);
+		// sentList.remove(0);
+		sentList.clear();
 		if (preMergeCommand.eid==eid) {
 			// First Phase End, send ACK
 			REPCommand keep = new REPCommand(preMergeCommand);
@@ -356,7 +358,7 @@
 		{
 			// マージの処理と次のエディタへコマンドを送信する処理
 			translator.mergeAck();
-			if (!merge(command)) {
+			if (!merge(preMergeCommand)) {
 				// nothing to do, send END_MERGE
 				checkEndMerge();
 			}
--- a/rep/handler/Translator.java	Sun Jan 03 19:09:50 2010 +0900
+++ b/rep/handler/Translator.java	Tue Jan 12 02:24:29 2010 +0900
@@ -54,19 +54,21 @@
 	 * Start merge process.
 	 * @param cmd
 	 */
-	public boolean catchOwnCommand(REPNode editor, int eid){
+	public boolean catchOwnCommand(REPNode editor, int eid0){
 		logger.writeLog("beforeMerge:"+unMergedCmds);
 		LinkedList<REPCommand> output = new LinkedList<REPCommand>();
-		TreeSet<REPCommand> cmds = new TreeSet<REPCommand>(new REPCommandComparator(eid));
 		// merge queue上にあるコマンドを全部undoコマンドするのと同時に
 		// sort したコマンド列を生成する
 		for( REPCommand cmd0 : unMergedCmds) {
 			output.add( createUndo(cmd0) );
 		}
+
+		TreeSet<REPCommand> cmds = new TreeSet<REPCommand>(new REPCommandComparator(eid0));
 		for( REPCommand cmd0 : editor.getSentList()) {
 			if (cmd0.cmd==REP.REPCMD_INSERT || cmd0.cmd==REP.REPCMD_DELETE)
 				cmds.add(cmd0);
 		}
+		logger.writeLog("Ediotr"+eid+" Merge:: sorted sent list => Eid="+eid+cmds);
 		output.addAll(cmds);
 		// ACKが来たものは必ず先頭