# HG changeset patch # User one # Date 1263230669 -32400 # Node ID 0e72945867bbf250c8c34c63a717febc1b9fe29c # Parent bd883b059360c817cd1c499580e468924bac95c2 merge on going... diff -r bd883b059360 -r 0e72945867bb Todo --- 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 が正しくない... diff -r bd883b059360 -r 0e72945867bb rep/handler/Editor.java --- 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(); } diff -r bd883b059360 -r 0e72945867bb rep/handler/Translator.java --- 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 output = new LinkedList(); - TreeSet cmds = new TreeSet(new REPCommandComparator(eid)); // merge queue上にあるコマンドを全部undoコマンドするのと同時に // sort したコマンド列を生成する for( REPCommand cmd0 : unMergedCmds) { output.add( createUndo(cmd0) ); } + + TreeSet cmds = new TreeSet(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が来たものは必ず先頭