changeset 406:8009dd7b2013

command execution when commandInMergeQueue>0 duplicate JOIN_ACK
author one
date Tue, 25 Nov 2008 09:07:52 +0900
parents 0b1d52ffb803
children de4ef4313adc
files Todo rep/handler/Editor.java rep/handler/Forwarder.java test/Text.java test/sematest/TestEditor.java
diffstat 5 files changed, 35 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/Todo	Tue Nov 25 03:46:31 2008 +0900
+++ b/Todo	Tue Nov 25 09:07:52 2008 +0900
@@ -12,6 +12,9 @@
 Editor側で、自分が出したINSERT/DELETE commandは無視する必要がある。
 ついでに、Editor側でINSERT_ACK/DELETE_ACKに書き換える方が良いらしい。
 
+INSERT_ACK/DELETE_ACKが出ない場合があるらしい。と言うか、最初の
+一回しか出ていない。
+
 Wed Nov 19 19:21:47 JST 2008
 
 ACK base に書き換えるのは良いが、途中でjoinして
--- a/rep/handler/Editor.java	Tue Nov 25 03:46:31 2008 +0900
+++ b/rep/handler/Editor.java	Tue Nov 25 09:07:52 2008 +0900
@@ -18,7 +18,7 @@
 	private Translator translator;
 	// REPCommands we are going to send to the next editor
 	private List<REPCommand> sentList = new LinkedList<REPCommand>();
-	protected List<PacketSet> waitingCommandInMerge= new LinkedList<PacketSet>();
+	protected LinkedList<PacketSet> waitingCommandInMerge= new LinkedList<PacketSet>();
 	private REPCommand quit2=null;
 	private boolean merging;
 	private REPCommand preMergeCommand;
@@ -44,11 +44,13 @@
 		switch(command.cmd) {
 		case REPCMD_INSERT_ACK:
 		case REPCMD_DELETE_ACK:
+			if (waitingRequired(command)) return;
 			if (command.eid==eid) {
 				// Second Phase が終わって同期が終了。
+				removeFromSentList(command);
+				SessionManager.logger.writeLog("Complete "+command);
 				return;
 			}
-			if (waitingRequired(command)) return;
 			checkReturnedCommand(command);
 			return;
 		case REPCMD_INSERT_USER:
@@ -56,7 +58,7 @@
 			userEditorCommand(command);
 			return;
 		case REPCMD_DELETE_USER:
-			command.cmd = REP.REPCMD_INSERT;
+			command.cmd = REP.REPCMD_DELETE;
 			userEditorCommand(command);
 			return;
 		case REPCMD_INSERT:
@@ -169,12 +171,18 @@
 	 * @param command
 	 */
 	void checkReturnedCommand(REPCommand command) {
+		if (removeFromSentList(command))
+			startMerge(command);
+		return;
+	}
+
+	private boolean removeFromSentList(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;
+			return false;
 		}
 		REPCommand prev = sentList.remove(0);
 		// ServerMainLoop.logger.writeLog("Editor eid="+eid+" remove sentList:"+(prev==null?"null":prev));
@@ -186,10 +194,9 @@
 			assert(command.cmd==REP.REPCMD_DELETE_ACK||
 					command.cmd==REP.REPCMD_INSERT_ACK);
 			sentList.add(0,prev);
-			return;
+			return false;
 		}
-		startMerge(command);
-		return;
+		return true;
 	}
 
 	private void startMerge(REPCommand command) {
@@ -254,6 +261,7 @@
 			switch(keep.cmd) {
 			case REPCMD_INSERT: keep.cmd = REP.REPCMD_INSERT_ACK;break;
 			case REPCMD_DELETE: keep.cmd = REP.REPCMD_DELETE_ACK;break;
+			default: assert(false);
 			}
 			sentList.add(keep);
 			ServerMainLoop.logger.writeLog("Editor eid:"+eid+" sentList = "+sentList);
@@ -392,20 +400,22 @@
 	 * @throws IOException
 	 */
 	public void checkWaitingCommandInMerge() {
-		int count = waitingCommandInMerge.size();
-		if (count==0) return;
-		if (isMerging()) return;
-		while(count-->0) {
-			PacketSet p = waitingCommandInMerge.remove(0);
+		if (translator==null||isMerging()) return;
+		LinkedList<PacketSet> w = waitingCommandInMerge;
+		waitingCommandInMerge = new LinkedList<PacketSet>();
+		while(w.size()>0) {
+			if (isMerging()) {
+				w.addAll(waitingCommandInMerge);
+				waitingCommandInMerge = w;
+				return;
+			}
+			PacketSet p = w.remove(0);
 			try {
-				//					if (manager.sessionManage(e, p.command)) { // we don't need this
-				//						assert false;
-				//						return;
-				//					}
 				manage(p.command);
 			} catch (Exception e1) {
-				// should be e.close()?
+				assert false;
 				manager.close(p.channel);
+				return;
 			}
 		}
 	}
--- a/rep/handler/Forwarder.java	Tue Nov 25 03:46:31 2008 +0900
+++ b/rep/handler/Forwarder.java	Tue Nov 25 09:07:52 2008 +0900
@@ -111,6 +111,7 @@
 			// we have one more point to send JOIN_ACK to the editor.
 			session.addForwarder(this);
 			joinAck(sendCommand, session.getSID());
+			return;
 		} else {
 			// We have a session, but joined editor is on the other sm.
 			// SELECT_ACK is sent to the session ring to
--- a/test/Text.java	Tue Nov 25 03:46:31 2008 +0900
+++ b/test/Text.java	Tue Nov 25 09:07:52 2008 +0900
@@ -5,7 +5,6 @@
 import java.util.List;
 
 import rep.REPCommand;
-import rep.REP;
 
 public class Text extends LinkedList<String> {
 
--- a/test/sematest/TestEditor.java	Tue Nov 25 03:46:31 2008 +0900
+++ b/test/sematest/TestEditor.java	Tue Nov 25 09:07:52 2008 +0900
@@ -61,13 +61,14 @@
 			this.master=true;
 			text = new Text(txts);
 			cmds.add(new REPCommand(REP.SMCMD_PUT,0,0,0,0,name+"-file"));
-			cmds.add(new REPCommand(REP.REPCMD_INSERT_USER,0,0,0,0,"m0"));
-			cmds.add(new REPCommand(REP.REPCMD_DELETE_USER,0,0,0,0,"m0"));
+			//cmds.add(new REPCommand(REP.REPCMD_INSERT_USER,0,0,0,0,"m0"));
+			//cmds.add(new REPCommand(REP.REPCMD_DELETE_USER,0,0,0,0,"m0"));
 			//cmds.add(new REPCommand(REP.SMCMD_QUIT,0,0,0,0,""));
 		} else {
 			text = new Text(new String[0]);
 			cmds.add(new REPCommand(REP.SMCMD_JOIN,0,0,0,0,name));
 			cmds.add(new REPCommand(REP.REPCMD_INSERT_USER,0,0,0,0,"c0"));
+			
 			cmds.add(new REPCommand(REP.REPCMD_DELETE_USER,0,0,0,0,"c0"));
 		}
 	}
@@ -226,7 +227,7 @@
 
 	private void handle(REPCommand cmd) {
 		if (cmd==null) return;
-		ns.writeLog(name +"(eid="+eid+",sid="+sid+")"+": read "+cmd);
+		ns.writeLog(name +": read "+cmd);
 		switch(cmd.cmd) {
 		case REPCMD_INSERT	:
 			if (cmd.eid!=eid) {