changeset 492:d2afd4efdd2d

remove unMergedCmds, use sentList instead.
author one
date Sat, 23 Oct 2010 16:15:14 +0900
parents 5945266c970d
children 24297c2d9422
files rep/REPCommand.java rep/handler/Editor.java
diffstat 2 files changed, 20 insertions(+), 47 deletions(-) [+]
line wrap: on
line diff
--- a/rep/REPCommand.java	Sat Oct 23 12:34:46 2010 +0900
+++ b/rep/REPCommand.java	Sat Oct 23 16:15:14 2010 +0900
@@ -11,6 +11,8 @@
 	public int lineno;
 
 	public  String string;
+	// if this command is an undo command, it has it's original
+	public REPCommand original;
 	
 	public REPCommand(REP cmd,int sid,int eid, int seq, int lineno, String string) {
 		this.cmd = cmd;
@@ -19,6 +21,7 @@
 		this.seq = seq;
 		this.lineno = lineno;
 		this.string = string;
+		this.original = null;
 	}
 	
 	public REPCommand(REPCommand cmd){
@@ -36,6 +39,7 @@
 		this.seq = seq;
 		this.lineno = lineno;
 		this.string = string;
+		this.original = null;
 	}
 	
 	public String toString(){
--- a/rep/handler/Editor.java	Sat Oct 23 12:34:46 2010 +0900
+++ b/rep/handler/Editor.java	Sat Oct 23 16:15:14 2010 +0900
@@ -26,7 +26,6 @@
 	private REPCommand preMergeCommand;
 
 	public REPCommandOptimizer optimizer;
-	private LinkedList<REPCommand> unMergedCmds;
 	private LinkedList<REPCommand> sentMergedList;
 	private TreeSet<REPCommand> sortedEditCmds;
 	boolean mergeAgain;
@@ -61,7 +60,6 @@
 		if (doOptimize) optimizer = new DeleteInsertOptimizer(); //タカノがつくったおぷてぃまいざ
 		else            optimizer = new NullOptimizer();         //なにもしないけどOptimizer.
 
-		unMergedCmds = new LinkedList<REPCommand>();
 		mergeAgain = false;
 		sentMergedList = new LinkedList<REPCommand>();
 	}
@@ -73,7 +71,6 @@
 	(1) Editor CommandをSession Ring 上に流し、それが戻って来るまでに、他のEditorから
 	    受け取った Editor Command をキューに入れておく。
 	        sentList              外に送り出したEditor Command
-	        unMergedList       接続されたEditorのundo list (reverse order)
 	        MergingSentList   Mergeするlist 。Mergeのやり直し用。
 	Slow/Early
 	(2) 戻って来たタイミングで、キュー上のEditor Commandを、eid とCommandの
