changeset 391:3b0a5a55e3ee

24
author one@firefly.cr.ie.u-ryukyu.ac.jp
date Mon, 10 Nov 2008 22:25:14 +0900
parents aa07134fea32
children 85d01cb6d133
files rep/EditorList.java rep/ServerMainLoop.java rep/SessionManager.java rep/handler/Editor.java rep/handler/Translator.java test/AutoSelectManager.java
diffstat 6 files changed, 70 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/rep/EditorList.java	Mon Nov 10 22:24:34 2008 +0900
+++ b/rep/EditorList.java	Mon Nov 10 22:25:14 2008 +0900
@@ -2,6 +2,7 @@
 
 import java.util.HashMap;
 
+import rep.channel.REPSocketChannel;
 import rep.handler.REPNode;
 
 public class EditorList extends HashMap<Integer,REPNode> {
@@ -27,5 +28,11 @@
 		return containsKey(eid);
 	}
 
-
+	public REPNode editorByChannel(REPSocketChannel<REPCommand>channel) {
+		for(REPNode e:this.values()) {
+			if (e.channel==channel)
+				return e;
+		}
+		return null;
+	}
 }
--- a/rep/ServerMainLoop.java	Mon Nov 10 22:24:34 2008 +0900
+++ b/rep/ServerMainLoop.java	Mon Nov 10 22:25:14 2008 +0900
@@ -77,7 +77,7 @@
 		try {
 			ssc.socket().bind(new InetSocketAddress("::",receive_port));
 		} catch (SocketException e) {
-			// for some IPv6 imlementation
+			// for some IPv6 implementation
 			ssc.socket().bind(new InetSocketAddress(receive_port));
 		}
 		ssc.register(selector, SelectionKey.OP_ACCEPT,null); 
