# HG changeset patch # User kono # Date 1224611592 -32400 # Node ID ab4405cd335142449ccb9a7da118f1c149357f2c # Parent e16b6326fdaca81e28a2fcc048ec0ff3a5823378 looks like we are done. Wait for further test. diff -r e16b6326fdac -r ab4405cd3351 Todo --- a/Todo Wed Oct 22 00:42:47 2008 +0900 +++ b/Todo Wed Oct 22 02:53:12 2008 +0900 @@ -1,3 +1,11 @@ +Wed Oct 22 02:31:27 JST 2008 + +Todo: (kono) +editorの中で、next.getEID() とか next.setQuit2() とかやっているのは、 +ditributed の場合は、うまく動かない。だまって、forward されるはず +だが... やっぱり、dummy editor ではなくて、専用のものを作らないと +だめ? + Mon Oct 20 16:38:39 JST 2008 Todo: (kono) diff -r e16b6326fdac -r ab4405cd3351 rep/Editor.java --- a/rep/Editor.java Wed Oct 22 00:42:47 2008 +0900 +++ b/rep/Editor.java Wed Oct 22 02:53:12 2008 +0900 @@ -52,11 +52,15 @@ //マージ中にエディタからの割り込みがあった場合 translator.getMergeAgain(this); } - endMerge(); + checkEndMerge(); } else if(command.eid == next.getEID()){ // 次のEditorで一周するコマンドが来た if(next==this) return; // singleton case - ((Editor) next).checkReturnedCommand(command); + // これは、distributed case では、うまくいかないので、送り先のforwarder で処理する。 + if (next.isDirect()) + ((Editor) next).checkReturnedCommand(command); + else + next.send(command); } else { //他のエディタからの編集コマンド assert (command.eid!=REP.MERGE_EID.id && command.eid!=eid ); @@ -89,6 +93,7 @@ } // START_MERGE を送る + // 送らないで良い場合もある? REPCommand cmd = new REPCommand(REP.SMCMD_START_MERGE,command.sid,REP.SM_EID.id,seq(),0,""); send(cmd); // Session Manager 側で、このeditorへの他のeditorからの @@ -122,7 +127,7 @@ - void endMerge() { + void checkEndMerge() { if(translator.isMerging()) return; REPCommand mergeEnd = new REPCommand(REP.SMCMD_END_MERGE,eid,sid,seq(),0,""); send(mergeEnd); @@ -159,7 +164,7 @@ translator.mergeAck(); if (!merge(receivedCommand)) { // nothing to do, send END_MERGE - endMerge(); + checkEndMerge(); } break; } @@ -178,7 +183,11 @@ } // don't send quit_2 directly to the editor until all pending // merge is processed. - next.setQuit2(receivedCommand); + // this does not work in distributed case. + if (next.isDirect()) + next.setQuit2(receivedCommand); + else + next.send(receivedCommand); break; } case SMCMD_QUIT_2_ACK: diff -r e16b6326fdac -r ab4405cd3351 rep/Forwarder.java --- a/rep/Forwarder.java Wed Oct 22 00:42:47 2008 +0900 +++ b/rep/Forwarder.java Wed Oct 22 02:53:12 2008 +0900 @@ -83,7 +83,17 @@ if (s==null) throw new IOException(); Forwarder editor = s.getFirstForwarder(channel); if (editor==null) throw new IOException(); - editor.manage(command); + if (!editor.isDirect()) { + editor.send(command); + return; + } + if (command.cmd==REP.SMCMD_QUIT_2) { + editor.setQuit2(command); + } else if (command.eid==editor.eid) { + ((Editor)editor).checkReturnedCommand(command); + } else { + editor.manage(command); + } } public void setMode(REP cmd) { diff -r e16b6326fdac -r ab4405cd3351 rep/Session.java --- a/rep/Session.java Wed Oct 22 00:42:47 2008 +0900 +++ b/rep/Session.java Wed Oct 22 02:53:12 2008 +0900 @@ -51,6 +51,8 @@ put(forwarder.eid,forwarder); isOwner = true; if(firstForwarder==null) firstForwarder = forwarder; + + printSessionDetail(); } public void addEditor(Editor editor) { @@ -138,7 +140,8 @@ public Forwarder getFirstForwarder(REPSocketChannel channel) { Forwarder f = firstForwarder; - while(f.next!=null && f.channel!=channel) f = f.next; + while(f.channel!=channel) f = f.next; + SessionManager.logger.writeLog("getFirstForwarder="+f.next+"=>"+f.next.channel); return f.next; } @@ -183,6 +186,19 @@ firstForwarder = last = f; } - + public void printSessionDetail() { + Forwarder f = firstForwarder; + if (f==null) return; + String log = "Session Detail "; + while (f!=null) { + log += ","+f+"="+f.channel+"->"+f.next; + f = f.next; + if (f==firstForwarder) { + log += "*"; + break; + } + } + SessionManager.logger.writeLog(log); + } } diff -r e16b6326fdac -r ab4405cd3351 test/sematest/TestInterManagerSession.java --- a/test/sematest/TestInterManagerSession.java Wed Oct 22 00:42:47 2008 +0900 +++ b/test/sematest/TestInterManagerSession.java Wed Oct 22 02:53:12 2008 +0900 @@ -68,6 +68,7 @@ } }; + private int inscnt=2; private void startEditor(SessionManager m) { for(TestEditor editor:editors) { @@ -101,7 +102,11 @@ int port = editorPort[i%editorPort.length]; boolean master = editorMaster[i%editorMaster.length]; // TestEditor extends Thread + 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].setCommand(cmds); } setupEditor0(); } @@ -114,7 +119,7 @@ LinkedListcmds = new LinkedList(); //cmds.add(new REPCommand(REP.SMCMD_JOIN,0,0,0,0,"Editor0-file")); cmds.add(new REPCommand(REP.SMCMD_PUT,0,0,0,0,"Editor0-file")); - cmds.add(new REPCommand(REP.REPCMD_INSERT,0,0,0,0,"m0")); + //cmds.add(new REPCommand(REP.REPCMD_INSERT,0,0,0,0,"m0")); //cmds.add(new REPCommand(REP.REPCMD_DELETE,0,0,0,0,"m0")); editorStartCmds = cmds; LinkedListnullcmds = new LinkedList();