changeset 465:c83af820eb62

merge mark
author one
date Sat, 02 Oct 2010 08:32:26 +0900
parents 295c257ac073
children b13926e43c28
files Todo rep/REP.java rep/handler/Editor.java rep/handler/Forwarder.java rep/handler/REPNode.java rep/handler/Translator.java test/mergertest/EditorSimulatorImpl.java test/mergertest/TestMerger.java test/sematest/TestEditor.java
diffstat 9 files changed, 57 insertions(+), 67 deletions(-) [+]
line wrap: on
line diff
--- a/Todo	Fri Oct 01 18:48:40 2010 +0900
+++ b/Todo	Sat Oct 02 08:32:26 2010 +0900
@@ -7,6 +7,10 @@
 自分のinsert commandを落してしまうらしい。ack のcheckと、editor list
 をわけるべきなのか?
 
+わけました。
+
+sort は、確定したところまででないとだめ。
+
 Tue Sep 28 10:43:14 JST 2010
 
 廻る順序でコマンド順は確定する。
--- a/rep/REP.java	Fri Oct 01 18:48:40 2010 +0900
+++ b/rep/REP.java	Sat Oct 02 08:32:26 2010 +0900
@@ -9,6 +9,7 @@
 	 REPCMD_DELETE_ACK	( 10),
 	 REPCMD_CLOSE	( 11),
 	 REPCMD_CLOSE_2	( 12),
+	 REPCMD_MERGE_MARK(13),
 	 REPCMD_NOP		( 15),
 	 SMCMD_JOIN		( 41),
 	 SMCMD_JOIN_ACK	( 42),
--- a/rep/handler/Editor.java	Fri Oct 01 18:48:40 2010 +0900
+++ b/rep/handler/Editor.java	Sat Oct 02 08:32:26 2010 +0900
@@ -111,6 +111,7 @@
 			return;
 		case REPCMD_INSERT:
 		case REPCMD_DELETE:
