changeset 445:22a741c1fa2d

fix unMergedCmds in endMerge
author one
date Sat, 18 Sep 2010 00:10:57 +0900
parents 97593c486db6
children 6a7004071777
files Todo rep/handler/Editor.java rep/handler/Translator.java test/sematest/TestEditor.java
diffstat 4 files changed, 48 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/Todo	Mon Sep 13 14:52:11 2010 +0900
+++ b/Todo	Sat Sep 18 00:10:57 2010 +0900
@@ -1,3 +1,15 @@
+Fri Sep 17 16:31:04 JST 2010
+
+あぁ、そうか。二つ続けてeditor commandを送ると、二つ続けて Merge することに
+なる。Timeout みたいなので防げないこともないが、今は何もしない。
+
+Optimizer が全然動いてないようだ。まぁ、それは良いが...
+
+Undo は正しく行なわれているが、続いて起きる merge で余計なコマンドが入っている
+ようだ。
+
+EndMergeで、unMergedCmds を正しくなるように直してみる。少しは近くなったか?
+
 Sat Sep 11 16:45:40 JST 2010
 
 これ、やっぱり難しすぎ。getMergeAgain で、sentMergedList が空でない場合がある。
--- a/rep/handler/Editor.java	Mon Sep 13 14:52:11 2010 +0900
+++ b/rep/handler/Editor.java	Sat Sep 18 00:10:57 2010 +0900
@@ -23,7 +23,7 @@
 	private REPCommand preMergeCommand;
 	private boolean merging;
 	public static boolean noMergeMode=false;
-	static final boolean doOptimize = true;
+	static final boolean doOptimize = false;
 
 	public Editor(SessionManager manager,int editorNo){
 		// no translator case
@@ -41,6 +41,8 @@
 	
 	/*
 	 *  Merge Protocol
+	(0) Editor へのコマンドは、ack 以外は直接 Editor へ送られてしまう。(next.send(cmd))
+	     Editor から返ってくるコマンドをtranslatorが処理する。
 	(1) Editor CommandをSession Ring 上に流し、それが戻って来るまでに、他のEditorから
 	    受け取った Editor Command をキューに入れておく。
 	(2) 戻って来たタイミングで、キュー上のEditor Commandを、eid とCommandの
@@ -294,6 +296,7 @@
 
 
 	private void endMerge() {
+		translator.endMerge();
 		REPCommand mergeEnd = new REPCommand(REP.SMCMD_END_MERGE,sid,eid,seq(),0,"");
 		send(mergeEnd);
 		sentList.remove(0);
--- a/rep/handler/Translator.java	Mon Sep 13 14:52:11 2010 +0900
+++ b/rep/handler/Translator.java	Sat Sep 18 00:10:57 2010 +0900
@@ -17,6 +17,7 @@
 	public REPCommandOptimizer optimizer;
 	private LinkedList<REPCommand> unMergedCmds;
 	private LinkedList<REPCommand> sentMergedList;
+	private TreeSet<REPCommand> sortedEditCmds;
 	boolean mergeAgain;
 	public REPLogger logger = SessionManager.logger;
 	boolean merge_mode = false;
@@ -63,14 +64,14 @@
 			output.add( createUndo(cmd0) );
 		}
 
-		TreeSet<REPCommand> cmds = new TreeSet<REPCommand>(new REPCommandComparator(1));
+		sortedEditCmds = new TreeSet<REPCommand>(new REPCommandComparator(1));
 		for( REPCommand cmd0 : editor.getSentList()) {
 			if (cmd0.cmd==REP.REPCMD_INSERT || cmd0.cmd==REP.REPCMD_DELETE)
-				cmds.add(cmd0);
+				sortedEditCmds.add(cmd0);
 		}
-		logger.writeLog("sortedMerge"+eid+":"+cmds);
+		logger.writeLog("sortedMerge"+eid+":"+sortedEditCmds);
 		// logger.writeLog("Ediotr"+eid+" Merge:: sorted sent list => Eid="+eid+cmds+" ack="+prev);
-		output.addAll(cmds);
+		output.addAll(sortedEditCmds);
 		// ACKが来たものは必ず先頭
 		
 		// unMerged command のdeleteのundo string は、この時点で使えない。
@@ -107,7 +108,10 @@
 	
 	private REPCommand createUndo(REPCommand cmd){
 		REPCommand retCmd = new REPCommand(cmd);
-		if (cmd.cmd==REP.REPCMD_INSERT) retCmd.cmd=REP.REPCMD_DELETE;
+		if (cmd.cmd==REP.REPCMD_INSERT) {
+			retCmd.cmd=REP.REPCMD_DELETE;
+			retCmd.string="";
+		}
 		else if (cmd.cmd==REP.REPCMD_DELETE) retCmd.cmd=REP.REPCMD_INSERT;
 		return retCmd;
 	}
@@ -124,7 +128,7 @@
 			if ( eid1>eid2 ) return 1;
 			if ( o1.seq<o2.seq ) return -1;
 			if ( o1.seq>o2.seq ) return 1;
-			assert(false);
+			// assert(false);  // this can happen in MergedAgain case
 			return 0;
 		}
 	}
@@ -171,6 +175,7 @@
 		for(REPCommand command : unMergedCmds) {
 			if(command.eid == REP.MERGE_EID.id){
 				merge.addLast(command);
+				sortedEditCmds.add(command);
 			}
 		}
 		for(REPCommand command : unMergedCmds){
@@ -186,12 +191,12 @@
 		mergeAgain = false;
 		optimizedSend(editor, returnCommand);
 	}
-
-	public boolean isFinished() {
-		if(unMergedCmds.size() > 0) return false;
-		if(sentMergedList.size() > 0) return false;
-		return true;
-	}
+//
+//	public boolean isFinished() {
+//		if(unMergedCmds.size() > 0) return false;
+//		if(sentMergedList.size() > 0) return false;
+//		return true;
+//	}
 
 	public boolean isMerging() {
 		return merge_mode;
@@ -202,9 +207,23 @@
 		merge_mode = true;
 	}
 
+	/**
+	 *  receive SMCMD_START_MERGE_ACK
+	 */
 	public void mergeAck() {
 	}
 
+	/**
+	 * Received all merge command ack
+	 */
+	public void endMerge() {
+		unMergedCmds.clear();
+		for( REPCommand cmd0 : sortedEditCmds) {
+			unMergedCmds.add( createUndo(cmd0) );
+		}
+		sortedEditCmds.clear();
+	}
+
 
 
 }
--- a/test/sematest/TestEditor.java	Mon Sep 13 14:52:11 2010 +0900
+++ b/test/sematest/TestEditor.java	Sat Sep 18 00:10:57 2010 +0900
@@ -225,7 +225,7 @@
 
 	private void forwardCommand(REPCommand cmd1) {
 		REPCommand cmd = new REPCommand(cmd1);
-		// ns.writeLog(name +" forward "+cmd);
+		ns.writeLog(name +" forward "+cmd);
 		channel.write(cmd);
 	}