@@ -395,12 +392,6 @@
 		if (mergeMode==MergeMode.Direct) {
 			REPCommand last = sentList.size()==0?null:sentList.getLast();
 			ServerMainLoop.logger.writeLog("Editor"+eid+": EndMerge Before"+report());
-			LinkedList<REPCommand> u = new LinkedList<REPCommand>();
-			for(REPCommand c: unMergedCmds) {
-				if (c.cmd==REP.REPCMD_MERGE_MARK) break;
-				u.addLast(c);
-			}
-			unMergedCmds = u;
 			if (last!=null && last.eid==eid && last.sid==sid)
 				truncateSentList(last,false);
 			sentList.remove(mergeMark);
@@ -430,17 +421,6 @@
 	 */
 	private void truncateSentList(REPCommand commit, boolean mode) {
 		if (merging) 	return;
-		LinkedList<REPCommand>u = new LinkedList<REPCommand>();
-		boolean flag=true;
-		for(REPCommand command:unMergedCmds) {
-			if (command.cmd==REP.REPCMD_MERGE_MARK) {
-				flag = mode;
-				continue;
-			}
-			if (command.eid!=eid && command.eid!=REP.MERGE_EID.id) 	break;
-			if (flag) u.addLast(command);
-		}		
-		unMergedCmds = u;
 		LinkedList<REPCommand>s = new LinkedList<REPCommand>();
 		for(REPCommand command:sentList) {
 			if (command.eid!=eid) {
@@ -459,13 +439,6 @@
 	 */
 	public void truncateUnMergedCmds(REPCommand commit) {
 		assert(!merging);
-		LinkedList<REPCommand>u = new LinkedList<REPCommand>();
-		for(REPCommand command:unMergedCmds) {
-			if (command.cmd==REP.REPCMD_MERGE_MARK) continue;
-			if (command.isSameSeq(commit)) 	break;
-			u.addLast(command);
-		}		
-		unMergedCmds = u;
 		boolean flag = false;
 		LinkedList<REPCommand>s = new LinkedList<REPCommand>();
 		for(REPCommand command:sentList) {
@@ -648,7 +621,6 @@
 	 */
 	public REPCommand transSendCmd(REPCommand cmd){
 		assert(cmd.eid==eid);
-		unMergedCmds.addFirst(cmd);
 		
 		//マージ中にユーザから割り込みがあった場合
 		if(isMerging()){
@@ -667,14 +639,14 @@
 	 * @param cmd
 	 */
 	public boolean merge(REPCommand prev){
-		logger.writeLog("beforeMerge"+eid+":"+unMergedCmds);
+		logger.writeLog("beforeMerge"+eid+":"+sentList);
 		LinkedList<REPCommand> output = new LinkedList<REPCommand>();
 		LinkedList<REPCommand> newSentList = new LinkedList<REPCommand>();
 		// merge queue上にあるコマンドを全部undoコマンドするのと同時に
 		// sort したコマンド列を生成する
-		for( REPCommand cmd0 : unMergedCmds) {
+		for( REPCommand cmd0 : sentList) {
 			if (cmd0.cmd==REP.REPCMD_INSERT || cmd0.cmd==REP.REPCMD_DELETE) 
-				output.addLast( createUndo(cmd0) );
+				output.addFirst( createUndo(cmd0) );
 		}
 
 		sortedEditCmds = new TreeSet<REPCommand>(new REPCommandComparator(1));
@@ -695,19 +667,18 @@
 		logger.writeLog("sortedMerge"+eid+":"+sentList);
 		// unMerged command のdeleteのundo string は、この時点で使えない。
 		// Editor 側から送り返して来たものを使う必要がある。
-		unMergedCmds.clear();
 		logger.writeLog("outputMerge"+eid+":"+output);
 		return optimizedSend(this,output);
 	}
 
 	public boolean mergeEarly(REPCommand prev){
-		logger.writeLog("beforeMerge"+eid+":"+unMergedCmds);
+		logger.writeLog("beforeMerge"+eid+":"+sentList);
 		LinkedList<REPCommand> output = new LinkedList<REPCommand>();
 		LinkedList<REPCommand> newSentList = new LinkedList<REPCommand>();
 		// merge queue上にあるコマンドを全部undoコマンドするのと同時に
 		// sort したコマンド列を生成する
-		for( REPCommand cmd0 : unMergedCmds) {
-			output.addLast( createUndo(cmd0) );
+		for( REPCommand cmd0 : sentList) {
+			output.addFirst( createUndo(cmd0) );
 		}
 
 		sortedEditCmds = new TreeSet<REPCommand>(new REPCommandComparator(1));
@@ -722,9 +693,8 @@
 		output.addAll(sortedEditCmds);
 		output.addLast(mergeMark);
 		logger.writeLog("sortedMerge"+eid+":"+sortedEditCmds);
-		// unMerged command のdeleteのundo string は、この時点で使えない。
+		// sentList の command.string は、
 		// Editor 側から送り返して来たものを使う必要がある。
-		unMergedCmds.clear();
 		sentList = newSentList;
 		logger.writeLog("outputMerge"+eid+":"+output);
 		return optimizedSend(this,output);
@@ -738,7 +708,7 @@
 	 */
 	public boolean optimizedSend(REPNode editor, LinkedList<REPCommand> output) {
 		/*
-		 * Optimized send の場合は、unMergedCommand のつじつまを合わせる必要がある。
+		 * Optimized send の場合は、command.original を意識する必要がある
 		 */
 		sentMergedList.clear();
 		List<REPCommand> output1 = optimizer.optimize(output);
@@ -750,6 +720,7 @@
 			REPCommand m = new REPCommand(c);
 			m.setEID(REP.MERGE_EID.id);
 			m.setSEQID(editor.seq());
+			m.original = c;
 			sentMergedList.addLast(m);
 			editor.sendToEditor(m);
 		}
@@ -759,6 +730,7 @@
 	
 	private REPCommand createUndo(REPCommand cmd){
 		REPCommand retCmd = new REPCommand(cmd);
+		retCmd.original = cmd;
 		if (cmd.cmd==REP.REPCMD_INSERT) {
 			retCmd.cmd=REP.REPCMD_DELETE;
 			retCmd.string="";
@@ -791,7 +763,6 @@
 	 */
 	public void transReceiveCmd(REPNode nextEditor,REPCommand cmd){
 		assert (cmd.eid != eid);
-		unMergedCmds.addFirst(new REPCommand(cmd));
 	}
 
 	public void setEid(int _eid){
@@ -799,12 +770,13 @@
 	}
 
 	public boolean checkMergeConflict(REPCommand command) {
-		unMergedCmds.addFirst(new REPCommand(command));
-		
 		REPCommand prev = sentMergedList.getFirst();
 		if (prev.seq==command.seq) {
 			// logger.writeLog("Input eid="+eid+"SentMergedList = "+sentMergedList);
 			sentMergedList.removeFirst();
+			if (prev.original!=null && command.string!=null && !command.string.equals("")) {
+				prev.original.string = command.string;
+			}
 		} 
 		//  previous merge command may be returned
 
@@ -824,14 +796,13 @@
 		}
 		
 		LinkedList<REPCommand> returnCommand = new LinkedList<REPCommand>();
-		for(REPCommand command : unMergedCmds) {
+		for(REPCommand command : sentList) {
 			if (command.cmd==REP.REPCMD_INSERT||command.cmd==REP.REPCMD_DELETE)
-				returnCommand.add(createUndo(command));
+				returnCommand.addFirst(createUndo(command));
 		}
 		returnCommand.addAll(sortedEditCmds);
 		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(this, returnCommand);
@@ -851,8 +822,7 @@
 	 *  receive SMCMD_START_MERGE_ACK
 	 */
 	public void mergeAck() {
-		logger.writeLog("Editor"+eid+": START MERGE "+
-				((unMergedCmds.size()>0)?" unMergedCmds = "+ unMergedCmds : ""));
+		logger.writeLog("Editor"+eid+": START MERGE "+ sentList);
 		// これ以降のUser command の割り込みはmergeのやり直しが必要
 		merging = true;
 	}
@@ -864,7 +834,6 @@
 		String s = "";
 		s += "\n  sentList:"+sentList;
 		s += "\n  ackList:"+ackList;
-		s += "\n  unMergedList:"+unMergedCmds;
 		s += "\n  mergeMode=:"+merging;
 		return s;
 	}