changeset 483:c792a1ebc0ff

new merge (again...)
author one
date Sat, 16 Oct 2010 20:48:38 +0900
parents 200166a494e9
children 7420dea70dd7
files rep/handler/Editor.java
diffstat 1 files changed, 50 insertions(+), 34 deletions(-) [+]
line wrap: on
line diff
--- a/rep/handler/Editor.java	Sat Oct 16 20:24:11 2010 +0900
+++ b/rep/handler/Editor.java	Sat Oct 16 20:48:38 2010 +0900
@@ -152,7 +152,7 @@
 				//マージコマンドが返ってきた
 				if(checkMergeConflict(command)){
 					//マージ中にエディタからの割り込みがあった場合
-					getMergeAgain(this);
+					getMergeAgain();
 				}
 				checkEndMerge();
 				return;
@@ -170,8 +170,10 @@
 
 			//他のエディタからの編集コマンド
 			transReceiveCmd(next,command);
-
-			sendEditorCommand(command);
+			if (mergeMode==MergeMode.Direct) 
+				startMerge(command);
+			else
+				sendEditorCommand(command);
 			return;
 		default:
 			assert(false);
@@ -180,6 +182,8 @@
 
 	private void userEditorCommand(REPCommand command) {
 		//エディタからの新たな編集コマンド
+		if (mergeMode==MergeMode.Direct)
+			truncateSentList(command);
 		if (next==this) return; // singleton case
 		transSendCmd(command);
 		sendEditorCommand(command);
@@ -209,6 +213,13 @@
 //	}
 
 	/**
+	 * truncate sentList and unMergedCmds
+	 */
+	private void truncateSentList(REPCommand command) {
+		
+	}
+
+	/**
 	 * Sending to Editor and waiting Queue
 	 *                                  +--------+
 	 *      send() --> write() -> | Editor | -> handle() -> manager()
@@ -277,14 +288,6 @@
 		next.send(command);
 	}
 
-	public  List<REPCommand> getSentList() {
-		return sentList;
-	}
-	
-	public void setSentList(LinkedList<REPCommand> list) { 
-		sentList = list;
-	}
-
 	/**
 	 * 一周して来たcommandの処理。
 	 * 
@@ -298,6 +301,11 @@
 	 * @param command
 	 */
 	void checkReturnedCommand(REPCommand command) {
+		if (mergeMode!=MergeMode.Direct)
+			startMerge(command);
+	}
+
+	void startMerge(REPCommand command) {
 		ServerMainLoop.logger.writeLog("Editor"+eid+": startMerge "+command);
 		preMergeCommand = new REPCommand(command);
 		// merge は必須だが、EditorのCommand実装をテストするには邪魔なので、off に出来るようにする。
@@ -315,7 +323,7 @@
 		// 入力を止めて、merge にそなえる。merge は、eidtor 側から
 		// ACKが来てから始まる。
 	}
-	
+
 	/**
 	 * sentList と ack を見比べて、正しい順序で来たかどうかを調べる。途中参加したEditorの場合は、Ackは
 	 * 無視して良い。
@@ -368,19 +376,15 @@
 
 
 	private void endMerge() {
-		sortedEditCmds = null;
-		LinkedList<REPCommand>u = new LinkedList<REPCommand>();
-		boolean flag=true;
-		for(REPCommand command:unMergedCmds) {
-			if (command.cmd==REP.REPCMD_MERGE_MARK) {
-				flag = false;
-			}
-			if (flag) u.addLast(command);
-		}
-		unMergedCmds = u;
-
 		REPCommand mergeEnd = new REPCommand(REP.SMCMD_END_MERGE,sid,eid,seq(),0,"");
 		sendToEditor(mergeEnd);
+		if (mergeMode==MergeMode.Direct) {
+			sendEditorCommand(preMergeCommand);
+			preMergeCommand = null;
+			return ;
+		}
+		sortedEditCmds = null;
+		truncateUnMergedCmds();
 		checkAck(preMergeCommand);
 		if (preMergeCommand.eid==eid) {
 			if (mergeMode==MergeMode.Early) {
@@ -394,6 +398,18 @@
 		preMergeCommand = null;
 	}
 
+	public void truncateUnMergedCmds() {
+		LinkedList<REPCommand>u = new LinkedList<REPCommand>();
+		boolean flag=true;
+		for(REPCommand command:unMergedCmds) {
+			if (command.cmd==REP.REPCMD_MERGE_MARK) {
+				flag = false;
+			}
+			if (flag) u.addLast(command);
+		}
+		unMergedCmds = u;
+	}
+
 	private void sendAck(REPCommand command) {
 		REPCommand keep = new REPCommand(command);
 		// First Phase End, send ACK
@@ -441,7 +457,7 @@
 		{
 			// マージの処理と次のエディタへコマンドを送信する処理
 			mergeAck();
-			if (!merge(this, preMergeCommand)) {
+			if (!merge(preMergeCommand)) {
 				// nothing to do, send END_MERGE
 				checkEndMerge();
 			}
@@ -570,7 +586,7 @@
 	 * Start merge process.
 	 * @param cmd
 	 */
-	public boolean merge(Editor editor, REPCommand prev){
+	public boolean merge(REPCommand prev){
 		logger.writeLog("beforeMerge"+eid+":"+unMergedCmds);
 		LinkedList<REPCommand> output = new LinkedList<REPCommand>();
 		LinkedList<REPCommand> newSentList = new LinkedList<REPCommand>();
@@ -581,21 +597,21 @@
 		}
 
 		sortedEditCmds = new TreeSet<REPCommand>(new REPCommandComparator(1));
-		logger.writeLog("sentList"+eid+":"+editor.getSentList());
-		for( REPCommand cmd0 : editor.getSentList()) {
+		logger.writeLog("sentList"+eid+":"+sentList);
+		for( REPCommand cmd0 : sentList ) {
 			if (cmd0.cmd==REP.REPCMD_INSERT || cmd0.cmd==REP.REPCMD_DELETE) {
 					sortedEditCmds.add(cmd0);
 			}
 		}
 		output.addAll(sortedEditCmds);
-		output.addLast(new REPCommand(REP.REPCMD_MERGE_MARK,0, editor.getSID(), REP.MERGE_EID.id, editor.seq(), ""));
+		output.addLast(new REPCommand(REP.REPCMD_MERGE_MARK,0,sid, REP.MERGE_EID.id, seq(), ""));
 		logger.writeLog("sortedMerge"+eid+":"+sortedEditCmds);
 		// unMerged command のdeleteのundo string は、この時点で使えない。
 		// Editor 側から送り返して来たものを使う必要がある。
 		unMergedCmds.clear();
+		sentList = newSentList;
 		logger.writeLog("outputMerge"+eid+":"+output);
-		editor.setSentList(newSentList);
-		return optimizedSend(editor,output);
+		return optimizedSend(this,output);
 	}
 
 	/**
@@ -683,7 +699,7 @@
 		return mergeAgain;
 	}
 
-	public void getMergeAgain(Editor editor) {
+	public void getMergeAgain() {
 		if (sentMergedList.size()>0) return; //  wait for previous merge completion
 		
 		LinkedList<REPCommand> returnCommand = new LinkedList<REPCommand>();
@@ -692,12 +708,12 @@
 				returnCommand.add(createUndo(command));
 		}
 		returnCommand.addAll(sortedEditCmds);
-		returnCommand.addLast(new REPCommand(REP.REPCMD_MERGE_MARK,0, editor.getSID(), REP.MERGE_EID.id, editor.seq(), ""));
-		returnCommand.addAll(editor.getSentList());
+		returnCommand.addLast(new REPCommand(REP.REPCMD_MERGE_MARK,0, sid, REP.MERGE_EID.id, seq(), ""));
+		returnCommand.addAll(sentList);
 		unMergedCmds.clear();
 		logger.writeLog("MergeAgain "+eid+" ret="+returnCommand.size());
 		mergeAgain = false;
-		optimizedSend(editor, returnCommand);
+		optimizedSend(this, returnCommand);
 	}
 //
 //	public boolean isFinished() {