# HG changeset patch # User one # Date 1227571672 -32400 # Node ID 8009dd7b20135d36106278dbf5af3695dc3fafe7 # Parent 0b1d52ffb80345bc9b042f3d11aa8edeb59b1e25 command execution when commandInMergeQueue>0 duplicate JOIN_ACK diff -r 0b1d52ffb803 -r 8009dd7b2013 Todo --- a/Todo Tue Nov 25 03:46:31 2008 +0900 +++ b/Todo Tue Nov 25 09:07:52 2008 +0900 @@ -12,6 +12,9 @@ Editor側で、自分が出したINSERT/DELETE commandは無視する必要がある。 ついでに、Editor側でINSERT_ACK/DELETE_ACKに書き換える方が良いらしい。 +INSERT_ACK/DELETE_ACKが出ない場合があるらしい。と言うか、最初の +一回しか出ていない。 + Wed Nov 19 19:21:47 JST 2008 ACK base に書き換えるのは良いが、途中でjoinして diff -r 0b1d52ffb803 -r 8009dd7b2013 rep/handler/Editor.java --- a/rep/handler/Editor.java Tue Nov 25 03:46:31 2008 +0900 +++ b/rep/handler/Editor.java Tue Nov 25 09:07:52 2008 +0900 @@ -18,7 +18,7 @@ private Translator translator; // REPCommands we are going to send to the next editor private List sentList = new LinkedList(); - protected List waitingCommandInMerge= new LinkedList(); + protected LinkedList waitingCommandInMerge= new LinkedList(); private REPCommand quit2=null; private boolean merging; private REPCommand preMergeCommand; @@ -44,11 +44,13 @@ switch(command.cmd) { case REPCMD_INSERT_ACK: case REPCMD_DELETE_ACK: + if (waitingRequired(command)) return; if (command.eid==eid) { // Second Phase が終わって同期が終了。 + removeFromSentList(command); + SessionManager.logger.writeLog("Complete "+command); return; } - if (waitingRequired(command)) return; checkReturnedCommand(command); return; case REPCMD_INSERT_USER: @@ -56,7 +58,7 @@ userEditorCommand(command); return; case REPCMD_DELETE_USER: - command.cmd = REP.REPCMD_INSERT; + command.cmd = REP.REPCMD_DELETE; userEditorCommand(command); return; case REPCMD_INSERT: @@ -169,12 +171,18 @@ * @param command */ void checkReturnedCommand(REPCommand command) { + if (removeFromSentList(command)) + startMerge(command); + return; + } + + private boolean removeFromSentList(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; + return false; } REPCommand prev = sentList.remove(0); // ServerMainLoop.logger.writeLog("Editor eid="+eid+" remove sentList:"+(prev==null?"null":prev)); @@ -186,10 +194,9 @@ assert(command.cmd==REP.REPCMD_DELETE_ACK|| command.cmd==REP.REPCMD_INSERT_ACK); sentList.add(0,prev); - return; + return false; } - startMerge(command); - return; + return true; } private void startMerge(REPCommand command) { @@ -254,6 +261,7 @@ switch(keep.cmd) { case REPCMD_INSERT: keep.cmd = REP.REPCMD_INSERT_ACK;break; case REPCMD_DELETE: keep.cmd = REP.REPCMD_DELETE_ACK;break; + default: assert(false); } sentList.add(keep); ServerMainLoop.logger.writeLog("Editor eid:"+eid+" sentList = "+sentList); @@ -392,20 +400,22 @@ * @throws IOException */ public void checkWaitingCommandInMerge() { - int count = waitingCommandInMerge.size(); - if (count==0) return; - if (isMerging()) return; - while(count-->0) { - PacketSet p = waitingCommandInMerge.remove(0); + if (translator==null||isMerging()) return; + LinkedList w = waitingCommandInMerge; + waitingCommandInMerge = new LinkedList(); + while(w.size()>0) { + if (isMerging()) { + w.addAll(waitingCommandInMerge); + waitingCommandInMerge = w; + return; + } + PacketSet p = w.remove(0); try { - // if (manager.sessionManage(e, p.command)) { // we don't need this - // assert false; - // return; - // } manage(p.command); } catch (Exception e1) { - // should be e.close()? + assert false; manager.close(p.channel); + return; } } } diff -r 0b1d52ffb803 -r 8009dd7b2013 rep/handler/Forwarder.java --- a/rep/handler/Forwarder.java Tue Nov 25 03:46:31 2008 +0900 +++ b/rep/handler/Forwarder.java Tue Nov 25 09:07:52 2008 +0900 @@ -111,6 +111,7 @@ // we have one more point to send JOIN_ACK to the editor. session.addForwarder(this); joinAck(sendCommand, session.getSID()); + return; } else { // We have a session, but joined editor is on the other sm. // SELECT_ACK is sent to the session ring to diff -r 0b1d52ffb803 -r 8009dd7b2013 test/Text.java --- a/test/Text.java Tue Nov 25 03:46:31 2008 +0900 +++ b/test/Text.java Tue Nov 25 09:07:52 2008 +0900 @@ -5,7 +5,6 @@ import java.util.List; import rep.REPCommand; -import rep.REP; public class Text extends LinkedList { diff -r 0b1d52ffb803 -r 8009dd7b2013 test/sematest/TestEditor.java --- a/test/sematest/TestEditor.java Tue Nov 25 03:46:31 2008 +0900 +++ b/test/sematest/TestEditor.java Tue Nov 25 09:07:52 2008 +0900 @@ -61,13 +61,14 @@ this.master=true; text = new Text(txts); cmds.add(new REPCommand(REP.SMCMD_PUT,0,0,0,0,name+"-file")); - cmds.add(new REPCommand(REP.REPCMD_INSERT_USER,0,0,0,0,"m0")); - cmds.add(new REPCommand(REP.REPCMD_DELETE_USER,0,0,0,0,"m0")); + //cmds.add(new REPCommand(REP.REPCMD_INSERT_USER,0,0,0,0,"m0")); + //cmds.add(new REPCommand(REP.REPCMD_DELETE_USER,0,0,0,0,"m0")); //cmds.add(new REPCommand(REP.SMCMD_QUIT,0,0,0,0,"")); } else { text = new Text(new String[0]); cmds.add(new REPCommand(REP.SMCMD_JOIN,0,0,0,0,name)); cmds.add(new REPCommand(REP.REPCMD_INSERT_USER,0,0,0,0,"c0")); + cmds.add(new REPCommand(REP.REPCMD_DELETE_USER,0,0,0,0,"c0")); } } @@ -226,7 +227,7 @@ private void handle(REPCommand cmd) { if (cmd==null) return; - ns.writeLog(name +"(eid="+eid+",sid="+sid+")"+": read "+cmd); + ns.writeLog(name +": read "+cmd); switch(cmd.cmd) { case REPCMD_INSERT : if (cmd.eid!=eid) {