r9864 - helma/extensions/helmaswarm/trunk/src/helma/swarm

[email protected] Thu, 10 Sep 2009 01:29:41 +0200 (CEST)
Newsgroups gmane.comp.java.helma.cvs
Message-ID <20090909232941.1F4D73D0E3@mia>
Author: hannes
Date: 2009-09-10 01:29:40 +0200 (Thu, 10 Sep 2009)
New Revision: 9864

Modified:
   helma/extensions/helmaswarm/trunk/src/helma/swarm/SwarmSession.java
   helma/extensions/helmaswarm/trunk/src/helma/swarm/SwarmSessionManager.java
Log:
Update to 1.7 session management changes, fixing a few buglets along the way.

Details at http://dev.helma.org/trac/helma/changeset/9864

Modified: helma/extensions/helmaswarm/trunk/src/helma/swarm/SwarmSession.java
===================================================================
--- helma/extensions/helmaswarm/trunk/src/helma/swarm/SwarmSession.java	2009-09-09 23:27:04 UTC (rev 9863)
+++ helma/extensions/helmaswarm/trunk/src/helma/swarm/SwarmSession.java	2009-09-09 23:29:40 UTC (rev 9864)
@@ -19,7 +19,7 @@
 import helma.framework.core.Session;
 import helma.framework.core.Application;
 import helma.framework.core.RequestEvaluator;
