# HG changeset patch # User kono # Date 1224603767 -32400 # Node ID e16b6326fdaca81e28a2fcc048ec0ff3a5823378 # Parent 97aa54c9afe61a667e35264cf67ecdb0bab7abb6 *** empty log message *** diff -r 97aa54c9afe6 -r e16b6326fdac rep/Forwarder.java --- a/rep/Forwarder.java Tue Oct 21 22:50:57 2008 +0900 +++ b/rep/Forwarder.java Wed Oct 22 00:42:47 2008 +0900 @@ -81,7 +81,7 @@ Session s = manager.getSession(command.sid); if (s==null) throw new IOException(); - Forwarder editor = s.getFirstForwarder(); + Forwarder editor = s.getFirstForwarder(channel); if (editor==null) throw new IOException(); editor.manage(command); } diff -r 97aa54c9afe6 -r e16b6326fdac rep/REP.java --- a/rep/REP.java Tue Oct 21 22:50:57 2008 +0900 +++ b/rep/REP.java Wed Oct 22 00:42:47 2008 +0900 @@ -13,7 +13,8 @@ SMCMD_PUT ( 45), SMCMD_PUT_ACK ( 46), SMCMD_SELECT ( 47), - SMCMD_SELECT_ACK ( 48), + SMCMD_SELECT_ACK ( 48), + SMCMD_SELECT0(49), SMCMD_QUIT ( 53), SMCMD_QUIT_ACK ( 54), SMCMD_SM_JOIN ( 62), diff -r 97aa54c9afe6 -r e16b6326fdac rep/Session.java --- a/rep/Session.java Tue Oct 21 22:50:57 2008 +0900 +++ b/rep/Session.java Wed Oct 22 00:42:47 2008 +0900 @@ -39,6 +39,9 @@ } } + /* + * どこにlocal editorを入れても良いのだが、まとめた方が良いか? + */ public void addForwarder(Forwarder forwarder) { // add a forwarder and connect this to the session forwarder.setSID(sessionID); @@ -125,9 +128,6 @@ } - Forwarder getNextEditor(Forwarder editor) { - return editor.getNextForwarder(); - } public void closeSession() { Forwarder first = firstForwarder; @@ -136,10 +136,10 @@ first.send(command); } - - - public Forwarder getFirstForwarder() { - return firstForwarder; + public Forwarder getFirstForwarder(REPSocketChannel channel) { + Forwarder f = firstForwarder; + while(f.next!=null && f.channel!=channel) f = f.next; + return f.next; } @@ -179,6 +179,7 @@ public void setFirstForwarder(Forwarder f) { f.setSID(sessionID); put(f.eid,f); + f.setNext(f); firstForwarder = last = f; } diff -r 97aa54c9afe6 -r e16b6326fdac rep/SessionManager.java --- a/rep/SessionManager.java Tue Oct 21 22:50:57 2008 +0900 +++ b/rep/SessionManager.java Wed Oct 22 00:42:47 2008 +0900 @@ -392,7 +392,23 @@ // assert(getSMID(editor.eid)==smList.sessionManagerID()); // assert(editor.channel!=null); editor.setSID(sid); // mark as selected - selectSession(sid, session, editor.getEID(), editor); + selectSession0(sid, session, editor.getEID(), editor); + } + + private void selectSession0(int sid, Session session, int eid, Editor editor) { + if (editor.isDirect()&&editor.getEID()==eid) { + selectSession(sid, session, editor.getEID(), editor); + } else { + // we don't have this editor, search the editor first. + Forwarder next = routingTable.toSessionManager(getSMID(eid)); + // pass the select command to the next path. + REPCommand command = new REPCommand(); + command.setCMD(REP.SMCMD_SELECT0); + command.setSID(sid); + command.setEID(eid); + command.setString(editor.getHost()); + next.send(command); + } } /* @@ -400,7 +416,7 @@ * called from GUI or incoming SMCMD_SELECT command. */ private void selectSession(int sid, Session session, int eid, Forwarder editor) { - if(session.hasOwner() && editor.channel!=null){ + if(session.hasOwner()){ // we have selected session. REPCommand sendCommand = new REPCommand(); if (editor.isDirect()&&editor.getEID()==eid) { @@ -413,45 +429,42 @@ // SELECT_ACK is sent to the session ring to // find out the joined editor. sendCommand.setCMD(REP.SMCMD_SELECT_ACK); - // Do not directly addForwarder(forwarder). It may be - // shared among sessions. - Forwarder f = new Editor(this, false, makeID(editorList.newEid())); - f.setChannel(editor.channel); // incoming channel - f.setHost(myHost); - f.setSID(sid); - session.addForwarder(f); // f.next is set up here. } sendCommand.setSID(sid); sendCommand.string = session.getName(); sendCommand.setEID(eid); editor.send(sendCommand); }else { - Forwarder next; - if (editor.channel==null) { - // we don't have this editor, search the editor first. - next = routingTable.toSessionManager(getSMID(eid)); - } else { - // session searching continue... - next = routingTable.toSessionManager(getSMID(sid)); - // create dummy editor for this session - Forwarder f = new Editor(this, false, makeID(editorList.newEid())); - f.setChannel(next.channel); // incoming channel - f.setNext(f); - f.setHost(myHost); - f.setSID(sid); - session.setFirstForwarder(f); - session.addForwarder(editor); - } - // pass the select command to the next path. - REPCommand command = new REPCommand(); - command.setCMD(REP.SMCMD_SELECT); - command.setSID(sid); - command.setEID(eid); - command.setString(editor.getHost()); - next.send(command); + forwardSelect(sid, session, eid, editor); } } + private void forwardSelect(int sid, Session session, int eid, + Forwarder editor) { + Forwarder next; + // session searching continue... + next = routingTable.toSessionManager(getSMID(sid)); + // make a forwarding channel here + Forwarder f = createSessionDispatcher(sid, next); + session.setFirstForwarder(f); + session.addForwarder(editor); + // pass the select command to the next path. + REPCommand command = new REPCommand(); + command.setCMD(REP.SMCMD_SELECT); + command.setSID(sid); + command.setEID(eid); + command.setString(editor.getHost()); + next.send(command); + } + + private Forwarder createSessionDispatcher(int sid, Forwarder editor) { + Forwarder f = new Editor(this, false, makeID(editorList.newEid())); + f.setChannel(editor.channel); // incoming channel + f.setHost(myHost); + f.setSID(sid); + return f; + } + /* * Create and send UPDATE command. */ @@ -635,13 +648,31 @@ } break; + case SMCMD_SELECT0: + /* + * finding joining editor, do not make the path. + */ + Forwarder editor = editorList.get(command.eid); + if (editor==null|| !editor.isDirect()) { + Forwarder next = routingTable.toSessionManager(getSMID(command.eid)); + next.send(command); + break; + } + // we've found the editor, fall thru. case SMCMD_SELECT: { + /* + * finding active session ring from joined editor. + */ Session session = sessionList.get(command.sid); if (session==null) { session = new Session(command.sid, command.string,null); sessionList.put(command.sid,session); } + // Do not directly addForwarder(forwarder). It may be + // shared among sessions. + Forwarder f = createSessionDispatcher(command.sid, forwarder); + session.addForwarder(f); // f.next is set up here. selectSession(command.sid, session, command.eid, forwarder); } break; @@ -649,18 +680,7 @@ { // Sessionが見つかったので、select したeditorに教える。 Session session = sessionList.get(command.sid); - Forwarder next = session.getNextEditor(forwarder); - if (next==null) next = session.getFirstForwarder(); - if (next.getEID()==command.eid) { - // select したeditor を見つける - command.cmd=REP.SMCMD_JOIN_ACK; - next.send(command); - } else if (next.isDirect()) { - // - next.manage(command); - } else { - next.send(command); - } + searchSelectedEditor(command,session.getFirstForwarder(forwarder.channel)); } break; @@ -731,6 +751,23 @@ return true; } + /* + * 指定されたeditorがlocalにあるかどうかを調べる。なければ、他に送る。戻って何回も探すことが + * あり得るので、よろしくない。 + */ + private void searchSelectedEditor(REPCommand command, Forwarder editor) { + for(;editor.isDirect();editor = editor.getNextForwarder()) { + if (editor.getEID()==command.eid) { + // select したeditor を見つけた + command.cmd=REP.SMCMD_JOIN_ACK; + editor.send(command); + return; + } + } + // ここにはありませんでした。 + editor.send(command); + } + /** * UPDATE/UPDATE_ACKにより送られてきたSessionの情報を追加する