changeset 373:ab4405cd3351 current-release **INVALID**

looks like we are done. Wait for further test.
author kono
date Wed, 22 Oct 2008 02:53:12 +0900
parents e16b6326fdac
children 2b00e10394fd
files Todo rep/Editor.java rep/Forwarder.java rep/Session.java test/sematest/TestInterManagerSession.java
diffstat 5 files changed, 57 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- 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)
--- 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:
--- 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) {
--- 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<REPCommand> 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);
+	}
 
 }
--- 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
+			LinkedList<REPCommand>cmds = new LinkedList<REPCommand>();
+			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 @@
 		LinkedList<REPCommand>cmds = new LinkedList<REPCommand>();
 		//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;
 		LinkedList<REPCommand>nullcmds = new LinkedList<REPCommand>();