changeset 364:c965ef2b5fd6

*** empty log message ***
author kono
date Mon, 20 Oct 2008 13:44:34 +0900
parents 1a8856580d38
children c432755c3555
files Todo rep/Editor.java rep/FirstConnector.java rep/SessionManager.java rep/channel/ChannelSimulator.java rep/channel/REPSocketChannel.java test/sematest/TestInterManagerSession.java
diffstat 7 files changed, 42 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/Todo	Mon Oct 20 03:03:28 2008 +0900
+++ b/Todo	Mon Oct 20 13:44:34 2008 +0900
@@ -1,5 +1,15 @@
+Mon Oct 20 10:22:02 JST 2008
+
+Tdo: (kono)
+Inter-session での、editor の削除、master でないeditorのclose/quit。
+
 Sun Oct 19 21:23:27 JST 2008
 
+Todo: IPv6 対応 (kono)
+getAddress で取れたアドレスには、すべて、select/connect する
+必要がある。localhost な hostname よりも大域的なhostnameを
+優先した方が良い。
+
 Todo: dispatch先のEditorの作成 (kono)
 
 Session は select 時に、channelを持つeditorが登録される。
--- a/rep/Editor.java	Mon Oct 20 03:03:28 2008 +0900
+++ b/rep/Editor.java	Mon Oct 20 13:44:34 2008 +0900
@@ -40,6 +40,7 @@
 
 		if(command.eid == eid){
 			//エディタからの新たな編集コマンド
+			if (next==this) return; // singleton case
 			translator.transSendCmd(command);
 			sentList.add(new REPCommand(command));
 			assert(sentList.size()<limit);
--- a/rep/FirstConnector.java	Mon Oct 20 03:03:28 2008 +0900
+++ b/rep/FirstConnector.java	Mon Oct 20 13:44:34 2008 +0900
@@ -61,10 +61,10 @@
 			manager.smList.addWaitingSessionManager(fw, command);
 			break;
 		}
-		case SMCMD_SM_JOIN_ACK:
-			manager.setSessionManagerID(command.sid);
-			fw = new Forwarder(manager);
-			break;
+//		case SMCMD_SM_JOIN_ACK:
+//			manager.setSessionManagerID(command.sid);
+//			fw = new Forwarder(manager);
+//			break;
 		default: throw new IOException();
 		}
 		//myHost を設定。
--- a/rep/SessionManager.java	Mon Oct 20 03:03:28 2008 +0900
+++ b/rep/SessionManager.java	Mon Oct 20 13:44:34 2008 +0900
@@ -273,6 +273,7 @@
 	 * After loop detection, we give up session manager join.
 	 */
 	private void cancel_sm_join() {
+		logger.writeLog("Loop detected "+this);
 		removeChannel(sm_join_channel);
 		sm_join_channel=null;
 	}
@@ -282,7 +283,7 @@
 		REPSelectionKey<REPCommand> key = channel.channel.keyFor1(selector);
 		key.cancel();
 		try {
-			channel.channel.close();
+			channel.channel.close1();
 		} catch (IOException e) {
 		}
 	}
@@ -318,11 +319,10 @@
 	 * ならない。複数のSession Managerにjoinすることは出来ない。(NATを実装するまでは)。
 	 * @param host
 	 */
-	public void connectSession(String host) {
+	public void connectSession(String host, int port) {
 		if (sm_join_channel!=null) return;
 		if (!sessionList.isEmpty()) return;
 		if (!smList.isMaster()) return;
-		int port = parent_port;
 		/*
 		 * IPv6 対応では、複数のアドレスを取って、それのすべてに接続を試す必要が
 		 * ある。
@@ -338,6 +338,10 @@
 		}catch (IOException e) {
 		}
 	}
+
+	public void connectSession(String host) {
+		connectSession(host,parent_port);
+	}
 	
 	/**
 	 * channel に SMCMD_SM_JOIN command を送る。
@@ -790,4 +794,5 @@
 		return sessionList.get(sid);
 	}
 
+
 }
--- a/rep/channel/ChannelSimulator.java	Mon Oct 20 03:03:28 2008 +0900
+++ b/rep/channel/ChannelSimulator.java	Mon Oct 20 13:44:34 2008 +0900
@@ -122,14 +122,22 @@
 
 
 	@SuppressWarnings("unchecked")
+	@Override
 	public SelectionKey keyFor(Selector selector2) {
 		return ((SelectorSimulator) selector2).getKey(this);
 	}
 
 	@SuppressWarnings("unchecked")
+	@Override
 	public SelectionKey keyFor(REPSelector<?> sel) {
 		return (SelectionKey)((SelectorSimulator) sel).getKey(this);
 	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public REPSelectionKey<P> keyFor1(REPSelector<P> sel) {
+		return (REPSelectionKey<P>)((SelectorSimulator) sel).getKey(this);
+	}
 	
 	@SuppressWarnings("unchecked")
 	@Override
@@ -175,5 +183,6 @@
 		otherEnd = (ChannelSimulator<P>) other;
 	}
 
-
+    public void close1() throws IOException {
+    }
 }
--- a/rep/channel/REPSocketChannel.java	Mon Oct 20 03:03:28 2008 +0900
+++ b/rep/channel/REPSocketChannel.java	Mon Oct 20 13:44:34 2008 +0900
@@ -177,4 +177,5 @@
 
 	}
 
+
 }
\ No newline at end of file
--- a/test/sematest/TestInterManagerSession.java	Mon Oct 20 03:03:28 2008 +0900
+++ b/test/sematest/TestInterManagerSession.java	Mon Oct 20 13:44:34 2008 +0900
@@ -56,7 +56,12 @@
 				}
 			},
 			new SessionManagerEvent() {
-				public void exec(SessionManager manager) {	
+				public void exec(SessionManager manager) {
+					// try to make a loop
+					if (false) {
+					sessionManagers[0].connectSession(host,
+							manager.getPort());
+					}
 					manager.connectSession(host);
 					for(TestEditor editor:editors) {
 						if(editor.getPort()==manager.getPort()) {
@@ -103,8 +108,8 @@
 		 * Define pending command and set null command for now.
 		 */
 		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.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_DELETE,0,0,0,0,"m0"));
 		editorStartCmds = cmds;