@@ -95,6 +95,8 @@
 	private boolean checkWaitingWrite() throws IOException {
 		PacketSet p = writeQueue.poll();
 		if (p!=null) {
+			logger.writeLog("writing: "+p.command+" to: "
+					+manager.editorList.editorByChannel(p.channel));
 			p.channel.write(p.command);
 			return true;
 		}
--- a/rep/SessionManager.java	Mon Nov 10 22:24:34 2008 +0900
+++ b/rep/SessionManager.java	Mon Nov 10 22:25:14 2008 +0900
@@ -23,6 +23,7 @@
 import rep.handler.Forwarder;
 import rep.xml.SessionXMLDecoder;
 import rep.xml.SessionXMLEncoder;
+import test.sematest.TestGUI;
 
 /*
 	+-------+--------+--------+-------+--------+---------+------+
@@ -49,7 +50,7 @@
 	SessionManagerList smList = new SessionManagerList();
 	// Known Editor list. Connected Editor has a channel. 
 	// Session Manager Channel may have dummy editors.
-	EditorList editorList = new EditorList();
+	public EditorList editorList = new EditorList();
 	// Queue limit for debugging purpose.
 	static final int packetLimit = 400;
 
@@ -603,4 +604,8 @@
 		smList.addWaitingSessionManager(fw, command);
 	}
 
+	public int getId() {
+		return smList.sessionManagerID();
+	}
+
 }
--- a/rep/handler/Editor.java	Mon Nov 10 22:24:34 2008 +0900
+++ b/rep/handler/Editor.java	Mon Nov 10 22:25:14 2008 +0900
@@ -20,6 +20,7 @@
 	private List<REPCommand> sentList = new LinkedList<REPCommand>();
 	private REPCommand quit2=null;
 	private boolean merging;
+	public static boolean noMergeMode=false;
 	static final boolean doOptimize = true;
 
 	public Editor(SessionManager manager,int editorNo){
@@ -38,8 +39,7 @@
 	
 
 	public void translate(REPCommand command){
-
-		if(command.eid == eid){
+		if (command.eid == eid){
 			//エディタからの新たな編集コマンド
 			if (next==this) return; // singleton case
 			translator.transSendCmd(command);
@@ -47,16 +47,16 @@
 			assert(sentList.size()<limit);
 			next.send(command);
 			return;
-		} else if(command.eid == REP.MERGE_EID.id){
+		} else if (command.eid == REP.MERGE_EID.id){
 			//マージコマンドが返ってきた
 			if(translator.checkMergeConflict(command)){
 				//マージ中にエディタからの割り込みがあった場合
 				translator.getMergeAgain(this);
 			}
 			checkEndMerge();
-		} else if(command.eid == next.getEID()){
+		} else if (command.eid == next.getEID()){
 			// 次のEditorで一周するコマンドが来た
-			if(next==this) return; // singleton case
+			if (next==this) return; // singleton case
 			// これは、distributed case では、うまくいかないので、送り先のforwarder で処理する。
 			if (next.isDirect())
 				((Editor) next).checkReturnedCommand(command);
@@ -64,17 +64,15 @@
 				next.send(command);
 		} else {
 			//他のエディタからの編集コマンド
-			assert (command.eid!=REP.MERGE_EID.id && command.eid!=eid );
 			if (manager.hasWaitingCommand(channel)) {
 				// We cannot do this operation before watingCommandQueue.
 				manager.addWaitingCommand(new PacketSet(channel, this, command));
 				return;
-			}		
-			if(!isMerging()) {
+			} else if (isMerging()) { 
+				manager.addWaitingCommand(new PacketSet(getChannel(), this, new REPCommand(command)));
+			} else {
 				translator.transReceiveCmd(next,command);
-				return;
 			}
-			manager.addWaitingCommand(new PacketSet(getChannel(), this, new REPCommand(command)));
 		}
 		return;
 	}
@@ -84,6 +82,10 @@
 		return translator.catchOwnCommand(this);
 	}
 
+	/**
+	 * 一周して来たcommandの処理。
+	 * @param command
+	 */
 	void checkReturnedCommand(REPCommand command) {
 		REPCommand prev = sentList.remove(0);
 		if (prev==null || prev.seq != command.seq || prev.eid!=command.eid) {
@@ -93,6 +95,13 @@
 			assert(false);
 		}
 
+		// merge は必須だが、EditorのCommand実装をテストするには邪魔なので、off に出来るようにする。
+		if (noMergeMode) {
+			// END_MERGE を出さないと、EditorがprevSeqをreset出来ない。
+			REPCommand ack = new REPCommand(REP.SMCMD_END_MERGE,command.sid,REP.SM_EID.id,seq(),0,"");
+			send(ack);
+			return;
+		}
 		// START_MERGE を送る
 		//    送らないで良い場合もある?
 		REPCommand cmd = new REPCommand(REP.SMCMD_START_MERGE,command.sid,REP.SM_EID.id,seq(),0,"");
@@ -217,7 +226,8 @@
 
 	@Override
 	public void handle(REPCommand command, REPSelectionKey<REPCommand> key) throws IOException {
-		ServerMainLoop.logger.writeLog("REPHandlerImpl.handle() read : command = " + command +" from "+channel);
+		ServerMainLoop.logger.writeLog("Manager "+manager.getId()+"read : command = " + command 
+				+" from "+manager.editorList.editorByChannel(channel));
 		if (command.cmd==REP.SMCMD_JOIN||command.cmd==REP.SMCMD_PUT) {
 			assert false;
 			// 若干問題があるらしい
--- a/rep/handler/Translator.java	Mon Nov 10 22:24:34 2008 +0900
+++ b/rep/handler/Translator.java	Mon Nov 10 22:25:14 2008 +0900
@@ -66,10 +66,7 @@
 
 		/* 残ったコマンドも再び実行させるが、まだマージされてないのでunMergedにも入れる  */
 		output.addAll(cmds);
-		for(REPCommand c: cmds) {
-			output.add(c);
-			unMergedCmds.add(c);
-		}
+		unMergedCmds.addAll(cmds);
 		return optimizedSend(editor,output);
 	}
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/AutoSelectManager.java	Mon Nov 10 22:25:14 2008 +0900
@@ -0,0 +1,31 @@
+package test;
+
+import java.io.IOException;
+
+import rep.ServerMainLoop;
+import rep.SessionManager;
+import rep.handler.Editor;
+import test.sematest.TestGUI;
+
+public class AutoSelectManager extends SessionManager {
+
+	public static void main(String[] args) throws InterruptedException, IOException {
+		int port =ServerMainLoop.DEFAULT_PORT;
+		int port_s = ServerMainLoop.DEFAULT_PORT;
+		//System.setProperty("file.encoding", "UTF-8");
+		if(args.length > 0){
+			if (args.length!=2) {
+				logger.writeLog("Usage: sessionManager our_port parent_port");
+				return;
+			}
+			port = Integer.parseInt(args[0]);
+			port_s = Integer.parseInt(args[1]);
+		}
+		Editor.noMergeMode = true;
+		SessionManager sm = new SessionManager();
+		sm.setReceivePort(port);
+		sm.setParentPort(port_s);
+		// Ok start main loop
+		sm.init(port,new TestGUI(sm));
+	}
+}