# HG changeset patch # User kono # Date 1223834753 -32400 # Node ID a9a740e685fadcb2643dba6828bb3593326e18c8 # Parent f55843e829d6c372b8817b54eb91aa7d39d30519 remove session using QUIT_2_ACK diff -r f55843e829d6 -r a9a740e685fa Todo --- a/Todo Sun Oct 12 20:03:47 2008 +0900 +++ b/Todo Mon Oct 13 03:05:53 2008 +0900 @@ -1,3 +1,9 @@ +Mon Oct 13 02:57:45 JST 2008 +Todo: (kono) +InterManagerのquit中のsessionへのjoinの扱い。(putは来ないがjoinはありえる)。 +UPDATEで、sessionをlockしてからquitするか? +TestGUIで、selectする前にEditor0がquitしちゃう場合もある。 + Sun Oct 12 19:12:20 JST 2008 Todo: (kono) @@ -6,7 +12,7 @@ Done: 戻って来た時に、unMergedListに入れているらしい Todo: (kono) -new String(hoge)が結構ある。Javaの文字列は変更不可能なので、こんな +new String(hoge)。Javaの文字列は変更不可能なので、こんな ことをする意味はない。 Done: @@ -24,6 +30,9 @@ Todo: (kono) test.ServerSample.java はあるが、ClientSample.java がない。 +Todo: (kono) +SYNC出すコードをまだ入れてない。 + Sun Oct 12 10:33:36 JST 2008 Todo: @@ -42,6 +51,7 @@ Todo: manager.remove(editor) の動作のタイミング、 channel closeの扱い たぶん、quit2のackで、殺すのが正しいと思う。(kono) + Done: Mon Oct 13 02:57:45 JST 2008 Fri Oct 10 15:24:42 JST 2008 diff -r f55843e829d6 -r a9a740e685fa rep/Editor.java --- a/rep/Editor.java Sun Oct 12 20:03:47 2008 +0900 +++ b/rep/Editor.java Mon Oct 13 03:05:53 2008 +0900 @@ -166,11 +166,19 @@ case SMCMD_QUIT_2: { // QUIT_2 is returned. - //manager.remove(this); - Forwarder editor1 = getNextForwarder(); - // don't send quit2 to the editor until all pending + if (receivedCommand.eid!=eid) { + // stop this editor unless this is the start, starter will stopped + // by QUIT_2_ACK + manager.remove(this); + } + // don't send quit_2 directly to the editor until all pending // merge is processed. - editor1.setQuit2(receivedCommand); + next.setQuit2(receivedCommand); + break; + } + case SMCMD_QUIT_2_ACK: + { + manager.remove(this); break; } default: diff -r f55843e829d6 -r a9a740e685fa rep/REP.java --- a/rep/REP.java Sun Oct 12 20:03:47 2008 +0900 +++ b/rep/REP.java Mon Oct 13 03:05:53 2008 +0900 @@ -41,17 +41,18 @@ SMCMD_START_MERGE ( 75), SMCMD_START_MERGE_ACK ( 76), SMCMD_END_MERGE ( 77), - SMCMD_QUIT_2 ( 78), + SMCMD_QUIT_2 ( 67), + SMCMD_QUIT_2_ACK ( 68), SM_EID ( -1), MERGE_EID ( -2), - SMCMD_CH_MASTER ( 79), - SMCMD_UPDATE_UP ( 80), - SMCMD_UPDATE_DOWN ( 81), + SMCMD_CH_MASTER ( 80), + SMCMD_UPDATE_UP ( 81), + SMCMD_UPDATE_DOWN ( 82), - SMCMD_SYNC ( 82), - SMCMD_SYNC_ACK ( 83); + SMCMD_SYNC ( 83), + SMCMD_SYNC_ACK ( 84); public final int id; diff -r f55843e829d6 -r a9a740e685fa rep/REPCommand.java --- a/rep/REPCommand.java Sun Oct 12 20:03:47 2008 +0900 +++ b/rep/REPCommand.java Mon Oct 13 03:05:53 2008 +0900 @@ -3,7 +3,6 @@ import rep.REP; public class REPCommand { - public static REPCommand SMCMD_SESSION_JOIN = new REPCommand(REP.SMCMD_SM_JOIN, 0, 0, 0, 0, ""); public REP cmd; public int sid; public int eid; @@ -31,8 +30,8 @@ } public REPCommand() { - // TODO Auto-generated constructor stub } + public REPCommand(int cmd, int sid, int eid, int seq, int lineno, int textsiz, String string) { this.cmd = REP.newREP(cmd); diff -r f55843e829d6 -r a9a740e685fa rep/SessionManager.java --- a/rep/SessionManager.java Sun Oct 12 20:03:47 2008 +0900 +++ b/rep/SessionManager.java Mon Oct 13 03:05:53 2008 +0900 @@ -625,10 +625,20 @@ public void remove(Editor editor) { + Session s0 = null; + editorList.remove(editor); for(Session s:sessionList) { - s.deleteForwarder(editor); + if (s.deleteForwarder(editor)) { + if (editor.getEID()==0) s0=s; + } } - //assert(false); + if (s0!=null) removeSession(s0); + updateGUI(); + } + + private void removeSession(Session s0) { + sessionList.remove(s0); + // send UPDATE to all the session manager } public void setParentPort(int port) { diff -r f55843e829d6 -r a9a740e685fa test/sematest/TestEditor.java --- a/test/sematest/TestEditor.java Sun Oct 12 20:03:47 2008 +0900 +++ b/test/sematest/TestEditor.java Mon Oct 13 03:05:53 2008 +0900 @@ -288,6 +288,9 @@ case SMCMD_QUIT_2 : if (cmd.eid!=eid) { forwardCommand(cmd); + } else { + cmd.cmd = REP.SMCMD_QUIT_2_ACK; + sendCommand(cmd); } running = false; break;