changeset 341:a9a740e685fa

remove session using QUIT_2_ACK
author kono
date Mon, 13 Oct 2008 03:05:53 +0900
parents f55843e829d6
children 4b056e46ba83
files Todo rep/Editor.java rep/REP.java rep/REPCommand.java rep/SessionManager.java test/sematest/TestEditor.java
diffstat 6 files changed, 46 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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:
--- 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;
 	 
--- 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);
--- 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) {
--- 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;