# HG changeset patch # User one # Date 1284297833 -32400 # Node ID 3819dec4641eb43a85acf98d36f2a93a9171e0dc # Parent 15888d516f10b6f35cb6991e91bb1cfdc2e73419 command waiting during merge diff -r 15888d516f10 -r 3819dec4641e Todo --- a/Todo Sun Sep 12 15:11:46 2010 +0900 +++ b/Todo Sun Sep 12 22:23:53 2010 +0900 @@ -7,6 +7,11 @@ mergeAgain した時に、前のmerge command がeditorから返されることがあって、 それは、全部、読む必要がある。 +Merge 中のcommandがblockされてない。 + +next.send(command) すると、直接、次のeditorに送られてしまうので、 +merge 中に止められない。 + Sat Jan 16 18:06:37 JST 2010 sentList 全部削除だと quit2 が早めに出されてしまうので、 diff -r 15888d516f10 -r 3819dec4641e rep/ServerMainLoop.java --- a/rep/ServerMainLoop.java Sun Sep 12 15:11:46 2010 +0900 +++ b/rep/ServerMainLoop.java Sun Sep 12 22:23:53 2010 +0900 @@ -113,7 +113,7 @@ private boolean checkWaitingWrite() throws IOException { PacketSet p = writeQueue.poll(); if (p!=null) { - sendLog(p); + // sendLog(p); p.channel.write(p.command); return true; } @@ -124,6 +124,7 @@ * Debug message * @param p */ + @SuppressWarnings("unused") private void sendLog(PacketSet p) { REPNode to; String s; diff -r 15888d516f10 -r 3819dec4641e rep/handler/Editor.java --- a/rep/handler/Editor.java Sun Sep 12 15:11:46 2010 +0900 +++ b/rep/handler/Editor.java Sun Sep 12 22:23:53 2010 +0900 @@ -20,8 +20,8 @@ private LinkedList sentList = new LinkedList(); protected LinkedList waitingCommandInMerge= new LinkedList(); private REPCommand quit2=null; + private REPCommand preMergeCommand; private boolean merging; - private REPCommand preMergeCommand; public static boolean noMergeMode=false; static final boolean doOptimize = true; @@ -82,11 +82,11 @@ switch(command.cmd) { case REPCMD_INSERT_ACK: case REPCMD_DELETE_ACK: - if (waitingRequired(command)) return; + // if (waitingRequired(command)) return; if (command.eid==eid) { // Second Phase が終わって同期が終了。 checkAck(command); - SessionManager.logger.writeLog("Complete "+command); + // SessionManager.logger.writeLog("Complete "+command); checkQuit(); return; } @@ -112,13 +112,13 @@ return; } else if (command.eid == eid){ // 編集コマンドが一周して来た - if (waitingRequired(command)) return; + // if (waitingRequired(command)) return; checkReturnedCommand(command); return; } //他のエディタからの編集コマンド - if (waitingRequired(command)) return; + // if (waitingRequired(command)) return; translator.transReceiveCmd(next,command); sendEditorCommand(command); @@ -171,13 +171,13 @@ return false; } - public void addWaitingCommand(PacketSet set) { - if (preMergeCommand!=null) { - if (preMergeCommand.eid==set.command.eid - && preMergeCommand.seq==set.command.seq) { - assert(false); - } - } + public void addWaitingCommand(PacketSet set) { +// if (preMergeCommand!=null) { +// if (preMergeCommand.eid==set.command.eid +// && preMergeCommand.seq==set.command.seq) { +// assert(false); +// } +// } waitingCommandInMerge.add(set); } @@ -228,23 +228,13 @@ 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.pollFirst(); -// // 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(false); -// assert(command.cmd==REP.REPCMD_DELETE_ACK|| -// command.cmd==REP.REPCMD_INSERT_ACK); -// return false; } return true; } @@ -292,7 +282,6 @@ return translator.isMerging(); } - void checkEndMerge() { if (merging) { @@ -303,6 +292,7 @@ if (quit2!=null) checkQuit(); } + private void endMerge() { REPCommand mergeEnd = new REPCommand(REP.SMCMD_END_MERGE,sid,eid,seq(),0,""); send(mergeEnd); @@ -405,9 +395,18 @@ @Override + public void send(REPCommand command) { + if (command.eid == REP.MERGE_EID.id || + command.cmd==REP.SMCMD_END_MERGE || + !waitingRequired(command)) { + super.send(command); + } + } + + @Override public void handle(REPCommand command, REPSelectionKey key) throws IOException { - ServerMainLoop.logger.writeLog("Manager "+manager.getId()+" read : command = " + command - +" from "+manager.editorList.editorByChannel(channel)); + //ServerMainLoop.logger.writeLog("Manager "+manager.getId()+" read : command = " + command + // +" from "+manager.editorList.editorByChannel(channel)); if (command.cmd==REP.SMCMD_JOIN||command.cmd==REP.SMCMD_PUT) { // assert false; // 一つのエディタ上に複数のセッションが作られた場合。 diff -r 15888d516f10 -r 3819dec4641e rep/handler/Translator.java --- a/rep/handler/Translator.java Sun Sep 12 15:11:46 2010 +0900 +++ b/rep/handler/Translator.java Sun Sep 12 22:23:53 2010 +0900 @@ -55,7 +55,7 @@ * @param cmd */ public boolean catchOwnCommand(REPNode editor, REPCommand prev){ - logger.writeLog("beforeMerge:"+unMergedCmds); + logger.writeLog("beforeMerge"+eid+":"+unMergedCmds); LinkedList output = new LinkedList(); // merge queue上にあるコマンドを全部undoコマンドするのと同時に // sort したコマンド列を生成する @@ -68,14 +68,15 @@ 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+" ack="+prev); + logger.writeLog("sortedMerge"+eid+":"+cmds); + // logger.writeLog("Ediotr"+eid+" Merge:: sorted sent list => Eid="+eid+cmds+" ack="+prev); output.addAll(cmds); // ACKが来たものは必ず先頭 // unMerged command のdeleteのundo string は、この時点で使えない。 // Editor 側から送り返して来たものを使う必要がある。 unMergedCmds.clear(); - logger.writeLog("outputMerge:"+output); + logger.writeLog("outputMerge"+eid+":"+output); return optimizedSend(editor,output); } @@ -99,7 +100,7 @@ sentMergedList.addLast(m); editor.send(m); } - logger.writeLog("Output eid="+eid+"SentMergedList = "+sentMergedList); + logger.writeLog("OptimizedOutputMerge"+eid+":"+sentMergedList); merge_mode = true; return true; } @@ -147,11 +148,10 @@ REPCommand prev = sentMergedList.getFirst(); if (prev.seq==command.seq) { - logger.writeLog("Input eid="+eid+"SentMergedList = "+sentMergedList); + // logger.writeLog("Input eid="+eid+"SentMergedList = "+sentMergedList); sentMergedList.removeFirst(); - } else { - // previous merge command may be returned - } + } + // previous merge command may be returned if(sentMergedList.size()==0 && !mergeAgain) { merge_mode=false; @@ -182,16 +182,7 @@ unMergedCmds.clear(); returnCommand.addAll(merge); returnCommand.addAll(conflict); -// int count = 0; -// for(REPCommand command: returnCommand) { -// switch(command.cmd) { -// case REPCMD_INSERT: count++; break; -// case REPCMD_DELETE: count--; break; -// default: assert false; -// } -// } logger.writeLog("MergeAgain "+eid+" ret="+returnCommand.size()); -// +" increment="+count); mergeAgain = false; optimizedSend(editor, returnCommand); } diff -r 15888d516f10 -r 3819dec4641e test/sematest/TestEditor.java --- a/test/sematest/TestEditor.java Sun Sep 12 15:11:46 2010 +0900 +++ b/test/sematest/TestEditor.java Sun Sep 12 22:23:53 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); }