-import helma.objectmodel.db.NodeHandle;
+import helma.framework.core.SessionManager;
 import helma.objectmodel.INode;
 
 public class SwarmSession extends Session {
@@ -31,11 +31,6 @@
 
     // swarm session manager reference
     transient SwarmSessionManager sessionMgr;
-    // transient helper fields to track changes
-    transient long previousLastMod;
-    transient NodeHandle previousUserHandle;
-    transient String previousMessage;
-    transient StringBuffer previousDebugBuffer;
 
     public SwarmSession(String sessionId, Application app, SwarmSessionManager mgr) {
         super(sessionId, app);
@@ -45,10 +40,6 @@
     public void touch() {
         super.touch();
         sessionMgr.touchSession(this);
-        previousLastMod = getCacheNode().lastModified();
-        previousUserHandle = userHandle;
-        previousMessage = message;
-        previousDebugBuffer = debugBuffer;
     }
 
     void replicatedTouch() {
@@ -59,10 +50,12 @@
      * Called after a request has been handled.
      * @param reval the request evaluator that handled the request
      */
-    public void commit(RequestEvaluator reval) {
-        if (wasModifiedInRequest()) {
-            sessionMgr.broadcastSession(this, reval);
+    public void commit(RequestEvaluator reval, SessionManager smgr) {
+        boolean modifiedCacheNode = cacheLastModified != cacheNode.lastModified();
+        if (modifiedInRequest || modifiedCacheNode) {
+            sessionMgr.broadcastSession(this, reval, modifiedCacheNode);
         }
+        super.commit(reval, smgr);
     }
 
     /**
@@ -89,14 +82,5 @@
                cache.created() != cache.lastModified();
     }
 
-    protected boolean wasModifiedInRequest() {
-        // true if session was modified since we last called touch() on it
-        INode cache = getCacheNode();
-        return cache.lastModified() != previousLastMod ||
-               userHandle != previousUserHandle ||
-               message != previousMessage ||
-               debugBuffer != previousDebugBuffer;
-    }
-
 }
 

Modified: helma/extensions/helmaswarm/trunk/src/helma/swarm/SwarmSessionManager.java
===================================================================
--- helma/extensions/helmaswarm/trunk/src/helma/swarm/SwarmSessionManager.java	2009-09-09 23:27:04 UTC (rev 9863)
+++ helma/extensions/helmaswarm/trunk/src/helma/swarm/SwarmSessionManager.java	2009-09-09 23:29:40 UTC (rev 9864)
@@ -43,6 +43,7 @@
     Log log;
     volatile Thread runner;
     HashSet touched = new HashSet(), discarded = new HashSet();
+    boolean debug;
 
     ////////////////////////////////////////////////////////
     // SessionManager functionality
@@ -54,6 +55,7 @@
                                   .append(".swarm")
                                   .toString();
         log = app.getLogger(logName);
+        debug = log.isDebugEnabled();
         try {
             adapter = ChannelUtils.getAdapter(app);
             Channel channel = (Channel) adapter.getTransport();
@@ -79,12 +81,9 @@
 
     public Session createSession(String sessionId) {
         Session session = getSession(sessionId);
-
         if (session == null) {
             session = new SwarmSession(sessionId, app, this);
-            sessions.put(sessionId, session);
         }
-
         return session;
     }
 
@@ -136,19 +135,23 @@
 
     public void receive(Message msg) {
         if (address.equals(msg.getSrc())) {
-            log.debug("Discarding own message: "+address);
+            if (debug) {
+                log.trace("Discarding own message: " + address);
+            }
             return;
         }
 
         Object object = msg.getObject();
-        log.debug("Received object: " + object);
+        if (debug) log.trace("Received object: " + object);
         if (object instanceof byte[]) {
             try {
                 SwarmSession session = (SwarmSession) bytesToObject((byte[]) object);
                 session.setApp(app);
                 session.sessionMgr = this;
-                sessions.put(session.getSessionId(), session);
-                log.debug("Transfered session: " + session);
+                registerSession(session);
+                if (debug) {
+                    log.debug("Received session: " + session);
+                }
             } catch (Exception x) {
                 log.error("Error in session deserialization", x);
             }
@@ -162,11 +165,14 @@
                 session.setMessage(update.message);
                 session.setDebugBuffer(update.debugBuffer);
                 session.setUserHandle(update.userHandle);
+                session.setUID(update.uid);
                 if (update.cacheNode != null) {
                     Object cacheNode = bytesToObject(update.cacheNode);
                     session.setCacheNode((INode) cacheNode);
                 }
-                log.debug("Transfered session update: " + session);
+                if (debug) {
+                    log.debug("Received session update: " + session);
+                }
             } catch (Exception x) {
                 log.error("Error in session deserialization", x);
             }
@@ -177,14 +183,18 @@
                 // TODO: implement staged session dump
                 for (int i = 0; i < ids.length; i++) {
                     sessions.remove(ids[i]);
-                    log.debug("Discarded session: " + ids[i]);
+                    if (debug) {
+                        log.trace("Discarded session: " + ids[i]);
+                    }
                 }
             } else if (idlist.operation == TOUCH) {
                 for (int i = 0; i < ids.length; i++) {
                     Object session = sessions.get(ids[i]);
                     if (session instanceof SwarmSession) {
                         ((SwarmSession) session).replicatedTouch();
-                        log.debug("Touched session: " + ids[i]);
+                        if (debug) {
+                            log.trace("Touched session: " + ids[i]);
+                        }
                     }
                 }
             }
@@ -201,7 +211,7 @@
             log.error("Error in getState()", x);
             throw new RuntimeException("Error in getState(): "+x);
         } finally {
-            if (log.isDebugEnabled()) {
+            if (debug) {
                 log.debug("Returned session table: " + map);
             }
             app.releaseEvaluator(reval);
@@ -219,7 +229,7 @@
                     session.sessionMgr = SwarmSessionManager.this;
                 }
                 sessions = map;
-                if (log.isDebugEnabled()) {
+                if (debug) {
                     log.debug("Received session map: " + map);
                 }
             } catch (Exception x) {
@@ -228,11 +238,11 @@
         }
     }
 
-    void broadcastSession(SwarmSession session, RequestEvaluator reval) {
+    void broadcastSession(SwarmSession session, RequestEvaluator reval, boolean transferCacheNode) {
         log.debug("Broadcasting changed session: " + session);
         try {
             if (session.isDistributed()) {
-                SessionUpdate update = new SessionUpdate(session, reval);
+                SessionUpdate update = new SessionUpdate(session, reval, transferCacheNode);
                 adapter.send(new Message(null, address, update));
             } else {
                 session.setDistributed(true);
@@ -293,17 +303,18 @@
         String message;
         StringBuffer debugBuffer;
         NodeHandle userHandle;
+        String uid;
         byte[] cacheNode = null;
 
-        SessionUpdate(SwarmSession session, RequestEvaluator reval)
+        SessionUpdate(SwarmSession session, RequestEvaluator reval, boolean transferCacheNode)
                 throws IOException{
             this.sessionId = session.getSessionId();
             this.message = session.getMessage();
             this.debugBuffer = session.getDebugBuffer();
             this.userHandle = session.getUserHandle();
-            INode cacheNode = session.getCacheNode();
+            this.uid = session.getUID();
             // only transfer cache node if it has changed
-            if (cacheNode.lastModified() != session.previousLastMod) {
+            if (transferCacheNode) {
                 this.cacheNode = objectToBytes(session.getCacheNode(), reval);
             }
         }