You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zookeeper.apache.org by ma...@apache.org on 2009/06/26 22:29:55 UTC

svn commit: r788860 - in /hadoop/zookeeper/trunk: ./ src/java/main/org/apache/zookeeper/ src/java/main/org/apache/zookeeper/server/ src/java/main/org/apache/zookeeper/server/quorum/ src/java/test/org/apache/zookeeper/server/quorum/ src/java/test/org/ap...

Author: mahadev
Date: Fri Jun 26 20:29:54 2009
New Revision: 788860

URL: http://svn.apache.org/viewvc?rev=788860&view=rev
Log:
ZOOKEEPER-417. stray message problem when changing servers (breed via mahadev)

Modified:
    hadoop/zookeeper/trunk/CHANGES.txt
    hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/KeeperException.java
    hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/FinalRequestProcessor.java
    hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
    hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/PrepRequestProcessor.java
    hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/Request.java
    hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/SessionTracker.java
    hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/SessionTrackerImpl.java
    hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
    hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/FollowerHandler.java
    hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/FollowerSessionTracker.java
    hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/LeaderZooKeeperServer.java
    hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/QuorumPeerMainTest.java
    hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/AsyncTest.java
    hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/QuorumTest.java
    hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/SessionTest.java

Modified: hadoop/zookeeper/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/CHANGES.txt?rev=788860&r1=788859&r2=788860&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/CHANGES.txt (original)
+++ hadoop/zookeeper/trunk/CHANGES.txt Fri Jun 26 20:29:54 2009
@@ -133,6 +133,9 @@
 
   ZOOKEEPER-448. png files do nto work with forrest. (mahadev)
 
+  ZOOKEEPER-417. stray message problem when changing servers (breed via
+mahadev)
+
 IMPROVEMENTS:
   ZOOKEEPER-308. improve the atomic broadcast performance 3x.
   (breed via mahadev)

Modified: hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/KeeperException.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/KeeperException.java?rev=788860&r1=788859&r2=788860&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/KeeperException.java (original)
+++ hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/KeeperException.java Fri Jun 26 20:29:54 2009
@@ -118,7 +118,9 @@
                 return new SessionExpiredException();
             case INVALIDCALLBACK:
                 return new InvalidCallbackException();
-
+            case SESSIONMOVED:
+                return new SessionMovedException();
+            	
             case OK:
             default:
                 throw new IllegalArgumentException("Invalid exception code");
@@ -264,6 +266,10 @@
          */
         @Deprecated
         public static final int AuthFailed = -115;
+        /**
+         * This value will be used directly in {@link CODE#SESSIONMOVED}
+         */
+        // public static final int SessionMoved = -116;
     }
 
     /** Codes which represent the various KeeperException
@@ -296,7 +302,7 @@
         OPERATIONTIMEOUT (OperationTimeout),
         /** Invalid arguments */
         BADARGUMENTS (BadArguments),
-
+        
         /** API errors.
          * This is never thrown by the server, it shouldn't be used other than
          * to indicate a range. Specifically error codes greater than this
@@ -324,7 +330,9 @@
         /** Invalid ACL specified */
         INVALIDACL (InvalidACL),
         /** Client authentication failed */
-        AUTHFAILED (AuthFailed);
+        AUTHFAILED (AuthFailed),
+        /** Session moved to another server, so operation is ignored */
+        SESSIONMOVED (-116);
 
         private static final Map<Integer,Code> lookup
             = new HashMap<Integer,Code>();
@@ -397,6 +405,8 @@
                 return "Session expired";
             case INVALIDCALLBACK:
                 return "Invalid callback";
+            case SESSIONMOVED:
+                return "Session moved";
             default:
                 return "Unknown error " + code;
         }
@@ -601,6 +611,15 @@
             super(Code.SESSIONEXPIRED);
         }
     }
