# HG changeset patch # User one # Date 1262448112 -32400 # Node ID 1bb59652d89c908f4f0df3ee6a59a00732980cf8 # Parent 03ab374605a62adb6773d6939e91d12f5baed59a fixing merge... diff -r 03ab374605a6 -r 1bb59652d89c Todo --- a/Todo Sat Jan 02 04:16:25 2010 +0900 +++ b/Todo Sun Jan 03 01:01:52 2010 +0900 @@ -1,3 +1,33 @@ +Sat Jan 2 20:52:17 JST 2010 + +uMergeList のDELETE command のdeleted text が正しくない... +なので、最初の一回は良いのだが二回目ででたらめになってしまう。 +これは、考えてなかった。 + Translator.checkMergeConflict +が受け取っているので、それを uMergeList にすれば良いのだが... + +ちょっと、やっかいなプログラムになるかも。 + + unMergeList はMerge 後、削除 ( まだ merge してない list ) + sentList はいじれない ( 自分が他のエディタに送信した list) + + sentMergeList ( 送信した merge command ) + mergeAgainList ( merge 中に自分のeditorに割り込まれた分 ) + +確かに、mergeAgainList とかなんか、quueue が多すぎ。 + + +sort なんだけど... + + e0 e1 e2 e0 e1 e2 e0 e1 e2 e0 e1 e2 e0 + |-------|--------|--------| + |--------|--------|--------| + |--------|--------|--------| + +となる。なので、単純な editor id の順序では、まずいのでは? +(自分の以外はack) ack の eid からの剰余で廻せば良いはず。 + + Sat Jan 2 03:27:47 JST 2010 うーん、まだ、だめですね。 @@ -9,6 +39,8 @@ Todo: writeLog に level/flag を付けるか? +Done: + 既に付いてました。 Selector.select() のフラグは意味がない。その後、必ず、 selectedKeys() を調べる必要がある。これは、Simulator diff -r 03ab374605a6 -r 1bb59652d89c rep/handler/Editor.java --- a/rep/handler/Editor.java Sat Jan 02 04:16:25 2010 +0900 +++ b/rep/handler/Editor.java Sun Jan 03 01:01:52 2010 +0900 @@ -120,10 +120,7 @@ //他のエディタからの編集コマンド if (waitingRequired(command)) return; translator.transReceiveCmd(next,command); - if(command.cmd==REP.REPCMD_DELETE) { - // delete のundo用の文字列は、外に出す意味はない - command.string=null; - } + sendEditorCommand(command); return; default: @@ -183,18 +180,33 @@ } waitingCommandInMerge.add(set); } - + + /** + * 他のエディタへのコマンドの送信 + * @param command + * + * sendList にキープする必要がある。 + */ private void sendEditorCommand(REPCommand command) { REPCommand keep = new REPCommand(command); sentList.add(keep); //ServerMainLoop.logger.writeLog("Editor eid:"+eid+" sentList = "+sentList); assert(sentList.size() getSentList() { + return sentList; } /** diff -r 03ab374605a6 -r 1bb59652d89c rep/handler/Forwarder.java --- a/rep/handler/Forwarder.java Sat Jan 02 04:16:25 2010 +0900 +++ b/rep/handler/Forwarder.java Sun Jan 03 01:01:52 2010 +0900 @@ -1,6 +1,7 @@ package rep.handler; import java.io.IOException; +import java.util.List; import rep.PacketSet; import rep.REP; @@ -145,6 +146,11 @@ } + @Override + public List getSentList() { + return null; + } + diff -r 03ab374605a6 -r 1bb59652d89c rep/handler/REPNode.java --- a/rep/handler/REPNode.java Sat Jan 02 04:16:25 2010 +0900 +++ b/rep/handler/REPNode.java Sun Jan 03 01:01:52 2010 +0900 @@ -1,6 +1,7 @@ package rep.handler; import java.io.IOException; +import java.util.List; import rep.REP; import rep.REPCommand; @@ -159,6 +160,9 @@ public abstract void forwardedCommandManage(REPCommand command) ; public abstract void checkWaitingCommandInMerge(); + + public abstract List getSentList() ; + diff -r 03ab374605a6 -r 1bb59652d89c rep/handler/Translator.java --- a/rep/handler/Translator.java Sat Jan 02 04:16:25 2010 +0900 +++ b/rep/handler/Translator.java Sun Jan 03 01:01:52 2010 +0900 @@ -17,7 +17,7 @@ public REPCommandOptimizer optimizer; private LinkedList unMergedCmds; public LinkedList sentMergedList; - private LinkedList mergeAgainList; + boolean mergeAgain; public REPLogger logger = SessionManager.logger; boolean merge_mode = false; @@ -25,7 +25,7 @@ eid = _eid; optimizer = opt; unMergedCmds = new LinkedList(); - mergeAgainList = new LinkedList(); + mergeAgain = false; sentMergedList = new LinkedList(); } @@ -37,15 +37,16 @@ */ public REPCommand transSendCmd(REPCommand cmd){ assert(cmd.eid==eid); - unMergedCmds.add(cmd); + unMergedCmds.addLast(cmd); //マージ中にユーザから割り込みがあった場合 if(isMerging()){ - mergeAgainList.add(cmd); + mergeAgain = true; } return cmd; } + /** * My command is returned from the session ring, and START_MERGE_ACK * is returned. At this @@ -53,21 +54,25 @@ * Start merge process. * @param cmd */ - public boolean catchOwnCommand(REPNode editor){ + public boolean catchOwnCommand(REPNode editor, int eid){ logger.writeLog("beforeMerge:"+unMergedCmds); LinkedList output = new LinkedList(); - TreeSet cmds = new TreeSet(new REPCommandComparator()); + TreeSet cmds = new TreeSet(new REPCommandComparator(eid)); // merge queue上にあるコマンドを全部undoコマンドするのと同時に // sort したコマンド列を生成する for( REPCommand cmd0 : unMergedCmds) { output.add( createUndo(cmd0) ); + } + for( REPCommand cmd0 : editor.getSentList()) { cmds.add(cmd0); } output.addAll(cmds); // ACKが来たものは必ず先頭 - unMergedCmds.removeFirst(); + + // unMerged command のdeleteのundo string は、この時点で使えない。 + // Editor 側から送り返して来たものを使う必要がある。 + unMergedCmds.clear(); logger.writeLog("outputMerge:"+output); - logger.writeLog("afterMerge:"+unMergedCmds); return optimizedSend(editor,output); } @@ -102,10 +107,15 @@ } class REPCommandComparator implements Comparator{ - + int base; + REPCommandComparator(int base) { + this.base = base; + } public int compare(REPCommand o1, REPCommand o2) { - if ( o1.eido2.eid ) return 1; + int eid1 = o1.eid-base; if (eid1<0) eid1 += Integer.MAX_VALUE; + int eid2 = o2.eid-base; if (eid2<0) eid2 += Integer.MAX_VALUE; + if ( eid1eid2 ) return 1; if ( o1.seqo2.seq ) return 1; assert(false); @@ -120,7 +130,7 @@ */ public void transReceiveCmd(REPNode nextEditor,REPCommand cmd){ assert (cmd.eid != eid); - unMergedCmds.add(cmd); + unMergedCmds.addLast(cmd); } public void setEid(int _eid){ @@ -128,11 +138,11 @@ } public boolean checkMergeConflict(REPCommand command) { + unMergedCmds.addLast(command); REPCommand prev = sentMergedList.remove(); - assert (prev.seq==command.seq); + //assert (prev.seq==command.seq); - if(mergeAgainList.size() > 0){ - mergeAgainList.add(command); + if (mergeAgain) { return true; } if(sentMergedList.size()==0) { @@ -143,21 +153,25 @@ public void getMergeAgain(REPNode editor) { LinkedList returnCommand = new LinkedList(); - for(int i = 0; i < mergeAgainList.size(); i++){ - //eid = REP.MEGE_EID - returnCommand.add(createUndo(mergeAgainList.get(mergeAgainList.size() - i -1))); + LinkedList merge = new LinkedList(); + LinkedList conflict = new LinkedList(); + for(REPCommand command : unMergedCmds) { + returnCommand.add(createUndo(command)); } - for(REPCommand command : mergeAgainList){ + for(REPCommand command : unMergedCmds) { if(command.eid == REP.MERGE_EID.id){ - returnCommand.add(command); + merge.addLast(command); } } - for(REPCommand command : mergeAgainList){ + for(REPCommand command : unMergedCmds){ if(command.eid == eid){ command.eid = REP.MERGE_EID.id; - returnCommand.add(command); + conflict.addLast(command); } } + unMergedCmds.clear(); + returnCommand.addAll(merge); + returnCommand.addAll(conflict); // int count = 0; // for(REPCommand command: returnCommand) { // switch(command.cmd) { @@ -168,7 +182,7 @@ // } logger.writeLog("MergeAgain ret="+returnCommand.size()); // +" increment="+count); - mergeAgainList.clear(); + mergeAgain = false; optimizedSend(editor, returnCommand); } @@ -183,7 +197,7 @@ } public void startMerge(REPCommand cmd) { - logger.writeLog("START MERGE command ="+cmd+" and top of unMergedCmds = "+ unMergedCmds.getFirst()); + logger.writeLog("START MERGE command ="+cmd+" and top of unMergedCmds = "+ unMergedCmds.getLast()); merge_mode = true; } diff -r 03ab374605a6 -r 1bb59652d89c test/mergertest/EditorSimulatorImpl.java --- a/test/mergertest/EditorSimulatorImpl.java Sat Jan 02 04:16:25 2010 +0900 +++ b/test/mergertest/EditorSimulatorImpl.java Sun Jan 03 01:01:52 2010 +0900 @@ -1,5 +1,7 @@ package test.mergertest; +import java.util.List; + import rep.REPCommand; import rep.handler.Translator; import rep.optimizers.NullOptimizer; @@ -21,4 +23,9 @@ Logger.print(command); } + @Override + public List getSentList() { + return null; + } + } diff -r 03ab374605a6 -r 1bb59652d89c test/mergertest/TestMerger.java --- a/test/mergertest/TestMerger.java Sat Jan 02 04:16:25 2010 +0900 +++ b/test/mergertest/TestMerger.java Sun Jan 03 01:01:52 2010 +0900 @@ -2,6 +2,7 @@ import java.io.IOException; import java.util.LinkedList; +import java.util.List; import rep.REP; import rep.REPCommand; @@ -49,7 +50,7 @@ trans.transReceiveCmd(null, command); } for(int i = 0; i < commandList.size(); i++){ - trans.catchOwnCommand(this); + trans.catchOwnCommand(this,eid); System.out.println(); } } @@ -131,4 +132,10 @@ // TODO Auto-generated method stub } + + @Override + public List getSentList() { + // TODO Auto-generated method stub + return null; + } } diff -r 03ab374605a6 -r 1bb59652d89c test/sematest/TestEditor.java --- a/test/sematest/TestEditor.java Sat Jan 02 04:16:25 2010 +0900 +++ b/test/sematest/TestEditor.java Sun Jan 03 01:01:52 2010 +0900 @@ -262,13 +262,15 @@ case SMCMD_JOIN_ACK : sid = cmd.sid; eid = cmd.eid; - name += "(eid="+eid+",sid="+sid+")"; + setName(name+eid); + name += "(sid="+sid+")"; inputLock = false; break; case SMCMD_PUT_ACK : sid = cmd.sid; eid = cmd.eid; - name += "(eid="+eid+",sid="+sid+")"; + setName(name+eid); + name += "(sid="+sid+")"; inputLock = false; break; case SMCMD_QUIT : diff -r 03ab374605a6 -r 1bb59652d89c test/sematest/TestInterManagerSession.java --- a/test/sematest/TestInterManagerSession.java Sat Jan 02 04:16:25 2010 +0900 +++ b/test/sematest/TestInterManagerSession.java Sun Jan 03 01:01:52 2010 +0900 @@ -106,7 +106,7 @@ LinkedListcmds = new LinkedList(); cmds.add(new REPCommand(REP.SMCMD_JOIN,0,0,0,0,"")); //if (inscnt-->0) cmds.add(new REPCommand(REP.REPCMD_INSERT,0,0,0,0,"m0")); - editors[i] = new TestEditor("Editor"+i,host,port,master); + editors[i] = new TestEditor("Editor",host,port,master); //editors[i].setCommand(cmds); } setupEditor0(); diff -r 03ab374605a6 -r 1bb59652d89c test/sematest/TestSessionManager.java --- a/test/sematest/TestSessionManager.java Sat Jan 02 04:16:25 2010 +0900 +++ b/test/sematest/TestSessionManager.java Sun Jan 03 01:01:52 2010 +0900 @@ -67,7 +67,7 @@ int port = editorPort[i%editorPort.length]; boolean master = editorMaster[i%editorMaster.length]; // TestEditor extends Thread - editors[i] = new TestEditor("Editor"+i,host,port,master); + editors[i] = new TestEditor("Editor",host,port,master); } }