changeset 442:3819dec4641e

command waiting during merge
author one
date Sun, 12 Sep 2010 22:23:53 +0900
parents 15888d516f10
children bd086be276d2
files Todo rep/ServerMainLoop.java rep/handler/Editor.java rep/handler/Translator.java test/sematest/TestEditor.java
diffstat 5 files changed, 40 insertions(+), 44 deletions(-) [+]
line wrap: on
line diff
--- a/Todo	Sun Sep 12 15:11:46 2010 +0900
+++ b/Todo	Sun Sep 12 22:23:53 2010 +0900
@@ -7,6 +7,11 @@
 mergeAgain した時に、前のmerge command がeditorから返されることがあって、
 それは、全部、読む必要がある。
 
+Merge 中のcommandがblockされてない。
+
+next.send(command) すると、直接、次のeditorに送られてしまうので、
+merge 中に止められない。
+
 Sat Jan 16 18:06:37 JST 2010
 
 sentList 全部削除だと quit2 が早めに出されてしまうので、
--- a/rep/ServerMainLoop.java	Sun Sep 12 15:11:46 2010 +0900
+++ b/rep/ServerMainLoop.java	Sun Sep 12 22:23:53 2010 +0900
@@ -113,7 +113,7 @@
 	private boolean checkWaitingWrite() throws IOException {
 		PacketSet p = writeQueue.poll();
 		if (p!=null) {
-			sendLog(p);
+			// sendLog(p);
 			p.channel.write(p.command);
 			return true;
 		}
@@ -124,6 +124,7 @@
 	 * Debug message
 	 * @param p
 	 */
+	@SuppressWarnings("unused")
 	private void sendLog(PacketSet p) {
 		REPNode to;
 		String s;
--- a/rep/handler/Editor.java	Sun Sep 12 15:11:46 2010 +0900
+++ b/rep/handler/Editor.java	Sun Sep 12 22:23:53 2010 +0900
@@ -20,8 +20,8 @@
 	private LinkedList<REPCommand> sentList = new LinkedList<REPCommand>();
 	protected LinkedList<PacketSet> waitingCommandInMerge= new LinkedList<PacketSet>();
 	private REPCommand quit2=null;
+	private REPCommand preMergeCommand;
 	private boolean merging;
-	private REPCommand preMergeCommand;
 	public static boolean noMergeMode=false;
 	static final boolean doOptimize = true;
 
@@ -82,11 +82,11 @@
 		switch(command.cmd) {
 		case REPCMD_INSERT_ACK:
 		case REPCMD_DELETE_ACK:
-			if (waitingRequired(command)) return;
+			// if (waitingRequired(command)) return;
 			if (command.eid==eid) {
 				// Second Phase が終わって同期が終了。
 				checkAck(command);
-				SessionManager.logger.writeLog("Complete "+command);
+				// SessionManager.logger.writeLog("Complete "+command);
 				checkQuit();
 				return;
 			}
@@ -112,13 +112,13 @@
 				return;
 			} else if (command.eid == eid){ 
 				// 編集コマンドが一周して来た
-				if (waitingRequired(command)) return;
+				// if (waitingRequired(command)) return;
 				checkReturnedCommand(command);
 				return;
 			}
 
 			//他のエディタからの編集コマンド
-			if (waitingRequired(command)) return;
+			// if (waitingRequired(command)) return;
 			translator.transReceiveCmd(next,command);
 
 			sendEditorCommand(command);
@@ -171,13 +171,13 @@
 		return false;
 	}
 
-	public void addWaitingCommand(PacketSet set) {
-		if (preMergeCommand!=null) {
-			if (preMergeCommand.eid==set.command.eid
-					&& preMergeCommand.seq==set.command.seq) {
-				assert(false);
-			}
-		}
+    public void addWaitingCommand(PacketSet set) {
+//		if (preMergeCommand!=null) {
+//			if (preMergeCommand.eid==set.command.eid
+//					&& preMergeCommand.seq==set.command.seq) {
+//				assert(false);
+//			}
+//		}
 		waitingCommandInMerge.add(set);
 	}
 
@@ -228,23 +228,13 @@
 
 	private boolean checkAck(REPCommand command) {
 		assert(!merging);
-//		if (sentList.size()==0) {
-//			ServerMainLoop.logger.writeLog("Editor eid="+eid+" looped command not registered: "+command);
-//			assert(command.cmd==REP.REPCMD_DELETE_ACK||
-//					command.cmd==REP.REPCMD_INSERT_ACK);
-//			return false;
-//		}
 		REPCommand prev = sentList.pollFirst();
-//		// ServerMainLoop.logger.writeLog("Editor eid="+eid+" remove sentList:"+(prev==null?"null":prev));
 		if (prev==null || prev.seq != command.seq || prev.eid!=command.eid) {
 			String err = "Editor eid="+eid+" checkReturnedCommand() : command = " + command + " prev="+
 				(prev==null?"null":prev)+" sentList=";
 			err += sentList;
 			ServerMainLoop.logger.writeLog(err);
 			assert(false);
-//			assert(command.cmd==REP.REPCMD_DELETE_ACK||
-//					command.cmd==REP.REPCMD_INSERT_ACK);
-//			return false;
 		}
 		return true;
 	}
@@ -292,7 +282,6 @@
 		return translator.isMerging();
 	}
 
-	
 
 	void checkEndMerge() {
 		if (merging) {
@@ -303,6 +292,7 @@
 		if (quit2!=null) checkQuit();
 	}
 
+
 	private void endMerge() {
 		REPCommand mergeEnd = new REPCommand(REP.SMCMD_END_MERGE,sid,eid,seq(),0,"");
 		send(mergeEnd);
@@ -405,9 +395,18 @@
 	
 
 	@Override
+	public void send(REPCommand command) {
+		if (command.eid == REP.MERGE_EID.id || 
+				command.cmd==REP.SMCMD_END_MERGE ||
+				!waitingRequired(command)) {
+			super.send(command);
+		}
+	}
+	
+	@Override
 	public void handle(REPCommand command, REPSelectionKey<REPCommand> key) throws IOException {
-		ServerMainLoop.logger.writeLog("Manager "+manager.getId()+" read : command = " + command 
-				+" from "+manager.editorList.editorByChannel(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	Sun Sep 12 15:11:46 2010 +0900
+++ b/rep/handler/Translator.java	Sun Sep 12 22:23:53 2010 +0900
@@ -55,7 +55,7 @@
 	 * @param cmd
 	 */
 	public boolean catchOwnCommand(REPNode editor, REPCommand prev){
-		logger.writeLog("beforeMerge:"+unMergedCmds);
+		logger.writeLog("beforeMerge"+eid+":"+unMergedCmds);
 		LinkedList<REPCommand> output = new LinkedList<REPCommand>();
 		// merge queue上にあるコマンドを全部undoコマンドするのと同時に
 		// sort したコマンド列を生成する
@@ -68,14 +68,15 @@
 			if (cmd0.cmd==REP.REPCMD_INSERT || cmd0.cmd==REP.REPCMD_DELETE)
 				cmds.add(cmd0);
 		}
-		logger.writeLog("Ediotr"+eid+" Merge:: sorted sent list => Eid="+eid+cmds+" ack="+prev);
+		logger.writeLog("sortedMerge"+eid+":"+cmds);
+		// logger.writeLog("Ediotr"+eid+" Merge:: sorted sent list => Eid="+eid+cmds+" ack="+prev);
 		output.addAll(cmds);
 		// ACKが来たものは必ず先頭
 		
 		// unMerged command のdeleteのundo string は、この時点で使えない。
 		// Editor 側から送り返して来たものを使う必要がある。
 		unMergedCmds.clear();
-		logger.writeLog("outputMerge:"+output);
+		logger.writeLog("outputMerge"+eid+":"+output);
 		return optimizedSend(editor,output);
 	}
 
@@ -99,7 +100,7 @@
 			sentMergedList.addLast(m);
 			editor.send(m);
 		}
-		logger.writeLog("Output eid="+eid+"SentMergedList = "+sentMergedList);
+		logger.writeLog("OptimizedOutputMerge"+eid+":"+sentMergedList);
 		merge_mode = true;
 		return true;
 	}
@@ -147,11 +148,10 @@
 		
 		REPCommand prev = sentMergedList.getFirst();
 		if (prev.seq==command.seq) {
-			logger.writeLog("Input eid="+eid+"SentMergedList = "+sentMergedList);
+			// logger.writeLog("Input eid="+eid+"SentMergedList = "+sentMergedList);
 			sentMergedList.removeFirst();
-		} else {
-			//  previous merge command may be returned
-		}
+		} 
+		//  previous merge command may be returned
 
 		if(sentMergedList.size()==0 && !mergeAgain) {
 			merge_mode=false;
@@ -182,16 +182,7 @@
 		unMergedCmds.clear();
 		returnCommand.addAll(merge);
 		returnCommand.addAll(conflict);
-//		int count = 0;
-//		for(REPCommand command: returnCommand) {
-//			switch(command.cmd) {
-//			case REPCMD_INSERT: count++; break;
-//			case REPCMD_DELETE: count--; break;
-//			default: assert false;
-//			}
-//		}
 		logger.writeLog("MergeAgain "+eid+" ret="+returnCommand.size());
-//				+" increment="+count);
 		mergeAgain = false;
 		optimizedSend(editor, returnCommand);
 	}
--- a/test/sematest/TestEditor.java	Sun Sep 12 15:11:46 2010 +0900
+++ b/test/sematest/TestEditor.java	Sun Sep 12 22:23:53 2010 +0900
@@ -225,7 +225,7 @@
 
 	private void forwardCommand(REPCommand cmd1) {
 		REPCommand cmd = new REPCommand(cmd1);
-		ns.writeLog(name +" forward "+cmd);
+		// ns.writeLog(name +" forward "+cmd);
 		channel.write(cmd);
 	}