+    
+    /**
+     * @see Code#SESSIONMOVED
+     */
+    public static class SessionMovedException extends KeeperException {
+        public SessionMovedException() {
+            super(Code.SESSIONMOVED);
+        }
+    }
 
     /**
      * @see Code#SYSTEMERROR

Modified: hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/FinalRequestProcessor.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/FinalRequestProcessor.java?rev=788860&r1=788859&r2=788860&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/FinalRequestProcessor.java (original)
+++ hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/FinalRequestProcessor.java Fri Jun 26 20:29:54 2009
@@ -137,6 +137,11 @@
                 throw KeeperException.create(KeeperException.Code.get((
                         (ErrorTxn) request.txn).getErr()));
             }
+            
+            KeeperException ke = request.getException();
+            if (ke != null) {
+                throw ke;
+            }
 
             if (LOG.isDebugEnabled()) {
                 LOG.debug(request);

Modified: hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java?rev=788860&r1=788859&r2=788860&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java (original)
+++ hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java Fri Jun 26 20:29:54 2009
@@ -70,6 +70,10 @@
 
     private ConnectionBean jmxConnectionBean;
 
+    // This is just an arbitrary object to represent requests issued by
+    // (aka owned by) this class
+    final private static Object me = new Object();
+
     static public class Factory extends Thread {
         ZooKeeperServer zks;
 
@@ -280,7 +284,12 @@
 
         synchronized void closeSession(long sessionId) {
             selector.wakeup();
-            synchronized (cnxns) {
+            closeSessionWithoutWakeup(sessionId);
+        }
+
+
+		private void closeSessionWithoutWakeup(long sessionId) {
+			synchronized (cnxns) {
                 for (Iterator<NIOServerCnxn> it = cnxns.iterator(); it
                         .hasNext();) {
                     NIOServerCnxn cnxn = it.next();
@@ -534,8 +543,9 @@
             }
             return;
         } else {
-            zk.submitRequest(this, sessionId, h.getType(), h.getXid(),
-                    incomingBuffer, authInfo);
+            Request si = new Request(this, sessionId, h.getXid(), h.getType(), incomingBuffer, authInfo);
+            si.setOwner(me);
+            zk.submitRequest(si);
         }
         if (h.getXid() >= 0) {
             synchronized (this) {
@@ -599,6 +609,7 @@
         // session is setup
         disableRecv();
         if (connReq.getSessionId() != 0) {
+        	factory.closeSessionWithoutWakeup(connReq.getSessionId());
             setSessionId(connReq.getSessionId());
             zk.reopenSession(this, sessionId, passwd, sessionTimeout);
             LOG.info("Renewing session 0x" + Long.toHexString(sessionId));

Modified: hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/PrepRequestProcessor.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/PrepRequestProcessor.java?rev=788860&r1=788859&r2=788860&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/PrepRequestProcessor.java (original)
+++ hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/PrepRequestProcessor.java Fri Jun 26 20:29:54 2009
@@ -208,7 +208,7 @@
             case OpCode.create:
                 txnHeader = new TxnHeader(request.sessionId, request.cxid, zks
                         .getNextZxid(), zks.getTime(), OpCode.create);
-                zks.sessionTracker.checkSession(request.sessionId);
+                zks.sessionTracker.checkSession(request.sessionId, request.getOwner());
                 CreateRequest createRequest = new CreateRequest();
                 ZooKeeperServer.byteBuffer2Record(request.request,
                         createRequest);
@@ -270,7 +270,7 @@
             case OpCode.delete:
                 txnHeader = new TxnHeader(request.sessionId, request.cxid, zks
                         .getNextZxid(), zks.getTime(), OpCode.delete);
-                zks.sessionTracker.checkSession(request.sessionId);
+                zks.sessionTracker.checkSession(request.sessionId, request.getOwner());
                 DeleteRequest deleteRequest = new DeleteRequest();
                 ZooKeeperServer.byteBuffer2Record(request.request,
                         deleteRequest);
@@ -304,7 +304,7 @@
             case OpCode.setData:
                 txnHeader = new TxnHeader(request.sessionId, request.cxid, zks
                         .getNextZxid(), zks.getTime(), OpCode.setData);
-                zks.sessionTracker.checkSession(request.sessionId);
+                zks.sessionTracker.checkSession(request.sessionId, request.getOwner());
                 SetDataRequest setDataRequest = new SetDataRequest();
                 ZooKeeperServer.byteBuffer2Record(request.request,
                         setDataRequest);
@@ -326,7 +326,7 @@
             case OpCode.setACL:
                 txnHeader = new TxnHeader(request.sessionId, request.cxid, zks
                         .getNextZxid(), zks.getTime(), OpCode.setACL);
-                zks.sessionTracker.checkSession(request.sessionId);
+                zks.sessionTracker.checkSession(request.sessionId, request.getOwner());
                 SetACLRequest setAclRequest = new SetACLRequest();
                 ZooKeeperServer.byteBuffer2Record(request.request,
                         setAclRequest);
@@ -356,10 +356,12 @@
                 txn = new CreateSessionTxn(to);
                 request.request.rewind();
                 zks.sessionTracker.addSession(request.sessionId, to);
+                zks.sessionTracker.setOwner(request.sessionId, request.getOwner());
                 break;
             case OpCode.closeSession:
                 txnHeader = new TxnHeader(request.sessionId, request.cxid, zks
                         .getNextZxid(), zks.getTime(), OpCode.closeSession);
+                zks.sessionTracker.checkSession(request.sessionId, request.getOwner());
                 HashSet<String> es = zks.dataTree
                         .getEphemerals(request.sessionId);
                 synchronized (zks.outstandingChanges) {
@@ -386,6 +388,7 @@
             case OpCode.getChildren:
             case OpCode.ping:
             case OpCode.setWatches:
+            	zks.sessionTracker.checkSession(request.sessionId, request.getOwner());
                 break;
             }
         } catch (KeeperException e) {
@@ -393,6 +396,8 @@
                 txnHeader.setType(OpCode.error);
                 txn = new ErrorTxn(e.code().intValue());
             }
+            LOG.warn("Got exception when processing " + request.toString(), e);
+            request.setException(e);
         } catch (Exception e) {
             // log at error level as we are returning a marshalling
             // error to the user

Modified: hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/Request.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/Request.java?rev=788860&r1=788859&r2=788860&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/Request.java (original)
+++ hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/Request.java Fri Jun 26 20:29:54 2009
@@ -23,6 +23,7 @@
 
 import org.apache.jute.Record;
 import org.apache.log4j.Logger;
+import org.apache.zookeeper.KeeperException;
 import org.apache.zookeeper.ZooDefs.OpCode;
 import org.apache.zookeeper.data.Id;
 import org.apache.zookeeper.txn.TxnHeader;
@@ -74,6 +75,18 @@
     public List<Id> authInfo;
 
     public long createTime = System.currentTimeMillis();
+    
+    private Object owner;
+    
+    private KeeperException e;
+    
+    public Object getOwner() {
+        return owner;
+    }
+    
+    public void setOwner(Object owner) {
+        this.owner = owner;
+    }
 
     /**
      * is the packet type a valid packet in zookeeper
@@ -194,4 +207,12 @@
 
         return sb.toString();
     }
+
+    public void setException(KeeperException e) {
+        this.e = e;
+    }
+	
+    public KeeperException getException() {
+        return e;
+    }
 }

Modified: hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/SessionTracker.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/SessionTracker.java?rev=788860&r1=788859&r2=788860&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/SessionTracker.java (original)
+++ hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/SessionTracker.java Fri Jun 26 20:29:54 2009
@@ -19,6 +19,8 @@
 package org.apache.zookeeper.server;
 
 import org.apache.zookeeper.KeeperException;
+import org.apache.zookeeper.KeeperException.SessionExpiredException;
+import org.apache.zookeeper.KeeperException.SessionMovedException;
 
 /**
  * This is the basic interface that ZooKeeperServer uses to track sessions. The
@@ -54,5 +56,7 @@
      */
     void removeSession(long sessionId);
 