+		case REPCMD_MERGE_MARK:
 			if (command.eid == REP.MERGE_EID.id){
 				//マージコマンドが返ってきた
 				if(translator.checkMergeConflict(command)){
@@ -240,15 +241,13 @@
 		next.send(command);
 	}
 
-	boolean merge(REPCommand command) {
-		//マージして送信
-		return translator.catchOwnCommand(this, command);
-	}
-
-	@Override
 	public  List<REPCommand> getSentList() {
 		return sentList;
 	}
+	
+	public void setSentList(LinkedList<REPCommand> list) { 
+		sentList = list;
+	}
 
 	/**
 	 * 一周して来たcommandの処理。
@@ -350,7 +349,7 @@
 		} else {
 			next.send(preMergeCommand);
 		}
-		sentList.clear();
+		// sentList.clear();
 		preMergeCommand = null;
 	}
 
@@ -391,6 +390,7 @@
 		case REPCMD_INSERT_USER:
 		case REPCMD_DELETE_ACK:
 		case REPCMD_INSERT_ACK:
+		case REPCMD_MERGE_MARK:
 		{
 			translate(command);
 			break;
@@ -400,7 +400,7 @@
 		{
 			// マージの処理と次のエディタへコマンドを送信する処理
 			translator.mergeAck();
-			if (!merge(preMergeCommand)) {
+			if (!translator.merge(this, preMergeCommand)) {
 				// nothing to do, send END_MERGE
 				checkEndMerge();
 			}
--- a/rep/handler/Forwarder.java	Fri Oct 01 18:48:40 2010 +0900
+++ b/rep/handler/Forwarder.java	Sat Oct 02 08:32:26 2010 +0900
@@ -1,6 +1,7 @@
 package rep.handler;
 
 import java.io.IOException;
+import java.util.LinkedList;
 import java.util.List;
 
 import rep.PacketSet;
@@ -146,10 +147,6 @@
 		
 	}
 
-	@Override
-	public List<REPCommand> getSentList() {
-		return null;
-	}
 
 	@Override
 	public void write(REPCommand command) {
--- a/rep/handler/REPNode.java	Fri Oct 01 18:48:40 2010 +0900
+++ b/rep/handler/REPNode.java	Sat Oct 02 08:32:26 2010 +0900
@@ -1,6 +1,7 @@
 package rep.handler;
 
 import java.io.IOException;
+import java.util.LinkedList;
 import java.util.List;
 
 import rep.REP;
@@ -167,13 +168,10 @@
 
 	public abstract void checkWaitingCommandInMerge();
 
-	public abstract List<REPCommand> getSentList() ;
-
 	public void sendToEditor(REPCommand m) {
 		send(m);		
 	}
 
-		
 	
 	
 }
--- a/rep/handler/Translator.java	Fri Oct 01 18:48:40 2010 +0900
+++ b/rep/handler/Translator.java	Sat Oct 02 08:32:26 2010 +0900
@@ -55,30 +55,40 @@
 	 * Start merge process.
 	 * @param cmd
 	 */
-	public boolean catchOwnCommand(REPNode editor, REPCommand prev){
+	public boolean merge(Editor editor, REPCommand prev){
 		logger.writeLog("beforeMerge"+eid+":"+unMergedCmds);
 		LinkedList<REPCommand> output = new LinkedList<REPCommand>();
+		LinkedList<REPCommand> newSentList = new LinkedList<REPCommand>();
 		// merge queue上にあるコマンドを全部undoコマンドするのと同時に
 		// sort したコマンド列を生成する
 		for( REPCommand cmd0 : unMergedCmds) {
-			output.add( createUndo(cmd0) );
+			output.addLast( createUndo(cmd0) );
 		}
 
 		sortedEditCmds = new TreeSet<REPCommand>(new REPCommandComparator(1));
 		logger.writeLog("sentList"+eid+":"+editor.getSentList());
+		boolean flag = false;
 		for( REPCommand cmd0 : editor.getSentList()) {
-			if (cmd0.cmd==REP.REPCMD_INSERT || cmd0.cmd==REP.REPCMD_DELETE)
-				sortedEditCmds.add(cmd0);
+			if (cmd0.cmd==REP.REPCMD_INSERT || cmd0.cmd==REP.REPCMD_DELETE) {
+				if (flag) {
+					output.addLast(cmd0);
+					newSentList.addLast(cmd0);
+				} else {
+					sortedEditCmds.add(cmd0);
+				}
+			}
+			if (cmd0.sid==prev.sid && cmd0.eid==prev.eid && cmd0.seq==prev.seq) { 
+				flag = true;
+				output.addAll(sortedEditCmds);
+				output.addLast(new REPCommand(REP.REPCMD_MERGE_MARK,0, editor.getSID(), REP.MERGE_EID.id, editor.seq(), ""));
+			}
 		}
 		logger.writeLog("sortedMerge"+eid+":"+sortedEditCmds);
-		// logger.writeLog("Ediotr"+eid+" Merge:: sorted sent list => Eid="+eid+cmds+" ack="+prev);
-		output.addAll(sortedEditCmds);
-		// ACKが来たものは必ず先頭
-		
 		// unMerged command のdeleteのundo string は、この時点で使えない。
 		// Editor 側から送り返して来たものを使う必要がある。
 		unMergedCmds.clear();
 		logger.writeLog("outputMerge"+eid+":"+output);
+		editor.setSentList(newSentList);
 		return optimizedSend(editor,output);
 	}
 
@@ -87,7 +97,15 @@
 	 */
 	public void endMerge() {
 		sortedEditCmds = null;
-		unMergedCmds = new LinkedList<REPCommand>();
+		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;
 	}
 	/**
 	 * Sent optimized merged command list
@@ -174,30 +192,18 @@
 		return mergeAgain;
 	}
 
-	public void getMergeAgain(REPNode editor) {
+	public void getMergeAgain(Editor editor) {
 		if (sentMergedList.size()>0) return; //  wait for previous merge completion
 		
 		LinkedList<REPCommand> returnCommand = new LinkedList<REPCommand>();
-		LinkedList<REPCommand> merge = new LinkedList<REPCommand>();
-		LinkedList<REPCommand> conflict = new LinkedList<REPCommand>();
 		for(REPCommand command : unMergedCmds) {
-			returnCommand.add(createUndo(command));
+			if (command.cmd==REP.REPCMD_INSERT||command.cmd==REP.REPCMD_DELETE)
+				returnCommand.add(createUndo(command));
 		}
-		for(REPCommand command : unMergedCmds) {
-			if(command.eid == REP.MERGE_EID.id){
-				merge.addLast(command);
-				sortedEditCmds.add(command);
-			}
-		}
-		for(REPCommand command : unMergedCmds){
-			if(command.eid == eid){
-				command.eid = REP.MERGE_EID.id;
-				conflict.addLast(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());
 		unMergedCmds.clear();
-		returnCommand.addAll(merge);
-		returnCommand.addAll(conflict);
 		logger.writeLog("MergeAgain "+eid+" ret="+returnCommand.size());
 		mergeAgain = false;
 		optimizedSend(editor, returnCommand);
--- a/test/mergertest/EditorSimulatorImpl.java	Fri Oct 01 18:48:40 2010 +0900
+++ b/test/mergertest/EditorSimulatorImpl.java	Sat Oct 02 08:32:26 2010 +0900
@@ -1,5 +1,6 @@
 package test.mergertest;
 
+import java.util.LinkedList;
 import java.util.List;
 
 import rep.REPCommand;
@@ -23,14 +24,11 @@
 		Logger.print(command);
 	}
 
-	@Override
-	public List<REPCommand> getSentList() {
-		return null;
-	}
 
 	@Override
 	public void write(REPCommand command) {
 		
 	}
 
+
 }
--- a/test/mergertest/TestMerger.java	Fri Oct 01 18:48:40 2010 +0900
+++ b/test/mergertest/TestMerger.java	Sat Oct 02 08:32:26 2010 +0900
@@ -2,19 +2,18 @@
 
 import java.io.IOException;
 import java.util.LinkedList;
-import java.util.List;
 
 import rep.REP;
 import rep.REPCommand;
 import rep.Session;
 import rep.channel.REPSelectionKey;
 import rep.channel.REPSocketChannel;
-import rep.handler.REPNode;
+import rep.handler.Editor;
 import rep.handler.Translator;
 import rep.optimizers.NullOptimizer;
 import test.editortest.Logger;
 
-public class TestMerger extends REPNode{
+public class TestMerger extends Editor {
 	Translator trans;
 	private int seq;
 	private LinkedList<REPCommand> commandList;
@@ -27,6 +26,7 @@
 	}
 
 	public TestMerger(){
+		super(null, 0);
 		eid = 1;
 		sid = 1;
 		trans = new Translator(eid, new NullOptimizer());
@@ -50,57 +50,49 @@
 			trans.transReceiveCmd(null, command);
 		}
 		for(int i = 0; i < commandList.size(); i++){
-			trans.catchOwnCommand(this,null);
+			trans.merge(this,null);
 			System.out.println();
 		}
 	}
 
 	@Override
 	public void cancel(REPSocketChannel<REPCommand> channel1) {
-		// TODO Auto-generated method stub
 		
 	}
 
 	@Override
 	public void checkWaitingCommandInMerge() {
-		// TODO Auto-generated method stub
 		
 	}
 
 	@Override
 	public void forwardedCommandManage(REPCommand command) {
-		// TODO Auto-generated method stub
 		
 	}
 
 	@Override
 	public String getLocalHostName() {
-		// TODO Auto-generated method stub
 		return null;
 	}
 
 	@Override
 	public void handle(REPCommand command, REPSelectionKey<REPCommand> key)
 			throws IOException {
-		// TODO Auto-generated method stub
 		
 	}
 
 	@Override
 	public void joinAck(REPCommand sendCommand, int sid) {
-		// TODO Auto-generated method stub
 		
 	}
 
 	@Override
 	public boolean manage(REPCommand command) {
-		// TODO Auto-generated method stub
 		return false;
 	}
 
 	@Override
 	public void selectSession(REPCommand sendCommand, Session session) {
-		// TODO Auto-generated method stub
 		
 	}
 
@@ -111,31 +103,24 @@
 
 	@Override
 	public void sendWithSeq(REPCommand command) {
-		// TODO Auto-generated method stub
 		
 	}
 
 	@Override
 	public int seq() {
-		// TODO Auto-generated method stub
 		return seq++;
 	}
 
 	@Override
 	public void setQuit2(REPCommand receivedCommand) {
-		// TODO Auto-generated method stub
+
 		
 	}
 
-	@Override
-	public List<REPCommand> getSentList() {
-		// TODO Auto-generated method stub
-		return null;
-	}
 
 	@Override
 	public void write(REPCommand command) {
-		// TODO Auto-generated method stub
 		
 	}
+
 }
--- a/test/sematest/TestEditor.java	Fri Oct 01 18:48:40 2010 +0900
+++ b/test/sematest/TestEditor.java	Sat Oct 02 08:32:26 2010 +0900
@@ -250,6 +250,7 @@
 			forwardCommand(cmd);
 			break;
 		case REPCMD_NOP		:
+		case REPCMD_MERGE_MARK		:
 		case REPCMD_INSERT_ACK		:
 		case REPCMD_DELETE_ACK		:
 			forwardCommand(cmd);