Mercurial > hg > RemoteEditor > REPSessionManager
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); }