-    void checkSession(long sessionId) throws KeeperException.SessionExpiredException;
+    void checkSession(long sessionId, Object owner) throws KeeperException.SessionExpiredException, SessionMovedException;
+
+    void setOwner(long id, Object owner) throws SessionExpiredException;
 }

Modified: hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/SessionTrackerImpl.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/SessionTrackerImpl.java?rev=788860&r1=788859&r2=788860&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/SessionTrackerImpl.java (original)
+++ hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/SessionTrackerImpl.java Fri Jun 26 20:29:54 2009
@@ -28,6 +28,8 @@
 
 import org.apache.log4j.Logger;
 import org.apache.zookeeper.KeeperException;
+import org.apache.zookeeper.KeeperException.SessionExpiredException;
+import org.apache.zookeeper.KeeperException.SessionMovedException;
 
 /**
  * This is a full featured SessionTracker. It tracks session in grouped by tick
@@ -57,6 +59,8 @@
         long tickTime;
 
         long sessionId;
+        
+        Object owner;
     }
 
     public static long initializeNextSession(long id) {
@@ -216,9 +220,24 @@
         touchSession(id, sessionTimeout);
     }
 
-    public void checkSession(long sessionId) throws KeeperException.SessionExpiredException {
-        if (sessionsById.get(sessionId) == null) {
+    synchronized public void checkSession(long sessionId, Object owner) throws KeeperException.SessionExpiredException, KeeperException.SessionMovedException {
+        Session session = sessionsById.get(sessionId);
+		if (session == null) {
             throw new KeeperException.SessionExpiredException();
         }
+		if (session.owner == null) {
+			session.owner = owner;
+		} else if (session.owner != owner) {
+			throw new KeeperException.SessionMovedException();
+		}
     }
+
+	@Override
+	synchronized public void setOwner(long id, Object owner) throws SessionExpiredException {
+		Session session = sessionsById.get(id);
+		if (session == null) {
+            throw new KeeperException.SessionExpiredException();
+        }
+		session.owner = owner;
+	}
 }

Modified: hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java?rev=788860&r1=788859&r2=788860&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java (original)
+++ hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java Fri Jun 26 20:29:54 2009
@@ -534,7 +534,7 @@
      * @param xid
      * @param bb
      */
