# HG changeset patch # User one # Date 1285975946 -32400 # Node ID c83af820eb625d26e51c68bfda8b2652e6d757e0 # Parent 295c257ac073f991a01ad611aa255fb3e43c791e merge mark diff -r 295c257ac073 -r c83af820eb62 Todo --- a/Todo Fri Oct 01 18:48:40 2010 +0900 +++ b/Todo Sat Oct 02 08:32:26 2010 +0900 @@ -7,6 +7,10 @@ 自分のinsert commandを落してしまうらしい。ack のcheckと、editor list をわけるべきなのか? +わけました。 + +sort は、確定したところまででないとだめ。 + Tue Sep 28 10:43:14 JST 2010 廻る順序でコマンド順は確定する。 diff -r 295c257ac073 -r c83af820eb62 rep/REP.java --- a/rep/REP.java Fri Oct 01 18:48:40 2010 +0900 +++ b/rep/REP.java Sat Oct 02 08:32:26 2010 +0900 @@ -9,6 +9,7 @@ REPCMD_DELETE_ACK ( 10), REPCMD_CLOSE ( 11), REPCMD_CLOSE_2 ( 12), + REPCMD_MERGE_MARK(13), REPCMD_NOP ( 15), SMCMD_JOIN ( 41), SMCMD_JOIN_ACK ( 42), diff -r 295c257ac073 -r c83af820eb62 rep/handler/Editor.java --- a/rep/handler/Editor.java Fri Oct 01 18:48:40 2010 +0900 +++ b/rep/handler/Editor.java Sat Oct 02 08:32:26 2010 +0900 @@ -111,6 +111,7 @@ return; case REPCMD_INSERT: case REPCMD_DELETE: + case REPCMD_MERGE_MARK: if (command.eid == REP.MERGE_EID.id){ //マージコマンドが返ってきた if(translator.checkMergeConflict(command)){ @@ -240,15 +241,13 @@ next.send(command); } - boolean merge(REPCommand command) { - //マージして送信 - return translator.catchOwnCommand(this, command); - } - - @Override public List getSentList() { return sentList; } + + public void setSentList(LinkedList list) { + sentList = list; + } /** * 一周して来たcommandの処理。 @@ -350,7 +349,7 @@ } else { next.send(preMergeCommand); } - sentList.clear(); + // sentList.clear(); preMergeCommand = null; } @@ -391,6 +390,7 @@ case REPCMD_INSERT_USER: case REPCMD_DELETE_ACK: case REPCMD_INSERT_ACK: + case REPCMD_MERGE_MARK: { translate(command); break; @@ -400,7 +400,7 @@ { // マージの処理と次のエディタへコマンドを送信する処理 translator.mergeAck(); - if (!merge(preMergeCommand)) { + if (!translator.merge(this, preMergeCommand)) { // nothing to do, send END_MERGE checkEndMerge(); } diff -r 295c257ac073 -r c83af820eb62 rep/handler/Forwarder.java --- a/rep/handler/Forwarder.java Fri Oct 01 18:48:40 2010 +0900 +++ b/rep/handler/Forwarder.java Sat Oct 02 08:32:26 2010 +0900 @@ -1,6 +1,7 @@ package rep.handler; import java.io.IOException; +import java.util.LinkedList; import java.util.List; import rep.PacketSet; @@ -146,10 +147,6 @@ } - @Override - public List getSentList() { - return null; - } @Override public void write(REPCommand command) { diff -r 295c257ac073 -r c83af820eb62 rep/handler/REPNode.java --- a/rep/handler/REPNode.java Fri Oct 01 18:48:40 2010 +0900 +++ b/rep/handler/REPNode.java Sat Oct 02 08:32:26 2010 +0900 @@ -1,6 +1,7 @@ package rep.handler; import java.io.IOException; +import java.util.LinkedList; import java.util.List; import rep.REP; @@ -167,13 +168,10 @@ public abstract void checkWaitingCommandInMerge(); - public abstract List getSentList() ; - public void sendToEditor(REPCommand m) { send(m); } - } diff -r 295c257ac073 -r c83af820eb62 rep/handler/Translator.java --- a/rep/handler/Translator.java Fri Oct 01 18:48:40 2010 +0900 +++ b/rep/handler/Translator.java Sat Oct 02 08:32:26 2010 +0900 @@ -55,30 +55,40 @@ * Start merge process. * @param cmd */ - public boolean catchOwnCommand(REPNode editor, REPCommand prev){ + public boolean merge(Editor editor, REPCommand prev){ logger.writeLog("beforeMerge"+eid+":"+unMergedCmds); LinkedList output = new LinkedList(); + LinkedList newSentList = new LinkedList(); // merge queue上にあるコマンドを全部undoコマンドするのと同時に // sort したコマンド列を生成する for( REPCommand cmd0 : unMergedCmds) { - output.add( createUndo(cmd0) ); + output.addLast( createUndo(cmd0) ); } sortedEditCmds = new TreeSet(new REPCommandComparator(1)); logger.writeLog("sentList"+eid+":"+editor.getSentList()); + boolean flag = false; for( REPCommand cmd0 : editor.getSentList()) { - if (cmd0.cmd==REP.REPCMD_INSERT || cmd0.cmd==REP.REPCMD_DELETE) - sortedEditCmds.add(cmd0); + if (cmd0.cmd==REP.REPCMD_INSERT || cmd0.cmd==REP.REPCMD_DELETE) { + if (flag) { + output.addLast(cmd0); + newSentList.addLast(cmd0); + } else { + sortedEditCmds.add(cmd0); + } + } + if (cmd0.sid==prev.sid && cmd0.eid==prev.eid && cmd0.seq==prev.seq) { + flag = true; + output.addAll(sortedEditCmds); + output.addLast(new REPCommand(REP.REPCMD_MERGE_MARK,0, editor.getSID(), REP.MERGE_EID.id, editor.seq(), "")); + } } logger.writeLog("sortedMerge"+eid+":"+sortedEditCmds); - // logger.writeLog("Ediotr"+eid+" Merge:: sorted sent list => Eid="+eid+cmds+" ack="+prev); - output.addAll(sortedEditCmds); - // ACKが来たものは必ず先頭 - // unMerged command のdeleteのundo string は、この時点で使えない。 // Editor 側から送り返して来たものを使う必要がある。 unMergedCmds.clear(); logger.writeLog("outputMerge"+eid+":"+output); + editor.setSentList(newSentList); return optimizedSend(editor,output); } @@ -87,7 +97,15 @@ */ public void endMerge() { sortedEditCmds = null; - unMergedCmds = new LinkedList(); + LinkedListu = new LinkedList(); + boolean flag=true; + for(REPCommand command:unMergedCmds) { + if (command.cmd==REP.REPCMD_MERGE_MARK) { + flag = false; + } + if (flag) u.addLast(command); + } + unMergedCmds = u; } /** * Sent optimized merged command list @@ -174,30 +192,18 @@ return mergeAgain; } - public void getMergeAgain(REPNode editor) { + public void getMergeAgain(Editor editor) { if (sentMergedList.size()>0) return; // wait for previous merge completion LinkedList returnCommand = new LinkedList(); - LinkedList merge = new LinkedList(); - LinkedList conflict = new LinkedList(); for(REPCommand command : unMergedCmds) { - returnCommand.add(createUndo(command)); + if (command.cmd==REP.REPCMD_INSERT||command.cmd==REP.REPCMD_DELETE) + returnCommand.add(createUndo(command)); } - for(REPCommand command : unMergedCmds) { - if(command.eid == REP.MERGE_EID.id){ - merge.addLast(command); - sortedEditCmds.add(command); - } - } - for(REPCommand command : unMergedCmds){ - if(command.eid == eid){ - command.eid = REP.MERGE_EID.id; - conflict.addLast(command); - } - } + returnCommand.addAll(sortedEditCmds); + returnCommand.addLast(new REPCommand(REP.REPCMD_MERGE_MARK,0, editor.getSID(), REP.MERGE_EID.id, editor.seq(), "")); + returnCommand.addAll(editor.getSentList()); unMergedCmds.clear(); - returnCommand.addAll(merge); - returnCommand.addAll(conflict); logger.writeLog("MergeAgain "+eid+" ret="+returnCommand.size()); mergeAgain = false; optimizedSend(editor, returnCommand); diff -r 295c257ac073 -r c83af820eb62 test/mergertest/EditorSimulatorImpl.java --- a/test/mergertest/EditorSimulatorImpl.java Fri Oct 01 18:48:40 2010 +0900 +++ b/test/mergertest/EditorSimulatorImpl.java Sat Oct 02 08:32:26 2010 +0900 @@ -1,5 +1,6 @@ package test.mergertest; +import java.util.LinkedList; import java.util.List; import rep.REPCommand; @@ -23,14 +24,11 @@ Logger.print(command); } - @Override - public List getSentList() { - return null; - } @Override public void write(REPCommand command) { } + } diff -r 295c257ac073 -r c83af820eb62 test/mergertest/TestMerger.java --- a/test/mergertest/TestMerger.java Fri Oct 01 18:48:40 2010 +0900 +++ b/test/mergertest/TestMerger.java Sat Oct 02 08:32:26 2010 +0900 @@ -2,19 +2,18 @@ import java.io.IOException; import java.util.LinkedList; -import java.util.List; import rep.REP; import rep.REPCommand; import rep.Session; import rep.channel.REPSelectionKey; import rep.channel.REPSocketChannel; -import rep.handler.REPNode; +import rep.handler.Editor; import rep.handler.Translator; import rep.optimizers.NullOptimizer; import test.editortest.Logger; -public class TestMerger extends REPNode{ +public class TestMerger extends Editor { Translator trans; private int seq; private LinkedList commandList; @@ -27,6 +26,7 @@ } public TestMerger(){ + super(null, 0); eid = 1; sid = 1; trans = new Translator(eid, new NullOptimizer()); @@ -50,57 +50,49 @@ trans.transReceiveCmd(null, command); } for(int i = 0; i < commandList.size(); i++){ - trans.catchOwnCommand(this,null); + trans.merge(this,null); System.out.println(); } } @Override public void cancel(REPSocketChannel channel1) { - // TODO Auto-generated method stub } @Override public void checkWaitingCommandInMerge() { - // TODO Auto-generated method stub } @Override public void forwardedCommandManage(REPCommand command) { - // TODO Auto-generated method stub } @Override public String getLocalHostName() { - // TODO Auto-generated method stub return null; } @Override public void handle(REPCommand command, REPSelectionKey key) throws IOException { - // TODO Auto-generated method stub } @Override public void joinAck(REPCommand sendCommand, int sid) { - // TODO Auto-generated method stub } @Override public boolean manage(REPCommand command) { - // TODO Auto-generated method stub return false; } @Override public void selectSession(REPCommand sendCommand, Session session) { - // TODO Auto-generated method stub } @@ -111,31 +103,24 @@ @Override public void sendWithSeq(REPCommand command) { - // TODO Auto-generated method stub } @Override public int seq() { - // TODO Auto-generated method stub return seq++; } @Override public void setQuit2(REPCommand receivedCommand) { - // TODO Auto-generated method stub + } - @Override - public List getSentList() { - // TODO Auto-generated method stub - return null; - } @Override public void write(REPCommand command) { - // TODO Auto-generated method stub } + } diff -r 295c257ac073 -r c83af820eb62 test/sematest/TestEditor.java --- a/test/sematest/TestEditor.java Fri Oct 01 18:48:40 2010 +0900 +++ b/test/sematest/TestEditor.java Sat Oct 02 08:32:26 2010 +0900 @@ -250,6 +250,7 @@ forwardCommand(cmd); break; case REPCMD_NOP : + case REPCMD_MERGE_MARK : case REPCMD_INSERT_ACK : case REPCMD_DELETE_ACK : forwardCommand(cmd);