Mercurial > hg > RemoteEditor > REPSessionManager
changeset 391:3b0a5a55e3ee
24
author | one@firefly.cr.ie.u-ryukyu.ac.jp |
---|---|
date | Mon, 10 Nov 2008 22:25:14 +0900 |
parents | aa07134fea32 |
children | 85d01cb6d133 |
files | rep/EditorList.java rep/ServerMainLoop.java rep/SessionManager.java rep/handler/Editor.java rep/handler/Translator.java test/AutoSelectManager.java |
diffstat | 6 files changed, 70 insertions(+), 18 deletions(-) [+] |
line wrap: on
line diff
--- a/rep/EditorList.java Mon Nov 10 22:24:34 2008 +0900 +++ b/rep/EditorList.java Mon Nov 10 22:25:14 2008 +0900 @@ -2,6 +2,7 @@ import java.util.HashMap; +import rep.channel.REPSocketChannel; import rep.handler.REPNode; public class EditorList extends HashMap<Integer,REPNode> { @@ -27,5 +28,11 @@ return containsKey(eid); } - + public REPNode editorByChannel(REPSocketChannel<REPCommand>channel) { + for(REPNode e:this.values()) { + if (e.channel==channel) + return e; + } + return null; + } }
--- a/rep/ServerMainLoop.java Mon Nov 10 22:24:34 2008 +0900 +++ b/rep/ServerMainLoop.java Mon Nov 10 22:25:14 2008 +0900 @@ -77,7 +77,7 @@ try { ssc.socket().bind(new InetSocketAddress("::",receive_port)); } catch (SocketException e) { - // for some IPv6 imlementation + // for some IPv6 implementation ssc.socket().bind(new InetSocketAddress(receive_port)); } ssc.register(selector, SelectionKey.OP_ACCEPT,null); @@ -95,6 +95,8 @@ private boolean checkWaitingWrite() throws IOException { PacketSet p = writeQueue.poll(); if (p!=null) { + logger.writeLog("writing: "+p.command+" to: " + +manager.editorList.editorByChannel(p.channel)); p.channel.write(p.command); return true; }
--- a/rep/SessionManager.java Mon Nov 10 22:24:34 2008 +0900 +++ b/rep/SessionManager.java Mon Nov 10 22:25:14 2008 +0900 @@ -23,6 +23,7 @@ import rep.handler.Forwarder; import rep.xml.SessionXMLDecoder; import rep.xml.SessionXMLEncoder; +import test.sematest.TestGUI; /* +-------+--------+--------+-------+--------+---------+------+ @@ -49,7 +50,7 @@ SessionManagerList smList = new SessionManagerList(); // Known Editor list. Connected Editor has a channel. // Session Manager Channel may have dummy editors. - EditorList editorList = new EditorList(); + public EditorList editorList = new EditorList(); // Queue limit for debugging purpose. static final int packetLimit = 400; @@ -603,4 +604,8 @@ smList.addWaitingSessionManager(fw, command); } + public int getId() { + return smList.sessionManagerID(); + } + }
--- a/rep/handler/Editor.java Mon Nov 10 22:24:34 2008 +0900 +++ b/rep/handler/Editor.java Mon Nov 10 22:25:14 2008 +0900 @@ -20,6 +20,7 @@ private List<REPCommand> sentList = new LinkedList<REPCommand>(); private REPCommand quit2=null; private boolean merging; + public static boolean noMergeMode=false; static final boolean doOptimize = true; public Editor(SessionManager manager,int editorNo){ @@ -38,8 +39,7 @@ public void translate(REPCommand command){ - - if(command.eid == eid){ + if (command.eid == eid){ //エディタからの新たな編集コマンド if (next==this) return; // singleton case translator.transSendCmd(command); @@ -47,16 +47,16 @@ assert(sentList.size()<limit); next.send(command); return; - } else if(command.eid == REP.MERGE_EID.id){ + } else if (command.eid == REP.MERGE_EID.id){ //マージコマンドが返ってきた if(translator.checkMergeConflict(command)){ //マージ中にエディタからの割り込みがあった場合 translator.getMergeAgain(this); } checkEndMerge(); - } else if(command.eid == next.getEID()){ + } else if (command.eid == next.getEID()){ // 次のEditorで一周するコマンドが来た - if(next==this) return; // singleton case + if (next==this) return; // singleton case // これは、distributed case では、うまくいかないので、送り先のforwarder で処理する。 if (next.isDirect()) ((Editor) next).checkReturnedCommand(command); @@ -64,17 +64,15 @@ next.send(command); } else { //他のエディタからの編集コマンド - assert (command.eid!=REP.MERGE_EID.id && command.eid!=eid ); if (manager.hasWaitingCommand(channel)) { // We cannot do this operation before watingCommandQueue. manager.addWaitingCommand(new PacketSet(channel, this, command)); return; - } - if(!isMerging()) { + } else if (isMerging()) { + manager.addWaitingCommand(new PacketSet(getChannel(), this, new REPCommand(command))); + } else { translator.transReceiveCmd(next,command); - return; } - manager.addWaitingCommand(new PacketSet(getChannel(), this, new REPCommand(command))); } return; } @@ -84,6 +82,10 @@ return translator.catchOwnCommand(this); } + /** + * 一周して来たcommandの処理。 + * @param command + */ void checkReturnedCommand(REPCommand command) { REPCommand prev = sentList.remove(0); if (prev==null || prev.seq != command.seq || prev.eid!=command.eid) { @@ -93,6 +95,13 @@ assert(false); } + // merge は必須だが、EditorのCommand実装をテストするには邪魔なので、off に出来るようにする。 + if (noMergeMode) { + // END_MERGE を出さないと、EditorがprevSeqをreset出来ない。 + REPCommand ack = new REPCommand(REP.SMCMD_END_MERGE,command.sid,REP.SM_EID.id,seq(),0,""); + send(ack); + return; + } // START_MERGE を送る // 送らないで良い場合もある? REPCommand cmd = new REPCommand(REP.SMCMD_START_MERGE,command.sid,REP.SM_EID.id,seq(),0,""); @@ -217,7 +226,8 @@ @Override public void handle(REPCommand command, REPSelectionKey<REPCommand> key) throws IOException { - ServerMainLoop.logger.writeLog("REPHandlerImpl.handle() read : command = " + command +" from "+channel); + ServerMainLoop.logger.writeLog("Manager "+manager.getId()+"read : command = " + command + +" from "+manager.editorList.editorByChannel(channel)); if (command.cmd==REP.SMCMD_JOIN||command.cmd==REP.SMCMD_PUT) { assert false; // 若干問題があるらしい
--- a/rep/handler/Translator.java Mon Nov 10 22:24:34 2008 +0900 +++ b/rep/handler/Translator.java Mon Nov 10 22:25:14 2008 +0900 @@ -66,10 +66,7 @@ /* 残ったコマンドも再び実行させるが、まだマージされてないのでunMergedにも入れる */ output.addAll(cmds); - for(REPCommand c: cmds) { - output.add(c); - unMergedCmds.add(c); - } + unMergedCmds.addAll(cmds); return optimizedSend(editor,output); }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/AutoSelectManager.java Mon Nov 10 22:25:14 2008 +0900 @@ -0,0 +1,31 @@ +package test; + +import java.io.IOException; + +import rep.ServerMainLoop; +import rep.SessionManager; +import rep.handler.Editor; +import test.sematest.TestGUI; + +public class AutoSelectManager extends SessionManager { + + public static void main(String[] args) throws InterruptedException, IOException { + int port =ServerMainLoop.DEFAULT_PORT; + int port_s = ServerMainLoop.DEFAULT_PORT; + //System.setProperty("file.encoding", "UTF-8"); + if(args.length > 0){ + if (args.length!=2) { + logger.writeLog("Usage: sessionManager our_port parent_port"); + return; + } + port = Integer.parseInt(args[0]); + port_s = Integer.parseInt(args[1]); + } + Editor.noMergeMode = true; + SessionManager sm = new SessionManager(); + sm.setReceivePort(port); + sm.setParentPort(port_s); + // Ok start main loop + sm.init(port,new TestGUI(sm)); + } +}