-    public void submitRequest(ServerCnxn cnxn, long sessionId, int type,
+    private void submitRequest(ServerCnxn cnxn, long sessionId, int type,
             int xid, ByteBuffer bb, List<Id> authInfo) {
         Request si = new Request(cnxn, sessionId, xid, type, bb, authInfo);
         submitRequest(si);

Modified: hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/FollowerHandler.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/FollowerHandler.java?rev=788860&r1=788859&r2=788860&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/FollowerHandler.java (original)
+++ hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/FollowerHandler.java Fri Jun 26 20:29:54 2009
@@ -33,7 +33,9 @@
 import org.apache.jute.BinaryOutputArchive;
 import org.apache.jute.Record;
 import org.apache.log4j.Logger;
+import org.apache.zookeeper.KeeperException.SessionExpiredException;
 import org.apache.zookeeper.ZooDefs.OpCode;
+import org.apache.zookeeper.server.Request;
 import org.apache.zookeeper.server.ZooTrace;
 import org.apache.zookeeper.server.quorum.Leader.Proposal;
 import org.apache.zookeeper.server.util.SerializeUtils;
@@ -351,6 +353,13 @@
                     DataOutputStream dos = new DataOutputStream(bos);
                     dos.writeLong(id);
                     boolean valid = leader.zk.touch(id, to);
+                    if (valid) {
+                        try {
+                            leader.zk.setOwner(id, this);
+                        } catch (SessionExpiredException e) {
+                            LOG.error("Somehow session " + Long.toHexString(id) + " expired right after being renewed! (impossible)", e);
+                        }
+                    }
                     if (LOG.isTraceEnabled()) {
                         ZooTrace.logTraceMessage(LOG,
                                                  ZooTrace.SESSION_TRACE_MASK,
@@ -371,8 +380,9 @@
                      	leader.zk.submitRequest(new FollowerSyncRequest(this, sessionId, cxid, type, bb,
                                 qp.getAuthinfo()));
                     } else {
-                    leader.zk.submitRequest(null, sessionId, type, cxid, bb,
-                            qp.getAuthinfo());
+                        Request si = new Request(null, sessionId, cxid, type, bb, qp.getAuthinfo());
+                        si.setOwner(this);
+                        leader.zk.submitRequest(si);
                     }
                     break;
                 default:

Modified: hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/FollowerSessionTracker.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/FollowerSessionTracker.java?rev=788860&r1=788859&r2=788860&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/FollowerSessionTracker.java (original)
+++ hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/FollowerSessionTracker.java Fri Jun 26 20:29:54 2009
@@ -79,7 +79,11 @@
         return (nextSessionId++);
     }
 
-    public void checkSession(long sessionId)  {
+    public void checkSession(long sessionId, Object owner)  {
+        // Nothing to do here. Sessions are checked at the Leader
+    }
+    
+    public void setOwner(long sessionId, Object owner) {
         // Nothing to do here. Sessions are checked at the Leader
     }
 }

Modified: hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/LeaderZooKeeperServer.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/LeaderZooKeeperServer.java?rev=788860&r1=788859&r2=788860&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/LeaderZooKeeperServer.java (original)
+++ hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/LeaderZooKeeperServer.java Fri Jun 26 20:29:54 2009
@@ -20,11 +20,13 @@
 
 import java.io.IOException;
 
+import org.apache.zookeeper.KeeperException.SessionExpiredException;
 import org.apache.zookeeper.jmx.MBeanRegistry;
 import org.apache.zookeeper.server.DataTreeBean;
 import org.apache.zookeeper.server.FinalRequestProcessor;
 import org.apache.zookeeper.server.PrepRequestProcessor;
 import org.apache.zookeeper.server.RequestProcessor;
+import org.apache.zookeeper.server.ServerCnxn;
 import org.apache.zookeeper.server.SessionTrackerImpl;
 import org.apache.zookeeper.server.ZooKeeperServer;
 import org.apache.zookeeper.server.persistence.FileTxnSnapLog;
@@ -151,4 +153,19 @@
     public String getState() {
         return "leader";
     }
+
+    public void setOwner(long id, Object owner) throws SessionExpiredException {
+        sessionTracker.setOwner(id, owner);
+    }
+
+    @Override
+    protected void revalidateSession(ServerCnxn cnxn, long sessionId,
+        int sessionTimeout) throws IOException, InterruptedException {
+        super.revalidateSession(cnxn, sessionId, sessionTimeout);
+        try {
+            setOwner(sessionId, this);
+        } catch (SessionExpiredException e) {
+            // this is ok, it just means that the session revalidation failed.
+        }
+    }
 }

Modified: hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/QuorumPeerMainTest.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/QuorumPeerMainTest.java?rev=788860&r1=788859&r2=788860&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/QuorumPeerMainTest.java (original)
+++ hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/QuorumPeerMainTest.java Fri Jun 26 20:29:54 2009
@@ -201,7 +201,7 @@
                 ClientBase.waitForServerUp("localhost:" + CLIENT_PORT_QP1,
                         5000);
 
-            assertFalse(isup);
+            assertFalse("Server never came up", isup);
             
             q1.shutdown();
 

Modified: hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/AsyncTest.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/AsyncTest.java?rev=788860&r1=788859&r2=788860&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/AsyncTest.java (original)
+++ hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/AsyncTest.java Fri Jun 26 20:29:54 2009
@@ -189,7 +189,7 @@
             verifyThreadTerminated(hammers[i], 60000);
         }
         // before restart
