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);
}
}