# HG changeset patch # User one # Date 1287818114 -32400 # Node ID d2afd4efdd2d168856351b914c08dbea538d868f # Parent 5945266c970dfa4de6434ad2d719276897bc52d3 remove unMergedCmds, use sentList instead. diff -r 5945266c970d -r d2afd4efdd2d rep/REPCommand.java --- 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(){ diff -r 5945266c970d -r d2afd4efdd2d rep/handler/Editor.java --- 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 unMergedCmds; private LinkedList sentMergedList; private TreeSet sortedEditCmds; boolean mergeAgain; @@ -61,7 +60,6 @@ if (doOptimize) optimizer = new DeleteInsertOptimizer(); //タカノがつくったおぷてぃまいざ else optimizer = new NullOptimizer(); //なにもしないけどOptimizer. - unMergedCmds = new LinkedList(); mergeAgain = false; sentMergedList = new LinkedList(); } @@ -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 u = new LinkedList(); - 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; - LinkedListu = new LinkedList(); - 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; LinkedLists = new LinkedList(); for(REPCommand command:sentList) { if (command.eid!=eid) { @@ -459,13 +439,6 @@ */ public void truncateUnMergedCmds(REPCommand commit) { assert(!merging); - LinkedListu = new LinkedList(); - 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; LinkedLists = new LinkedList(); 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 output = new LinkedList(); LinkedList newSentList = new LinkedList(); // 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(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 output = new LinkedList(); LinkedList newSentList = new LinkedList(); // merge queue上にあるコマンドを全部undoコマンドするのと同時に // sort したコマンド列を生成する - for( REPCommand cmd0 : unMergedCmds) { - output.addLast( createUndo(cmd0) ); + for( REPCommand cmd0 : sentList) { + output.addFirst( createUndo(cmd0) ); } sortedEditCmds = new TreeSet(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 output) { /* - * Optimized send の場合は、unMergedCommand のつじつまを合わせる必要がある。 + * Optimized send の場合は、command.original を意識する必要がある */ sentMergedList.clear(); List 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 returnCommand = new LinkedList(); - 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; }