-        QuorumTest qt = new QuorumTest();
+        QuorumBase qt = new QuorumBase();
         qt.verifyRootOfAllServersMatch(qb.hostPort);
         tearDown();
 

Modified: hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/QuorumTest.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/QuorumTest.java?rev=788860&r1=788859&r2=788860&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/QuorumTest.java (original)
+++ hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/QuorumTest.java Fri Jun 26 20:29:54 2009
@@ -18,14 +18,23 @@
 
 package org.apache.zookeeper.test;
 import java.io.IOException;
+import java.util.ArrayList;
+
+import junit.framework.TestCase;
 
 import org.apache.log4j.Logger;
+import org.apache.zookeeper.CreateMode;
 import org.apache.zookeeper.KeeperException;
+import org.apache.zookeeper.WatchedEvent;
+import org.apache.zookeeper.Watcher;
+import org.apache.zookeeper.ZooDefs;
+import org.apache.zookeeper.ZooKeeper;
 import org.junit.Before;
 import org.junit.Test;
 
-public class QuorumTest extends QuorumBase {
+public class QuorumTest extends TestCase {
     private static final Logger LOG = Logger.getLogger(QuorumTest.class);
+    public static final long CONNECTION_TIMEOUT = ClientTest.CONNECTION_TIMEOUT;
     private QuorumBase qb = new QuorumBase();
     private final ClientTest ct = new ClientTest();
     
@@ -86,6 +95,44 @@
     {
         ct.testMutipleWatcherObjs();
     }
+    
+    @Test
+    /**
+     * Connect to two different servers with two different handles using the same session and
+     * make sure we cannot do any changes.
+     */
+    public void testSessionMove() throws IOException, InterruptedException, KeeperException {
+        String hps[] = qb.hostPort.split(",");
+        ZooKeeper zk = new DisconnectableZooKeeper(hps[0], ClientBase.CONNECTION_TIMEOUT, new Watcher() {
+            public void process(WatchedEvent event) {
+        }});
+        zk.create("/t1", new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
+        // This should stomp the zk handle
+        ZooKeeper zknew = new DisconnectableZooKeeper(hps[1], ClientBase.CONNECTION_TIMEOUT, new Watcher() {
+            public void process(WatchedEvent event) {
+            }}, zk.getSessionId(), zk.getSessionPasswd());
+        zknew.create("/t2", new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
+        try {
+            zk.create("/t3", new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
+            fail("Should have lost the connection");
+        } catch(KeeperException.SessionMovedException e) {
+        }
+        
+        ArrayList<ZooKeeper> toClose = new ArrayList<ZooKeeper>();
+        toClose.add(zknew);
+        // Let's just make sure it can still move
+        for(int i = 0; i < 10; i++) {
+            zknew = new DisconnectableZooKeeper(hps[1], ClientBase.CONNECTION_TIMEOUT, new Watcher() {
+                public void process(WatchedEvent event) {
+                }}, zk.getSessionId(), zk.getSessionPasswd());
+            toClose.add(zknew);
+            zknew.create("/t-"+i, new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
+        }
+	for(ZooKeeper z: toClose) {
+            z.close();
+        }
+        zk.close();
+    }
 
     // skip superhammer and clientcleanup as they are too expensive for quorum
 }

Modified: hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/SessionTest.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/SessionTest.java?rev=788860&r1=788859&r2=788860&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/SessionTest.java (original)
+++ hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/SessionTest.java Fri Jun 26 20:29:54 2009
@@ -179,6 +179,31 @@
         zk.close();
     }
 
+    /**
+     * Make sure that we cannot have two connections with the same
+     * session id.
+     * 
+     * @throws IOException
+     * @throws InterruptedException
+     * @throws KeeperException
+     */
+    @Test
+    public void testSessionMove() throws IOException, InterruptedException, KeeperException {
+    	ZooKeeper zk = createClient();
+    	zk.getChildren("/", false);
+    	// This should stomp the zk handle
+    	ZooKeeper zknew = new DisconnectableZooKeeper(HOSTPORT, CONNECTION_TIMEOUT, this,
+                   zk.getSessionId(),
+                   zk.getSessionPasswd());
+    	zknew.getChildren("/", false);
+    	try {
+    	    zk.getChildren("/", false);
+    	    fail("Should have lost the connection");
+    	} catch(KeeperException.ConnectionLossException e) {
+    	}
+    	zknew.close();
+    	zk.close();
+    }
     @Test
     /**
      * This test makes sure that duplicate state changes are not communicated