Refactor names of session impl classes; fix bugs; add some tests

This commit is contained in:
Jan Bartel 2016-05-18 09:54:00 +10:00
parent 89d20223a6
commit 387f433711
143 changed files with 1450 additions and 899 deletions

View File

@ -42,7 +42,7 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
import org.eclipse.jetty.server.session.AbstractSessionStore; import org.eclipse.jetty.server.session.AbstractSessionDataStore;
import org.eclipse.jetty.server.session.SessionContext; import org.eclipse.jetty.server.session.SessionContext;
import org.eclipse.jetty.server.session.SessionData; import org.eclipse.jetty.server.session.SessionData;
import org.eclipse.jetty.util.ClassLoadingObjectInputStream; import org.eclipse.jetty.util.ClassLoadingObjectInputStream;
@ -51,11 +51,11 @@ import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger; import org.eclipse.jetty.util.log.Logger;
/** /**
* GCloudSessionStore * GCloudSessionDataStore
* *
* *
*/ */
public class GCloudSessionStore extends AbstractSessionStore public class GCloudSessionDataStore extends AbstractSessionDataStore
{ {
private final static Logger LOG = Log.getLogger("org.eclipse.jetty.server.session"); private final static Logger LOG = Log.getLogger("org.eclipse.jetty.server.session");
@ -85,7 +85,7 @@ public class GCloudSessionStore extends AbstractSessionStore
/** /**
* @see org.eclipse.jetty.server.session.AbstractSessionStore#doStart() * @see org.eclipse.jetty.server.session.AbstractSessionDataStore#doStart()
*/ */
@Override @Override
protected void doStart() throws Exception protected void doStart() throws Exception
@ -138,7 +138,7 @@ public class GCloudSessionStore extends AbstractSessionStore
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#load(java.lang.String) * @see org.eclipse.jetty.server.session.SessionDataStore#load(java.lang.String)
*/ */
@Override @Override
public SessionData load(String id) throws Exception public SessionData load(String id) throws Exception
@ -159,7 +159,7 @@ public class GCloudSessionStore extends AbstractSessionStore
} }
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#delete(java.lang.String) * @see org.eclipse.jetty.server.session.SessionDataStore#delete(java.lang.String)
*/ */
@Override @Override
public boolean delete(String id) throws Exception public boolean delete(String id) throws Exception
@ -170,7 +170,7 @@ public class GCloudSessionStore extends AbstractSessionStore
} }
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#getExpired(Set) * @see org.eclipse.jetty.server.session.SessionDataStore#getExpired(Set)
*/ */
@Override @Override
public Set<String> doGetExpired(Set<String> candidates) public Set<String> doGetExpired(Set<String> candidates)
@ -221,7 +221,7 @@ public class GCloudSessionStore extends AbstractSessionStore
} }
} }
//reconcile against ids that the SessionStore thinks are expired //reconcile against ids that the SessionDataStore thinks are expired
Set<String> tmp = new HashSet<String>(candidates); Set<String> tmp = new HashSet<String>(candidates);
tmp.removeAll(expired); tmp.removeAll(expired);
if (!tmp.isEmpty()) if (!tmp.isEmpty())
@ -264,7 +264,7 @@ public class GCloudSessionStore extends AbstractSessionStore
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#exists(java.lang.String) * @see org.eclipse.jetty.server.session.SessionDataStore#exists(java.lang.String)
*/ */
@Override @Override
public boolean exists(String id) throws Exception public boolean exists(String id) throws Exception
@ -290,7 +290,7 @@ public class GCloudSessionStore extends AbstractSessionStore
} }
/** /**
* @see org.eclipse.jetty.server.session.AbstractSessionStore#doStore(java.lang.String, org.eclipse.jetty.server.session.SessionData, long) * @see org.eclipse.jetty.server.session.AbstractSessionDataStore#doStore(java.lang.String, org.eclipse.jetty.server.session.SessionData, long)
*/ */
@Override @Override
public void doStore(String id, SessionData data, long lastSaveTime) throws Exception public void doStore(String id, SessionData data, long lastSaveTime) throws Exception
@ -431,7 +431,7 @@ public class GCloudSessionStore extends AbstractSessionStore
} }
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#isPassivating() * @see org.eclipse.jetty.server.session.SessionDataStore#isPassivating()
*/ */
@Override @Override
public boolean isPassivating() public boolean isPassivating()

View File

@ -59,11 +59,11 @@ public class GCloudSessionTester
webapp.setContextPath("/"); webapp.setContextPath("/");
webapp.setWar("../../jetty-distribution/target/distribution/demo-base/webapps/test.war"); webapp.setWar("../../jetty-distribution/target/distribution/demo-base/webapps/test.war");
webapp.addAliasCheck(new AllowSymLinkAliasChecker()); webapp.addAliasCheck(new AllowSymLinkAliasChecker());
GCloudSessionStore ds = new GCloudSessionStore(); GCloudSessionDataStore ds = new GCloudSessionDataStore();
ds.setGCloudConfiguration(config); ds.setGCloudConfiguration(config);
DefaultSessionCache ss = new DefaultSessionCache(webapp.getSessionHandler()); DefaultSessionCache ss = new DefaultSessionCache(webapp.getSessionHandler());
webapp.getSessionHandler().setSessionStore(ss); webapp.getSessionHandler().setSessionCache(ss);
ss.setSessionStore(ds); ss.setSessionDataStore(ds);
webapp.getSessionHandler().setSessionIdManager(idmgr); webapp.getSessionHandler().setSessionIdManager(idmgr);
// A WebAppContext is a ContextHandler as well so it needs to be set to // A WebAppContext is a ContextHandler as well so it needs to be set to

View File

@ -25,18 +25,18 @@ import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
import org.eclipse.jetty.server.SessionIdManager; import org.eclipse.jetty.server.SessionIdManager;
import org.eclipse.jetty.server.session.AbstractSessionStore; import org.eclipse.jetty.server.session.AbstractSessionDataStore;
import org.eclipse.jetty.server.session.SessionData; import org.eclipse.jetty.server.session.SessionData;
import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger; import org.eclipse.jetty.util.log.Logger;
import org.infinispan.commons.api.BasicCache; import org.infinispan.commons.api.BasicCache;
/** /**
* InfinispanSessionStore * InfinispanSessionDataStore
* *
* *
*/ */
public class InfinispanSessionStore extends AbstractSessionStore public class InfinispanSessionDataStore extends AbstractSessionDataStore
{ {
private final static Logger LOG = Log.getLogger("org.eclipse.jetty.server.session"); private final static Logger LOG = Log.getLogger("org.eclipse.jetty.server.session");
@ -76,7 +76,7 @@ public class InfinispanSessionStore extends AbstractSessionStore
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#load(String) * @see org.eclipse.jetty.server.session.SessionDataStore#load(String)
*/ */
@Override @Override
public SessionData load(String id) throws Exception public SessionData load(String id) throws Exception
@ -114,7 +114,7 @@ public class InfinispanSessionStore extends AbstractSessionStore
} }
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#delete(String) * @see org.eclipse.jetty.server.session.SessionDataStore#delete(String)
*/ */
@Override @Override
public boolean delete(String id) throws Exception public boolean delete(String id) throws Exception
@ -125,7 +125,7 @@ public class InfinispanSessionStore extends AbstractSessionStore
} }
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#getExpired(Set) * @see org.eclipse.jetty.server.session.SessionDataStore#getExpired(Set)
*/ */
@Override @Override
public Set<String> doGetExpired(Set<String> candidates) public Set<String> doGetExpired(Set<String> candidates)
@ -138,7 +138,7 @@ public class InfinispanSessionStore extends AbstractSessionStore
Set<String> expired = new HashSet<String>(); Set<String> expired = new HashSet<String>();
//TODO if there is NOT an idle timeout set on entries in infinispan, need to check other sessions //TODO if there is NOT an idle timeout set on entries in infinispan, need to check other sessions
//that are not currently in the SessionStore (eg they've been passivated) //that are not currently in the SessionDataStore (eg they've been passivated)
for (String candidate:candidates) for (String candidate:candidates)
{ {
@ -196,7 +196,7 @@ public class InfinispanSessionStore extends AbstractSessionStore
} }
/** /**
* @see org.eclipse.jetty.server.session.AbstractSessionStore#doStore(String, SessionData, long) * @see org.eclipse.jetty.server.session.AbstractSessionDataStore#doStore(String, SessionData, long)
*/ */
@Override @Override
public void doStore(String id, SessionData data, long lastSaveTime) throws Exception public void doStore(String id, SessionData data, long lastSaveTime) throws Exception
@ -224,7 +224,7 @@ public class InfinispanSessionStore extends AbstractSessionStore
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#isPassivating() * @see org.eclipse.jetty.server.session.SessionDataStore#isPassivating()
*/ */
@Override @Override
public boolean isPassivating() public boolean isPassivating()
@ -248,7 +248,7 @@ public class InfinispanSessionStore extends AbstractSessionStore
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#exists(java.lang.String) * @see org.eclipse.jetty.server.session.SessionDataStore#exists(java.lang.String)
*/ */
@Override @Override
public boolean exists(String id) throws Exception public boolean exists(String id) throws Exception

View File

@ -19,17 +19,17 @@
package org.eclipse.jetty.session.infinispan; package org.eclipse.jetty.session.infinispan;
import org.eclipse.jetty.server.session.AbstractSessionStoreFactory; import org.eclipse.jetty.server.session.AbstractSessionDataStoreFactory;
import org.eclipse.jetty.server.session.SessionHandler; import org.eclipse.jetty.server.session.SessionHandler;
import org.eclipse.jetty.server.session.SessionStore; import org.eclipse.jetty.server.session.SessionDataStore;
import org.infinispan.commons.api.BasicCache; import org.infinispan.commons.api.BasicCache;
/** /**
* InfinispanSessionStoreFactory * InfinispanSessionDataStoreFactory
* *
* *
*/ */
public class InfinispanSessionStoreFactory extends AbstractSessionStoreFactory public class InfinispanSessionDataStoreFactory extends AbstractSessionDataStoreFactory
{ {
int _infinispanIdleTimeoutSec; int _infinispanIdleTimeoutSec;
BasicCache<String, Object> _cache; BasicCache<String, Object> _cache;
@ -52,12 +52,12 @@ public class InfinispanSessionStoreFactory extends AbstractSessionStoreFactory
} }
/** /**
* @see org.eclipse.jetty.server.session.SessionStoreFactory#getSessionStore(org.eclipse.jetty.server.session.SessionHandler) * @see org.eclipse.jetty.server.session.SessionDataStoreFactory#getSessionDataStore(org.eclipse.jetty.server.session.SessionHandler)
*/ */
@Override @Override
public SessionStore getSessionStore (SessionHandler handler) throws Exception public SessionDataStore getSessionDataStore (SessionHandler handler) throws Exception
{ {
InfinispanSessionStore store = new InfinispanSessionStore(); InfinispanSessionDataStore store = new InfinispanSessionDataStore();
store.setGracePeriodSec(getGracePeriodSec()); store.setGracePeriodSec(getGracePeriodSec());
store.setInfinispanIdleTimeoutSec(getInfinispanIdleTimeoutSec()); store.setInfinispanIdleTimeoutSec(getInfinispanIdleTimeoutSec());
store.setCache(getCache()); store.setCache(getCache());

View File

@ -22,16 +22,16 @@ package org.eclipse.jetty.nosql;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import org.eclipse.jetty.server.session.AbstractSessionStore; import org.eclipse.jetty.server.session.AbstractSessionDataStore;
import org.eclipse.jetty.server.session.SessionData; import org.eclipse.jetty.server.session.SessionData;
/** /**
* NoSqlSessionStore * NoSqlSessionDataStore
* *
* *
*/ */
public abstract class NoSqlSessionStore extends AbstractSessionStore public abstract class NoSqlSessionDataStore extends AbstractSessionDataStore
{ {
public class NoSqlSessionData extends SessionData public class NoSqlSessionData extends SessionData

View File

@ -24,6 +24,7 @@ import com.mongodb.DBCollection;
import com.mongodb.DBCursor; import com.mongodb.DBCursor;
import com.mongodb.DBObject; import com.mongodb.DBObject;
import com.mongodb.WriteConcern; import com.mongodb.WriteConcern;
import com.mongodb.WriteResult;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
@ -36,14 +37,14 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
import org.eclipse.jetty.nosql.NoSqlSessionStore; import org.eclipse.jetty.nosql.NoSqlSessionDataStore;
import org.eclipse.jetty.server.session.SessionData; import org.eclipse.jetty.server.session.SessionData;
import org.eclipse.jetty.util.ClassLoadingObjectInputStream; import org.eclipse.jetty.util.ClassLoadingObjectInputStream;
import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger; import org.eclipse.jetty.util.log.Logger;
/** /**
* MongoSessionStore * MongoSessionDataStore
* *
* The document model is an outer object that contains the elements: * The document model is an outer object that contains the elements:
* <ul> * <ul>
@ -88,7 +89,7 @@ import org.eclipse.jetty.util.log.Logger;
* <code>"context".unique_context_name.attribute_name</code> * <code>"context".unique_context_name.attribute_name</code>
* Eg <code>"context"."::/contextA"."A"</code> * Eg <code>"context"."::/contextA"."A"</code>
*/ */
public class MongoSessionStore extends NoSqlSessionStore public class MongoSessionDataStore extends NoSqlSessionDataStore
{ {
private final static Logger LOG = Log.getLogger("org.eclipse.jetty.server.session"); private final static Logger LOG = Log.getLogger("org.eclipse.jetty.server.session");
@ -166,7 +167,7 @@ public class MongoSessionStore extends NoSqlSessionStore
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#load(String) * @see org.eclipse.jetty.server.session.SessionDataStore#load(String)
*/ */
@Override @Override
public SessionData load(String id) throws Exception public SessionData load(String id) throws Exception
@ -258,7 +259,7 @@ public class MongoSessionStore extends NoSqlSessionStore
} }
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#delete(String) * @see org.eclipse.jetty.server.session.SessionDataStore#delete(String)
*/ */
@Override @Override
public boolean delete(String id) throws Exception public boolean delete(String id) throws Exception
@ -272,7 +273,8 @@ public class MongoSessionStore extends NoSqlSessionStore
*/ */
BasicDBObject mongoKey = new BasicDBObject(__ID, id); BasicDBObject mongoKey = new BasicDBObject(__ID, id);
DBObject sessionDocument = _dbSessions.findOne(mongoKey,_version_1); //DBObject sessionDocument = _dbSessions.findOne(mongoKey,_version_1);
DBObject sessionDocument = _dbSessions.findOne(new BasicDBObject(__ID, id));
if (sessionDocument != null) if (sessionDocument != null)
{ {
@ -280,7 +282,7 @@ public class MongoSessionStore extends NoSqlSessionStore
if (c == null) if (c == null)
{ {
//delete whole doc //delete whole doc
_dbSessions.remove(mongoKey); _dbSessions.remove(mongoKey, WriteConcern.SAFE);
return false; return false;
} }
@ -288,14 +290,14 @@ public class MongoSessionStore extends NoSqlSessionStore
if (contexts.isEmpty()) if (contexts.isEmpty())
{ {
//delete whole doc //delete whole doc
_dbSessions.remove(mongoKey); _dbSessions.remove(mongoKey, WriteConcern.SAFE);
return false; return false;
} }
if (contexts.size() == 1 && contexts.iterator().next().equals(getCanonicalContextId())) if (contexts.size() == 1 && contexts.iterator().next().equals(getCanonicalContextId()))
{ {
//delete whole doc //delete whole doc
_dbSessions.remove(mongoKey); _dbSessions.remove(new BasicDBObject(__ID, id), WriteConcern.SAFE);
return true; return true;
} }
@ -304,8 +306,7 @@ public class MongoSessionStore extends NoSqlSessionStore
BasicDBObject unsets = new BasicDBObject(); BasicDBObject unsets = new BasicDBObject();
unsets.put(getContextField(),1); unsets.put(getContextField(),1);
remove.put("$unset",unsets); remove.put("$unset",unsets);
_dbSessions.update(mongoKey,remove,false,false,WriteConcern.SAFE); WriteResult result = _dbSessions.update(mongoKey,remove,false,false,WriteConcern.SAFE);
return true; return true;
} }
else else
@ -318,7 +319,7 @@ public class MongoSessionStore extends NoSqlSessionStore
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#exists(java.lang.String) * @see org.eclipse.jetty.server.session.SessionDataStore#exists(java.lang.String)
*/ */
@Override @Override
public boolean exists(String id) throws Exception public boolean exists(String id) throws Exception
@ -345,7 +346,7 @@ public class MongoSessionStore extends NoSqlSessionStore
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#getExpired(Set) * @see org.eclipse.jetty.server.session.SessionDataStore#getExpired(Set)
*/ */
@Override @Override
public Set<String> doGetExpired(Set<String> candidates) public Set<String> doGetExpired(Set<String> candidates)
@ -409,7 +410,7 @@ public class MongoSessionStore extends NoSqlSessionStore
} }
/** /**
* @see org.eclipse.jetty.server.session.AbstractSessionStore#doStore(String, SessionData, long) * @see org.eclipse.jetty.server.session.AbstractSessionDataStore#doStore(String, SessionData, long)
*/ */
@Override @Override
public void doStore(String id, SessionData data, long lastSaveTime) throws Exception public void doStore(String id, SessionData data, long lastSaveTime) throws Exception
@ -492,12 +493,9 @@ public class MongoSessionStore extends NoSqlSessionStore
update.put("$set",sets); update.put("$set",sets);
if (!unsets.isEmpty()) if (!unsets.isEmpty())
update.put("$unset",unsets); update.put("$unset",unsets);
WriteResult res = _dbSessions.update(key,update,upsert,false,WriteConcern.SAFE);
_dbSessions.update(key,update,upsert,false,WriteConcern.SAFE);
if (LOG.isDebugEnabled()) if (LOG.isDebugEnabled())
LOG.debug("Save:db.sessions.update( {}, {} )", key, update); LOG.debug("Save:db.sessions.update( {}, {},{} )", key, update, res);
} }
@ -648,7 +646,7 @@ public class MongoSessionStore extends NoSqlSessionStore
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#isPassivating() * @see org.eclipse.jetty.server.session.SessionDataStore#isPassivating()
*/ */
@Override @Override
public boolean isPassivating() public boolean isPassivating()

View File

@ -21,20 +21,20 @@ package org.eclipse.jetty.nosql.mongodb;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import org.eclipse.jetty.server.session.AbstractSessionStoreFactory; import org.eclipse.jetty.server.session.AbstractSessionDataStoreFactory;
import org.eclipse.jetty.server.session.SessionHandler; import org.eclipse.jetty.server.session.SessionHandler;
import org.eclipse.jetty.server.session.SessionStore; import org.eclipse.jetty.server.session.SessionDataStore;
import com.mongodb.Mongo; import com.mongodb.Mongo;
import com.mongodb.MongoException; import com.mongodb.MongoException;
/** /**
* MongoSessionStoreFactory * MongoSessionDataStoreFactory
* *
* *
*/ */
public class MongoSessionStoreFactory extends AbstractSessionStoreFactory public class MongoSessionDataStoreFactory extends AbstractSessionDataStoreFactory
{ {
String _dbName; String _dbName;
String _collectionName; String _collectionName;
@ -76,12 +76,12 @@ public class MongoSessionStoreFactory extends AbstractSessionStoreFactory
/** /**
* @throws MongoException * @throws MongoException
* @throws UnknownHostException * @throws UnknownHostException
* @see org.eclipse.jetty.server.session.SessionStoreFactory#getSessionStore(org.eclipse.jetty.server.session.SessionHandler) * @see org.eclipse.jetty.server.session.SessionDataStoreFactory#getSessionDataStore(org.eclipse.jetty.server.session.SessionHandler)
*/ */
@Override @Override
public SessionStore getSessionStore(SessionHandler handler) throws Exception public SessionDataStore getSessionDataStore(SessionHandler handler) throws Exception
{ {
MongoSessionStore store = new MongoSessionStore(); MongoSessionDataStore store = new MongoSessionDataStore();
store.setGracePeriodSec(getGracePeriodSec()); store.setGracePeriodSec(getGracePeriodSec());
store.setDBCollection(new Mongo().getDB(getDbName()).getCollection(getCollectionName())); store.setDBCollection(new Mongo().getDB(getDbName()).getCollection(getCollectionName()));
return store; return store;

View File

@ -9,7 +9,7 @@
<!-- ===================================================================== --> <!-- ===================================================================== -->
<Call name="addBean"> <Call name="addBean">
<Arg> <Arg>
<New class="org.eclipse.jetty.server.session.FileSessionStoreFactory"> <New class="org.eclipse.jetty.server.session.FileSessionDataStoreFactory">
<Set name="deleteUnrestorableFiles"><Property name="jetty.session.deleteUnrestorableFiles" default="false" /></Set> <Set name="deleteUnrestorableFiles"><Property name="jetty.session.deleteUnrestorableFiles" default="false" /></Set>
<Set name="storeDir"><Property name="jetty.session.storeDir"/></Set> <Set name="storeDir"><Property name="jetty.session.storeDir"/></Set>
</New> </New>

View File

@ -9,7 +9,7 @@
<!-- ===================================================================== --> <!-- ===================================================================== -->
<Call name="addBean"> <Call name="addBean">
<Arg> <Arg>
<New class="org.eclipse.jetty.server.session.JDBCSessionStoreFactory"> <New class="org.eclipse.jetty.server.session.JDBCSessionDataStoreFactory">
<Set name="gracePeriod"><Property name="jetty.session.gracePeriod.seconds" default="3600" /></Set> <Set name="gracePeriod"><Property name="jetty.session.gracePeriod.seconds" default="3600" /></Set>
<Set name="loadAttempts"><Property name="jetty.session.loadAttempts" default="-1" /></Set> <Set name="loadAttempts"><Property name="jetty.session.loadAttempts" default="-1" /></Set>
<Set name="deleteUnloadables"><Property name="jetty.session.deleteUnloadables" default="false" /></Set> <Set name="deleteUnloadables"><Property name="jetty.session.deleteUnloadables" default="false" /></Set>
@ -18,7 +18,7 @@
</Set> </Set>
<Set name="sessionTableSchema"> <Set name="sessionTableSchema">
<New <New
class="org.eclipse.jetty.server.session.JDBCSessionStore.SessionTableSchema"> class="org.eclipse.jetty.server.session.JDBCSessionDataStore.SessionTableSchema">
<Set name="accessTimeColumn"> <Set name="accessTimeColumn">
<Property name="jetty.sessionTableSchema.accessTimeColumn" default="accessTime" /> <Property name="jetty.sessionTableSchema.accessTimeColumn" default="accessTime" />
</Set> </Set>

View File

@ -191,7 +191,6 @@ public class Request implements HttpServletRequest
private String _readerEncoding; private String _readerEncoding;
private InetSocketAddress _remote; private InetSocketAddress _remote;
private String _requestedSessionId; private String _requestedSessionId;
private Map<Object, HttpSession> _savedNewSessions;
private UserIdentity.Scope _scope; private UserIdentity.Scope _scope;
private HttpSession _session; private HttpSession _session;
private SessionHandler _sessionHandler; private SessionHandler _sessionHandler;
@ -1716,13 +1715,6 @@ public class Request implements HttpServletRequest
return false; return false;
} }
/* ------------------------------------------------------------ */
public HttpSession recoverNewSession(Object key)
{
if (_savedNewSessions == null)
return null;
return _savedNewSessions.get(key);
}
/* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */
/** /**
@ -1840,10 +1832,6 @@ public class Request implements HttpServletRequest
_parameters = null; _parameters = null;
_paramsExtracted = false; _paramsExtracted = false;
_inputState = __NONE; _inputState = __NONE;
if (_savedNewSessions != null)
_savedNewSessions.clear();
_savedNewSessions=null;
_multiPartInputStream = null; _multiPartInputStream = null;
_remote=null; _remote=null;
_input.recycle(); _input.recycle();
@ -1875,13 +1863,6 @@ public class Request implements HttpServletRequest
_requestAttributeListeners.remove(listener); _requestAttributeListeners.remove(listener);
} }
/* ------------------------------------------------------------ */
public void saveNewSession(Object key, HttpSession session)
{
if (_savedNewSessions == null)
_savedNewSessions = new HashMap<>();
_savedNewSessions.put(key,session);
}
/* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */
public void setAsyncSupported(boolean supported,String source) public void setAsyncSupported(boolean supported,String source)

View File

@ -33,19 +33,57 @@ import org.eclipse.jetty.util.thread.Locker.Lock;
/** /**
* AbstractSessionCache * AbstractSessionCache
* *
* Basic behaviour for maintaining an in-memory store of Session objects and * A base implementation of the SessionCache interface for managing a set of
* making sure that any backing SessionDataStore is kept in sync. * Session objects pertaining to a context in memory.
*
* This implementation ensures that multiple requests for the same session id
* always return the same Session object.
*
* It will delay writing out a session to the SessionDataStore until the
* last request exists the session. If the SessionDataStore supports passivation
* then the session passivation and activation listeners are called appropriately as
* the session is written. Additionally the session can be evicted from the
* AbstractSessionCache after passivation on write.
*
* This implementation also supports evicting idle Session objects. An idle Session
* is one that is still valid, has not expired, but has not been accessed by a
* request for a configurable amount of time. An idle session will be first
* passivated before eviction from the cache.
*
*/ */
public abstract class AbstractSessionCache extends AbstractLifeCycle implements SessionCache public abstract class AbstractSessionCache extends AbstractLifeCycle implements SessionCache
{ {
final static Logger LOG = Log.getLogger("org.eclipse.jetty.server.session"); final static Logger LOG = Log.getLogger("org.eclipse.jetty.server.session");
protected SessionStore _sessionStore; /**
protected final SessionHandler _handler; * The authoritative source of session data
protected SessionContext _context; */
protected int _idlePassivationTimeoutSec; protected SessionDataStore _sessionDataStore;
private boolean _passivateOnComplete;
/**
* The SessionHandler related to this SessionCache
*/
protected final SessionHandler _handler;
/**
* Information about the context to which this SessionCache pertains
*/
protected SessionContext _context;
/**
* When, if ever, to evict sessions: never; only when the last request for them finishes; after inactivity time (expressed as secs)
*/
protected int _evictionPolicy;
/**
* If true, a session that will be evicted from the cache because it has been
* inactive too long will be saved before being evicted.
*/
protected boolean _saveOnInactiveEviction;
/** /**
* Create a new Session object from pre-existing session data * Create a new Session object from pre-existing session data
@ -115,7 +153,7 @@ public abstract class AbstractSessionCache extends AbstractLifeCycle implements
*/ */
public PlaceHolderSession(SessionData data) public PlaceHolderSession(SessionData data)
{ {
super(data); super(null, data);
} }
} }
@ -124,9 +162,9 @@ public abstract class AbstractSessionCache extends AbstractLifeCycle implements
/** /**
* *
*/ */
public AbstractSessionCache (SessionHandler manager) public AbstractSessionCache (SessionHandler handler)
{ {
_handler = manager; _handler = handler;
} }
@ -157,7 +195,7 @@ public abstract class AbstractSessionCache extends AbstractLifeCycle implements
@Override @Override
protected void doStart() throws Exception protected void doStart() throws Exception
{ {
if (_sessionStore == null) if (_sessionDataStore == null)
throw new IllegalStateException ("No session data store configured"); throw new IllegalStateException ("No session data store configured");
if (_handler == null) if (_handler == null)
@ -166,8 +204,8 @@ public abstract class AbstractSessionCache extends AbstractLifeCycle implements
if (_context == null) if (_context == null)
throw new IllegalStateException ("No ContextId"); throw new IllegalStateException ("No ContextId");
_sessionStore.initialize(_context); _sessionDataStore.initialize(_context);
_sessionStore.start(); _sessionDataStore.start();
super.doStart(); super.doStart();
@ -179,50 +217,51 @@ public abstract class AbstractSessionCache extends AbstractLifeCycle implements
@Override @Override
protected void doStop() throws Exception protected void doStop() throws Exception
{ {
_sessionStore.stop(); _sessionDataStore.stop();
super.doStop(); super.doStop();
} }
/** /**
* @return the SessionStore or null if there isn't one * @return the SessionDataStore or null if there isn't one
*/ */
public SessionStore getSessionStore() public SessionDataStore getSessionDataStore()
{ {
return _sessionStore; return _sessionDataStore;
} }
/** /**
* @see org.eclipse.jetty.server.session.SessionCache#setSessionStore(org.eclipse.jetty.server.session.SessionStore) * @see org.eclipse.jetty.server.session.SessionCache#setSessionDataStore(org.eclipse.jetty.server.session.SessionDataStore)
*/ */
public void setSessionStore(SessionStore sessionStore) public void setSessionDataStore(SessionDataStore sessionStore)
{ {
_sessionStore = sessionStore; _sessionDataStore = sessionStore;
} }
/**
* @see org.eclipse.jetty.server.session.SessionCache#getIdlePassivationTimeoutSec()
*/
public int getIdlePassivationTimeoutSec()
{
return _idlePassivationTimeoutSec;
}
/** /**
* @see org.eclipse.jetty.server.session.SessionCache#setIdlePassivationTimeoutSec(int) * @see org.eclipse.jetty.server.session.SessionCache#getEvictionPolicy()
*/ */
public void setIdlePassivationTimeoutSec(int idleTimeoutSec) public int getEvictionPolicy()
{ {
_idlePassivationTimeoutSec = idleTimeoutSec; return _evictionPolicy;
} }
/**
* -1 means we never evict inactive sessions.
* 0 means we evict a session after the last request for it exits
* >0 is the number of seconds after which we evict inactive sessions from the cache
*
* @see org.eclipse.jetty.server.session.SessionCache#setEvictionPolicy(int)
*/
public void setEvictionPolicy(int evictionTimeout)
{
_evictionPolicy = evictionTimeout;
}
/** /**
@ -244,14 +283,14 @@ public abstract class AbstractSessionCache extends AbstractLifeCycle implements
{ {
session = doGet(id); session = doGet(id);
if (_sessionStore == null) if (_sessionDataStore == null)
break; //can't load any session data so just return null or the session object break; //can't load any session data so just return null or the session object
if (session == null) if (session == null)
{ {
if (LOG.isDebugEnabled()) if (LOG.isDebugEnabled())
LOG.debug("Session not found locally, attempting to load"); LOG.debug("Session {} not found locally, attempting to load", id);
//didn't get a session, try and create one and put in a placeholder for it //didn't get a session, try and create one and put in a placeholder for it
PlaceHolderSession phs = new PlaceHolderSession (new SessionData(id, null, null,0,0,0,0)); PlaceHolderSession phs = new PlaceHolderSession (new SessionData(id, null, null,0,0,0,0));
Lock phsLock = phs.lock(); Lock phsLock = phs.lock();
@ -286,7 +325,8 @@ public abstract class AbstractSessionCache extends AbstractLifeCycle implements
else else
{ {
//successfully swapped in the session //successfully swapped in the session
session.setTimeout (); //TODO start the session timer session.setResident(true);
session.updateInactivityTimer();
phsLock.close(); phsLock.close();
break; break;
} }
@ -307,8 +347,8 @@ public abstract class AbstractSessionCache extends AbstractLifeCycle implements
phsLock.close(); phsLock.close();
try (Lock lock = s.lock()) try (Lock lock = s.lock())
{ {
//is it a placeholder? or is it passivated? In both cases, chuck it away and start again //is it a placeholder? or is a non-resident session? In both cases, chuck it away and start again
if (s.isPassivated() || s instanceof PlaceHolderSession) if (!s.isResident() || s instanceof PlaceHolderSession)
{ {
session = null; session = null;
continue; continue;
@ -323,14 +363,14 @@ public abstract class AbstractSessionCache extends AbstractLifeCycle implements
{ {
//check the session returned //check the session returned
try (Lock lock = session.lock()) try (Lock lock = session.lock())
{ {
//is it a placeholder? or is it passivated? In both cases, chuck it away and start again //is it a placeholder? or is it passivated? In both cases, chuck it away and start again
if (session.isPassivated() || session instanceof PlaceHolderSession) if (!session.isResident()|| session instanceof PlaceHolderSession)
{ {
session = null; session = null;
continue; continue;
} }
//got the session //got the session
break; break;
} }
@ -355,24 +395,23 @@ public abstract class AbstractSessionCache extends AbstractLifeCycle implements
SessionData data = null; SessionData data = null;
Session session = null; Session session = null;
if (_sessionStore == null) if (_sessionDataStore == null)
return null; //can't load it return null; //can't load it
try try
{ {
data =_sessionStore.load(id); data =_sessionDataStore.load(id);
if (data == null) //session doesn't exist if (data == null) //session doesn't exist
return null; return null;
session = newSession(data); session = newSession(data);
session.setSessionHandler(_handler);
return session; return session;
} }
catch (UnreadableSessionDataException e) catch (UnreadableSessionDataException e)
{ {
//can't load the session, delete it //can't load the session, delete it
_sessionStore.delete(id); _sessionDataStore.delete(id);
throw e; throw e;
} }
} }
@ -380,10 +419,15 @@ public abstract class AbstractSessionCache extends AbstractLifeCycle implements
/** /**
* Put the Session object back into the session store. * Put the Session object back into the session store.
* *
* This should be called by Session.complete when a request exists the session. * This should be called when a request exists the session. Only when the last
* simultaneous request exists the session will any action be taken.
* *
* If the session manager supports a session data store, write the * If there is a SessionDataStore write the session data through to it.
* session data through to the session data store. *
* If the SessionDataStore supports passivation, call the passivate/active listeners.
*
* If the evictionPolicy == SessionCache.EVICT_ON_SESSION_EXIT then after we have saved
* the session, we evict it from the cache.
* *
* @see org.eclipse.jetty.server.session.SessionCache#put(java.lang.String, org.eclipse.jetty.server.session.Session) * @see org.eclipse.jetty.server.session.SessionCache#put(java.lang.String, org.eclipse.jetty.server.session.Session)
*/ */
@ -393,55 +437,71 @@ public abstract class AbstractSessionCache extends AbstractLifeCycle implements
if (id == null || session == null) if (id == null || session == null)
throw new IllegalArgumentException ("Put key="+id+" session="+(session==null?"null":session.getId())); throw new IllegalArgumentException ("Put key="+id+" session="+(session==null?"null":session.getId()));
//if the session is new or data has changed write it to any backing store
try (Lock lock = session.lock()) try (Lock lock = session.lock())
{ {
session.setSessionHandler(_handler); if (session.getSessionHandler() == null)
throw new IllegalStateException("Session "+id+" is not managed");
if (session.isPassivated())
throw new IllegalStateException ("Session "+id+" is passivated and cannot be saved");
if (!session.isValid()) if (!session.isValid())
return; return;
if (_sessionStore == null) if (_sessionDataStore == null)
{ {
doPutIfAbsent(id, session); //ensure it is in our map session.setResident(true);
if (doPutIfAbsent(id, session) == null) //ensure it is in our map
session.updateInactivityTimer();
return; return;
} }
//don't do anything with the session until the last request for it has finished
if ((session.getRequests() <= 0)) if ((session.getRequests() <= 0))
{ {
//only save if all requests have finished //save the session
if (!_sessionStore.isPassivating()) if (!_sessionDataStore.isPassivating())
{ {
//if our backing datastore isn't the passivating kind, just save the session //if our backing datastore isn't the passivating kind, just save the session
_sessionStore.store(id, session.getSessionData()); _sessionDataStore.store(id, session.getSessionData());
//if we evict on session exit, boot it from the cache
if (getEvictionPolicy() == EVICT_ON_SESSION_EXIT)
{
doDelete(session.getId());
session.setResident(false);
}
else
{
session.setResident(true);
if (doPutIfAbsent(id,session) == null) //ensure it is in our map
session.updateInactivityTimer();
}
} }
else else
{ {
//backing store supports passivation //backing store supports passivation, call the listeners
session.willPassivate(); session.willPassivate();
_sessionStore.store(id, session.getSessionData()); _sessionDataStore.store(id, session.getSessionData());
session.setPassivated();
if (isPassivateOnComplete()) if (getEvictionPolicy() == EVICT_ON_SESSION_EXIT)
{ {
//throw out the passivated session object from the map //throw out the passivated session object from the map
doDelete(id); doDelete(id);
session.setResident(false);
} }
else else
{ {
//reactivate the session //reactivate the session
session.setActive(); session.didActivate();
session.didActivate(); session.setResident(true);
if (doPutIfAbsent(id,session) == null) //ensure it is in our map
session.updateInactivityTimer();
} }
} }
} }
else
doPutIfAbsent(id,session); //ensure it is in our map {
session.setResident(true);
if (doPutIfAbsent(id, session) == null) //ensure it is the map, but don't save it to the backing store until the last request exists
session.updateInactivityTimer();
}
} }
} }
@ -470,7 +530,7 @@ public abstract class AbstractSessionCache extends AbstractLifeCycle implements
} }
//not there, so find out if session data exists for it //not there, so find out if session data exists for it
return _sessionStore.exists (id); return _sessionDataStore.exists (id);
} }
@ -486,16 +546,21 @@ public abstract class AbstractSessionCache extends AbstractLifeCycle implements
//get the session, if its not in memory, this will load it //get the session, if its not in memory, this will load it
Session session = get(id); Session session = get(id);
//Always delete it from the backing data store //Always delete it from the backing data store
if (_sessionStore != null) if (_sessionDataStore != null)
{ {
boolean dsdel = _sessionStore.delete(id);
boolean dsdel = _sessionDataStore.delete(id);
if (LOG.isDebugEnabled()) LOG.debug("Session {} deleted in db {}",id, dsdel); if (LOG.isDebugEnabled()) LOG.debug("Session {} deleted in db {}",id, dsdel);
} }
//delete it from the session object store //delete it from the session object store
if (session != null) if (session != null)
session.stopTimeout(); {
session.stopInactivityTimer();
session.setResident(false);
}
return doDelete(id); return doDelete(id);
} }
@ -515,70 +580,64 @@ public abstract class AbstractSessionCache extends AbstractLifeCycle implements
return Collections.emptySet(); return Collections.emptySet();
if (LOG.isDebugEnabled()) if (LOG.isDebugEnabled())
LOG.debug("SessionStore checking expiration on {}", candidates); LOG.debug("SessionDataStore checking expiration on {}", candidates);
return _sessionStore.getExpired(candidates); return _sessionDataStore.getExpired(candidates);
} }
/** /**
* If the SessionDataStore supports passivation, * Check a session for being inactive and
* write the session to the backing data store. * thus being able to be evicted, if eviction
* is enabled.
* *
* @param id identity of session to passivate *
* @param session
*/ */
@Override public void checkInactiveSession (Session session)
public void passivateIdleSession(String id)
{ {
if (!isStarted()) if (session == null)
return; return;
if (_sessionStore == null || !_sessionStore.isPassivating())
return; //no data store to passivate or it doesn't passivate
//get the session locally try (Lock s = session.lock())
Session s = doGet(id);
if (s == null)
{ {
LOG.warn("Session {} not in this session store", s); if (getEvictionPolicy() > 0 && session.isIdleLongerThan(getEvictionPolicy()) && session.isValid() && session.isResident() && session.getRequests() <= 0)
return; {
} //Be careful with saveOnInactiveEviction - you may be able to re-animate a session that was
//being managed on another node and has expired.
//lock the session during passivation
try (Lock lock = s.lock())
{
//check the session is still idle and that it doesn't have requests using it
if (s.isValid() && s.isIdleLongerThan(_idlePassivationTimeoutSec) && s.isActive() && (s.getRequests() <= 0))
{
//TODO - do we need to check that the session exists in the session data store
//before we passivate it? If it doesn't exist, we can assume another node
//invalidated it. If the session was new, it shouldn't have been idle passivated.
try try
{ {
if (LOG.isDebugEnabled()) if (LOG.isDebugEnabled())
LOG.debug("Passivating idle session {}", id); LOG.debug("Evicting idle session {}", session.getId());
s.willPassivate();
_sessionStore.store(id, s.getSessionData()); //save before evicting
s.setPassivated(); if (isSaveOnInactiveEviction() && _sessionDataStore != null)
s.stopTimeout(); {
doDelete(id); //Take the session object of this session store if (_sessionDataStore.isPassivating())
session.willPassivate();
_sessionDataStore.store(session.getId(), session.getSessionData());
}
//evict
// session.stopInactivityTimer();
doDelete(session.getId()); //detach from this cache
session.setResident(false);
} }
catch (Exception e) catch (Exception e)
{ {
LOG.warn("Passivation of idle session {} failed", id, e); LOG.warn("Passivation of idle session {} failed", session.getId(), e);
s.setPassivated(); //set it as passivated so it can't be used doDelete(session.getId()); //detach it
doDelete(id); //detach it session.setResident(false);
} }
} }
} }
} }
/** /**
@ -604,10 +663,10 @@ public abstract class AbstractSessionCache extends AbstractLifeCycle implements
session.getSessionData().setDirty(true); //ensure we will try to write the session out session.getSessionData().setDirty(true); //ensure we will try to write the session out
doPutIfAbsent(newId, session); //put the new id into our map doPutIfAbsent(newId, session); //put the new id into our map
doDelete (oldId); //take old out of map doDelete (oldId); //take old out of map
if (_sessionStore != null) if (_sessionDataStore != null)
{ {
_sessionStore.delete(oldId); //delete the session data with the old id _sessionDataStore.delete(oldId); //delete the session data with the old id
_sessionStore.store(newId, session.getSessionData()); //save the session data with the new id _sessionDataStore.store(newId, session.getSessionData()); //save the session data with the new id
} }
LOG.info("Session id {} swapped for new id {}", oldId, newId); LOG.info("Session id {} swapped for new id {}", oldId, newId);
return session; return session;
@ -615,25 +674,37 @@ public abstract class AbstractSessionCache extends AbstractLifeCycle implements
} }
public void setPassivateOnComplete (boolean passivateOnComplete) /**
* @see org.eclipse.jetty.server.session.SessionCache#setSaveOnInactiveEviction(boolean)
*/
@Override
public void setSaveOnInactiveEviction (boolean saveOnEvict)
{ {
_passivateOnComplete = passivateOnComplete; _saveOnInactiveEviction = saveOnEvict;
} }
public boolean isPassivateOnComplete () /**
* Whether we should save a session that has been inactive before
* we boot it from the cache.
*
* @return true if an inactive session will be saved before being evicted
*/
@Override
public boolean isSaveOnInactiveEviction ()
{ {
return _passivateOnComplete; return _saveOnInactiveEviction;
} }
/** /**
* @see org.eclipse.jetty.server.session.SessionCache#newSession(javax.servlet.http.HttpServletRequest, java.lang.String, long, long) * @see org.eclipse.jetty.server.session.SessionCache#newSession(javax.servlet.http.HttpServletRequest, java.lang.String, long, long)
*/ */
@Override @Override
public Session newSession(HttpServletRequest request, String id, long time, long maxInactiveMs) public Session newSession(HttpServletRequest request, String id, long time, long maxInactiveMs)
{ {
Session session = newSession(request, _sessionStore.newSessionData(id, time, time, time, maxInactiveMs)); if (LOG.isDebugEnabled()) LOG.debug("Creating new session id="+id);
session.setSessionHandler(_handler); Session session = newSession(request, _sessionDataStore.newSessionData(id, time, time, time, maxInactiveMs));
return session; return session;
} }
} }

View File

@ -25,11 +25,11 @@ import java.util.Set;
import org.eclipse.jetty.util.component.AbstractLifeCycle; import org.eclipse.jetty.util.component.AbstractLifeCycle;
/** /**
* AbstractSessionStore * AbstractSessionDataStore
* *
* *
*/ */
public abstract class AbstractSessionStore extends AbstractLifeCycle implements SessionStore public abstract class AbstractSessionDataStore extends AbstractLifeCycle implements SessionDataStore
{ {
protected SessionContext _context; //context associated with this session data store protected SessionContext _context; //context associated with this session data store
protected int _gracePeriodSec = 60 * 60; //default of 1hr protected int _gracePeriodSec = 60 * 60; //default of 1hr
@ -51,14 +51,14 @@ public abstract class AbstractSessionStore extends AbstractLifeCycle implements
* Implemented by subclasses to resolve which sessions this node * Implemented by subclasses to resolve which sessions this node
* should attempt to expire. * should attempt to expire.
* *
* @param candidates the ids of sessions the SessionStore thinks has expired * @param candidates the ids of sessions the SessionDataStore thinks has expired
* @return the reconciled set of session ids that this node should attempt to expire * @return the reconciled set of session ids that this node should attempt to expire
*/ */
public abstract Set<String> doGetExpired (Set<String> candidates); public abstract Set<String> doGetExpired (Set<String> candidates);
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#initialize(org.eclipse.jetty.server.session.SessionContext) * @see org.eclipse.jetty.server.session.SessionDataStore#initialize(org.eclipse.jetty.server.session.SessionContext)
*/ */
public void initialize (SessionContext context) public void initialize (SessionContext context)
{ {
@ -68,7 +68,7 @@ public abstract class AbstractSessionStore extends AbstractLifeCycle implements
} }
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#store(java.lang.String, org.eclipse.jetty.server.session.SessionData) * @see org.eclipse.jetty.server.session.SessionDataStore#store(java.lang.String, org.eclipse.jetty.server.session.SessionData)
*/ */
@Override @Override
public void store(String id, SessionData data) throws Exception public void store(String id, SessionData data) throws Exception
@ -94,7 +94,7 @@ public abstract class AbstractSessionStore extends AbstractLifeCycle implements
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#getExpired(java.util.Set) * @see org.eclipse.jetty.server.session.SessionDataStore#getExpired(java.util.Set)
*/ */
@Override @Override
public Set<String> getExpired(Set<String> candidates) public Set<String> getExpired(Set<String> candidates)
@ -113,7 +113,7 @@ public abstract class AbstractSessionStore extends AbstractLifeCycle implements
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#newSessionData(java.lang.String, long, long, long, long) * @see org.eclipse.jetty.server.session.SessionDataStore#newSessionData(java.lang.String, long, long, long, long)
*/ */
@Override @Override
public SessionData newSessionData(String id, long created, long accessed, long lastAccessed, long maxInactiveMs) public SessionData newSessionData(String id, long created, long accessed, long lastAccessed, long maxInactiveMs)

View File

@ -20,11 +20,11 @@
package org.eclipse.jetty.server.session; package org.eclipse.jetty.server.session;
/** /**
* AbstractSessionStoreFactory * AbstractSessionDataStoreFactory
* *
* *
*/ */
public abstract class AbstractSessionStoreFactory implements SessionStoreFactory public abstract class AbstractSessionDataStoreFactory implements SessionDataStoreFactory
{ {
int _gracePeriodSec; int _gracePeriodSec;

View File

@ -26,43 +26,42 @@ import org.eclipse.jetty.util.component.AbstractLifeCycle;
/** /**
* CachingSessionStore * CachingSessionStore
* *
* A SessionStore is a mechanism for (persistently) storing data associated with sessions. * A SessionDataStore is a mechanism for (persistently) storing data associated with sessions.
* This implementation delegates to a pluggable SessionStore for actually storing the * This implementation delegates to a pluggable SessionDataStore for actually storing the
* session data. It also uses a pluggable cache implementation in front of the * session data. It also uses a pluggable cache implementation in front of the
* delegate SessionStore to improve performance: accessing most persistent store * delegate SessionDataStore to improve performance: accessing most persistent store
* technology can be expensive time-wise, so introducing a fronting cache * technology can be expensive time-wise, so introducing a fronting cache
* can increase performance. The cache implementation can either be a local cache, * can increase performance. The cache implementation can either be a local cache,
* a remote cache, or a clustered cache. If the cache is cluster-wide then this can * a remote cache, or a clustered cache.
* help with deployments without a sticky load balancer (but this is not ideal). *
* The implementation here will try to read first from the cache and fallback to
* reading from the SessionDataStore if the session key is not found. On writes, the
* session data is written first to the SessionDataStore, and then to the cache. On
* deletes, the data is deleted first from the SessionDataStore, and then from the
* cache. There is no transaction manager ensuring atomic operations, so it is
* possible that failures can result in cache inconsistency.
*
*/ */
public class CachingSessionStore extends AbstractLifeCycle implements SessionStore public class CachingSessionStore extends AbstractLifeCycle implements SessionDataStore
{ {
/** /**
* Cache * The actual store for the session data
*
* An interface that represents the contract with the particular cache
* implementation, eg memcache, infinispan etc
*/ */
public interface Cache protected SessionDataStore _store;
{
public SessionData get (String id); //get cached value
public boolean putIfAbsent (String id, SessionData data); //only insert if no mapping for key already
public boolean remove (String id); //remove the mapping for key, returns false if no mapping
public void put (String id, SessionData data); //overwrite or add the mapping
public void initialize(SessionContext context);
}
protected SessionStore _store; /**
protected Cache _cache; * The fronting cache
*/
protected SessionDataMap _cache;
/** /**
* @param cache * @param cache
* @param store * @param store
*/ */
public CachingSessionStore (Cache cache, SessionStore store) public CachingSessionStore (SessionDataMap cache, SessionDataStore store)
{ {
_cache = cache; _cache = cache;
_store = store; _store = store;
@ -70,9 +69,9 @@ public class CachingSessionStore extends AbstractLifeCycle implements SessionSto
/** /**
* @return * @return the delegate session store
*/ */
public SessionStore getSessionStore() public SessionDataStore getSessionStore()
{ {
return _store; return _store;
} }
@ -80,63 +79,52 @@ public class CachingSessionStore extends AbstractLifeCycle implements SessionSto
/** /**
* @return * @return the cache
*/ */
public Cache getSessionStoreCache () public SessionDataMap getCache ()
{ {
return _cache; return _cache;
} }
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#load(java.lang.String) * @see org.eclipse.jetty.server.session.SessionDataStore#load(java.lang.String)
*/ */
@Override @Override
public SessionData load(String id) throws Exception public SessionData load(String id) throws Exception
{ {
SessionData d = null;
//check to see if the session data is already in the cache //check to see if the session data is already in the cache
SessionData d = _cache.get(id); d = _cache.load(id);
if (d == null)
{
//not in the cache, go get it from the store
d = _store.load(id);
if (d != null) if (d != null)
{ return d; //cache hit
//put it into the cache, unless another thread/node has put it into the cache
boolean inserted = _cache.putIfAbsent(id, d); //cache miss - go get it from the store
if (!inserted) d = _store.load(id);
{
//some other thread/node put this data into the cache, so get it from there
SessionData d2 = _cache.get(id);
if (d2 != null)
d = d2;
//else: The cache either timed out the entry, or maybe the session data was being removed, and we're about to resurrect it!
}
}
}
return d; return d;
} }
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#delete(java.lang.String) * @see org.eclipse.jetty.server.session.SessionDataStore#delete(java.lang.String)
*/ */
@Override @Override
public boolean delete(String id) throws Exception public boolean delete(String id) throws Exception
{ {
//delete from the store and from the cache //delete from the store
boolean deleted = _store.delete(id); boolean deleted = _store.delete(id);
//and from the cache
//TODO what to do if couldn't remove from the cache? _cache.delete(id);
_cache.remove(id);
return deleted; return deleted;
} }
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#getExpired(Set) * @see org.eclipse.jetty.server.session.SessionDataStore#getExpired(Set)
*/ */
@Override @Override
public Set<String> getExpired(Set<String> candidates) public Set<String> getExpired(Set<String> candidates)
@ -145,8 +133,10 @@ public class CachingSessionStore extends AbstractLifeCycle implements SessionSto
return _store.getExpired(candidates); return _store.getExpired(candidates);
} }
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#store(java.lang.String, org.eclipse.jetty.server.session.SessionData) * @see org.eclipse.jetty.server.session.SessionDataStore#store(java.lang.String, org.eclipse.jetty.server.session.SessionData)
*/ */
@Override @Override
public void store(String id, SessionData data) throws Exception public void store(String id, SessionData data) throws Exception
@ -155,7 +145,7 @@ public class CachingSessionStore extends AbstractLifeCycle implements SessionSto
_store.store(id, data); _store.store(id, data);
//then update the cache with written data //then update the cache with written data
_cache.put(id,data); _cache.store(id,data);
} }
@ -173,7 +163,7 @@ public class CachingSessionStore extends AbstractLifeCycle implements SessionSto
} }
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#isPassivating() * @see org.eclipse.jetty.server.session.SessionDataStore#isPassivating()
*/ */
@Override @Override
public boolean isPassivating() public boolean isPassivating()
@ -182,13 +172,13 @@ public class CachingSessionStore extends AbstractLifeCycle implements SessionSto
} }
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#exists(java.lang.String) * @see org.eclipse.jetty.server.session.SessionDataStore#exists(java.lang.String)
*/ */
@Override @Override
public boolean exists(String id) throws Exception public boolean exists(String id) throws Exception
{ {
//check the cache first //check the cache first
SessionData data = _cache.get(id); SessionData data = _cache.load(id);
if (data != null) if (data != null)
return true; return true;
@ -198,7 +188,7 @@ public class CachingSessionStore extends AbstractLifeCycle implements SessionSto
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#initialize(org.eclipse.jetty.server.session.SessionContext) * @see org.eclipse.jetty.server.session.SessionDataStore#initialize(org.eclipse.jetty.server.session.SessionContext)
*/ */
@Override @Override
public void initialize(SessionContext context) public void initialize(SessionContext context)
@ -209,7 +199,7 @@ public class CachingSessionStore extends AbstractLifeCycle implements SessionSto
} }
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#newSessionData(java.lang.String, long, long, long, long) * @see org.eclipse.jetty.server.session.SessionDataStore#newSessionData(java.lang.String, long, long, long, long)
*/ */
@Override @Override
public SessionData newSessionData(String id, long created, long accessed, long lastAccessed, long maxInactiveMs) public SessionData newSessionData(String id, long created, long accessed, long lastAccessed, long maxInactiveMs)

View File

@ -24,34 +24,34 @@ package org.eclipse.jetty.server.session;
* *
* *
*/ */
public class CachingSessionStoreFactory extends AbstractSessionStoreFactory public class CachingSessionStoreFactory extends AbstractSessionDataStoreFactory
{ {
/** /**
* The SessionStore that will store session data. * The SessionDataStore that will store session data.
*/ */
protected SessionStoreFactory _backingSessionStoreFactory; protected SessionDataStoreFactory _backingSessionStoreFactory;
/** /**
* @param factory The factory for the actual SessionStore that the * @param factory The factory for the actual SessionDataStore that the
* CachingSessionStore will delegate to * CachingSessionStore will delegate to
*/ */
public void setBackingSessionStoreFactory (SessionStoreFactory factory) public void setBackingSessionStoreFactory (SessionDataStoreFactory factory)
{ {
_backingSessionStoreFactory = factory; _backingSessionStoreFactory = factory;
} }
/** /**
* @see org.eclipse.jetty.server.session.SessionStoreFactory#getSessionStore(org.eclipse.jetty.server.session.SessionHandler) * @see org.eclipse.jetty.server.session.SessionDataStoreFactory#getSessionDataStore(org.eclipse.jetty.server.session.SessionHandler)
*/ */
@Override @Override
public SessionStore getSessionStore(SessionHandler handler) throws Exception public SessionDataStore getSessionDataStore(SessionHandler handler) throws Exception
{ {
// TODO configure and create a cache! // TODO configure and create a cache!
return new CachingSessionStore(null, _backingSessionStoreFactory.getSessionStore(handler)); return new CachingSessionStore(null, _backingSessionStoreFactory.getSessionDataStore(handler));
} }
} }

View File

@ -146,14 +146,14 @@ public class DefaultSessionCache extends AbstractSessionCache
for (Session session: _sessions.values()) for (Session session: _sessions.values())
{ {
//if we have a backing store and the session is dirty make sure it is written out //if we have a backing store and the session is dirty make sure it is written out
if (_sessionStore != null) if (_sessionDataStore != null)
{ {
if (session.getSessionData().isDirty()) if (session.getSessionData().isDirty())
{ {
session.willPassivate(); session.willPassivate();
try try
{ {
_sessionStore.store(session.getId(), session.getSessionData()); _sessionDataStore.store(session.getId(), session.getSessionData());
} }
catch (Exception e) catch (Exception e)
{ {
@ -186,7 +186,7 @@ public class DefaultSessionCache extends AbstractSessionCache
@Override @Override
public Session newSession(HttpServletRequest request, SessionData data) public Session newSession(HttpServletRequest request, SessionData data)
{ {
Session s = new Session(request,data); Session s = new Session(getSessionHandler(),request, data);
return s; return s;
} }
@ -199,7 +199,7 @@ public class DefaultSessionCache extends AbstractSessionCache
@Override @Override
public Session newSession(SessionData data) public Session newSession(SessionData data)
{ {
Session s = new Session (data); Session s = new Session (getSessionHandler(), data);
return s; return s;
} }

View File

@ -26,53 +26,54 @@ package org.eclipse.jetty.server.session;
*/ */
public class DefaultSessionCacheFactory implements SessionCacheFactory public class DefaultSessionCacheFactory implements SessionCacheFactory
{ {
int _idlePassivationTimeoutSec; int _evictionTimeout;
boolean _passivateOnComplete; boolean _saveOnInactiveEvict;
/**
* @return the passivateOnComplete
*/ public int getEvictionTimeout()
public boolean isPassivateOnComplete()
{ {
return _passivateOnComplete; return _evictionTimeout;
} }
/**
* @param passivateOnComplete the passivateOnComplete to set
*/
public void setPassivateOnComplete(boolean passivateOnComplete)
{
_passivateOnComplete = passivateOnComplete;
}
/**
* @return the idlePassivationTimeoutSec public void setEvictionTimeout(int evictionTimeout)
*/
public int getIdlePassivationTimeoutSec()
{ {
return _idlePassivationTimeoutSec; _evictionTimeout = evictionTimeout;
} }
/**
* @param idlePassivationTimeoutSec the idlePassivationTimeoutSec to set
*/ public boolean isSaveOnInactiveEvict()
public void setIdlePassivationTimeoutSec(int idlePassivationTimeoutSec)
{ {
_idlePassivationTimeoutSec = idlePassivationTimeoutSec; return _saveOnInactiveEvict;
} }
public void setSaveOnInactiveEvict(boolean saveOnInactiveEvict)
{
_saveOnInactiveEvict = saveOnInactiveEvict;
}
/** /**
* @see org.eclipse.jetty.server.session.SessionCacheFactory#getSessionCache(SessionHandler) * @see org.eclipse.jetty.server.session.SessionCacheFactory#getSessionDataStore(org.eclipse.jetty.server.session.SessionHandler)
*/ */
@Override @Override
public SessionCache getSessionCache (SessionHandler handler) public SessionCache getSessionCache (SessionHandler handler)
{ {
DefaultSessionCache cache = new DefaultSessionCache(handler); DefaultSessionCache cache = new DefaultSessionCache(handler);
cache.setIdlePassivationTimeoutSec(_idlePassivationTimeoutSec); cache.setEvictionPolicy(_evictionTimeout);
cache.setPassivateOnComplete(_passivateOnComplete); cache.setSaveOnInactiveEviction(_saveOnInactiveEvict);
return cache; return cache;
} }

View File

@ -208,6 +208,7 @@ public class DefaultSessionIdManager extends AbstractLifeCycle implements Sessio
return cluster_id; return cluster_id;
} }
// Else reuse any new session ID already defined for this request. // Else reuse any new session ID already defined for this request.
String new_id=(String)request.getAttribute(__NEW_SESSION_ID); String new_id=(String)request.getAttribute(__NEW_SESSION_ID);
if (new_id!=null&&isIdInUse(new_id)) if (new_id!=null&&isIdInUse(new_id))

View File

@ -42,11 +42,11 @@ import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger; import org.eclipse.jetty.util.log.Logger;
/** /**
* FileSessionStore * FileSessionDataStore
* *
* A file-based store of session data. * A file-based store of session data.
*/ */
public class FileSessionStore extends AbstractSessionStore public class FileSessionDataStore extends AbstractSessionDataStore
{ {
private final static Logger LOG = Log.getLogger("org.eclipse.jetty.server.session"); private final static Logger LOG = Log.getLogger("org.eclipse.jetty.server.session");
private File _storeDir; private File _storeDir;
@ -92,7 +92,7 @@ public class FileSessionStore extends AbstractSessionStore
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#delete(java.lang.String) * @see org.eclipse.jetty.server.session.SessionDataStore#delete(java.lang.String)
*/ */
@Override @Override
public boolean delete(String id) throws Exception public boolean delete(String id) throws Exception
@ -112,7 +112,7 @@ public class FileSessionStore extends AbstractSessionStore
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#getExpired(Set) * @see org.eclipse.jetty.server.session.SessionDataStore#getExpired(Set)
*/ */
@Override @Override
public Set<String> doGetExpired(final Set<String> candidates) public Set<String> doGetExpired(final Set<String> candidates)
@ -166,7 +166,7 @@ public class FileSessionStore extends AbstractSessionStore
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#load(java.lang.String) * @see org.eclipse.jetty.server.session.SessionDataStore#load(java.lang.String)
*/ */
@Override @Override
public SessionData load(String id) throws Exception public SessionData load(String id) throws Exception
@ -220,7 +220,7 @@ public class FileSessionStore extends AbstractSessionStore
/** /**
* @see org.eclipse.jetty.server.session.AbstractSessionStore#doStore(java.lang.String, org.eclipse.jetty.server.session.SessionData, long) * @see org.eclipse.jetty.server.session.AbstractSessionDataStore#doStore(java.lang.String, org.eclipse.jetty.server.session.SessionData, long)
*/ */
@Override @Override
public void doStore(String id, SessionData data, long lastSaveTime) throws Exception public void doStore(String id, SessionData data, long lastSaveTime) throws Exception
@ -262,7 +262,7 @@ public class FileSessionStore extends AbstractSessionStore
} }
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#isPassivating() * @see org.eclipse.jetty.server.session.SessionDataStore#isPassivating()
*/ */
@Override @Override
public boolean isPassivating() public boolean isPassivating()
@ -274,7 +274,7 @@ public class FileSessionStore extends AbstractSessionStore
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#exists(java.lang.String) * @see org.eclipse.jetty.server.session.SessionDataStore#exists(java.lang.String)
*/ */
@Override @Override
public boolean exists(String id) throws Exception public boolean exists(String id) throws Exception

View File

@ -22,11 +22,11 @@ package org.eclipse.jetty.server.session;
import java.io.File; import java.io.File;
/** /**
* FileSessionStoreFactory * FileSessionDataStoreFactory
* *
* *
*/ */
public class FileSessionStoreFactory extends AbstractSessionStoreFactory public class FileSessionDataStoreFactory extends AbstractSessionDataStoreFactory
{ {
boolean _deleteUnrestorableFiles; boolean _deleteUnrestorableFiles;
File _storeDir; File _storeDir;
@ -69,12 +69,12 @@ public class FileSessionStoreFactory extends AbstractSessionStoreFactory
/** /**
* @see org.eclipse.jetty.server.session.SessionStoreFactory#getSessionStore(SessionHandler) * @see org.eclipse.jetty.server.session.SessionDataStoreFactory#getSessionDataStore(org.eclipse.jetty.server.session.SessionHandler)
*/ */
@Override @Override
public SessionStore getSessionStore(SessionHandler handler) public SessionDataStore getSessionDataStore(SessionHandler handler)
{ {
FileSessionStore fsds = new FileSessionStore(); FileSessionDataStore fsds = new FileSessionDataStore();
fsds.setDeleteUnrestorableFiles(isDeleteUnrestorableFiles()); fsds.setDeleteUnrestorableFiles(isDeleteUnrestorableFiles());
fsds.setStoreDir(getStoreDir()); fsds.setStoreDir(getStoreDir());
fsds.setGracePeriodSec(getGracePeriodSec()); fsds.setGracePeriodSec(getGracePeriodSec());

View File

@ -42,11 +42,11 @@ import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger; import org.eclipse.jetty.util.log.Logger;
/** /**
* JDBCSessionStore * JDBCSessionDataStore
* *
* Session data stored in database * Session data stored in database
*/ */
public class JDBCSessionStore extends AbstractSessionStore public class JDBCSessionDataStore extends AbstractSessionDataStore
{ {
final static Logger LOG = Log.getLogger("org.eclipse.jetty.server.session"); final static Logger LOG = Log.getLogger("org.eclipse.jetty.server.session");
@ -610,7 +610,7 @@ public class JDBCSessionStore extends AbstractSessionStore
public JDBCSessionStore () public JDBCSessionDataStore ()
{ {
super (); super ();
} }
@ -662,7 +662,7 @@ public class JDBCSessionStore extends AbstractSessionStore
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#load(java.lang.String) * @see org.eclipse.jetty.server.session.SessionDataStore#load(java.lang.String)
*/ */
@Override @Override
public SessionData load(String id) throws Exception public SessionData load(String id) throws Exception
@ -758,7 +758,7 @@ public class JDBCSessionStore extends AbstractSessionStore
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#delete(java.lang.String) * @see org.eclipse.jetty.server.session.SessionDataStore#delete(java.lang.String)
*/ */
@Override @Override
public boolean delete(String id) throws Exception public boolean delete(String id) throws Exception
@ -779,7 +779,7 @@ public class JDBCSessionStore extends AbstractSessionStore
/** /**
* @see org.eclipse.jetty.server.session.AbstractSessionStore#doStore(String, SessionData, long) * @see org.eclipse.jetty.server.session.AbstractSessionDataStore#doStore(String, SessionData, long)
*/ */
@Override @Override
public void doStore(String id, SessionData data, long lastSaveTime) throws Exception public void doStore(String id, SessionData data, long lastSaveTime) throws Exception
@ -884,7 +884,7 @@ public class JDBCSessionStore extends AbstractSessionStore
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#getExpired(Set) * @see org.eclipse.jetty.server.session.SessionDataStore#getExpired(Set)
*/ */
@Override @Override
public Set<String> doGetExpired(Set<String> candidates) public Set<String> doGetExpired(Set<String> candidates)
@ -1083,7 +1083,7 @@ public class JDBCSessionStore extends AbstractSessionStore
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#isPassivating() * @see org.eclipse.jetty.server.session.SessionDataStore#isPassivating()
*/ */
@Override @Override
public boolean isPassivating() public boolean isPassivating()
@ -1096,7 +1096,7 @@ public class JDBCSessionStore extends AbstractSessionStore
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#exists(java.lang.String) * @see org.eclipse.jetty.server.session.SessionDataStore#exists(java.lang.String)
*/ */
@Override @Override
public boolean exists(String id) public boolean exists(String id)

View File

@ -20,11 +20,11 @@
package org.eclipse.jetty.server.session; package org.eclipse.jetty.server.session;
/** /**
* JDBCSessionStoreFactory * JDBCSessionDataStoreFactory
* *
* *
*/ */
public class JDBCSessionStoreFactory extends AbstractSessionStoreFactory public class JDBCSessionDataStoreFactory extends AbstractSessionDataStoreFactory
{ {
/** /**
@ -34,7 +34,7 @@ public class JDBCSessionStoreFactory extends AbstractSessionStoreFactory
/** /**
* *
*/ */
JDBCSessionStore.SessionTableSchema _schema; JDBCSessionDataStore.SessionTableSchema _schema;
/** /**
* *
*/ */
@ -82,12 +82,12 @@ public class JDBCSessionStoreFactory extends AbstractSessionStoreFactory
/** /**
* @see org.eclipse.jetty.server.session.SessionStoreFactory#getSessionStore(SessionHandler) * @see org.eclipse.jetty.server.session.SessionDataStoreFactory#getSessionDataStore(org.eclipse.jetty.server.session.SessionHandler)
*/ */
@Override @Override
public SessionStore getSessionStore(SessionHandler handler) public SessionDataStore getSessionDataStore(SessionHandler handler)
{ {
JDBCSessionStore ds = new JDBCSessionStore(); JDBCSessionDataStore ds = new JDBCSessionDataStore();
ds.setDatabaseAdaptor(_adaptor); ds.setDatabaseAdaptor(_adaptor);
ds.setSessionTableSchema(_schema); ds.setSessionTableSchema(_schema);
ds.setDeleteUnloadableSessions(_deleteUnloadableSessions); ds.setDeleteUnloadableSessions(_deleteUnloadableSessions);
@ -109,7 +109,7 @@ public class JDBCSessionStoreFactory extends AbstractSessionStoreFactory
/** /**
* @param schema * @param schema
*/ */
public void setSessionTableSchema (JDBCSessionStore.SessionTableSchema schema) public void setSessionTableSchema (JDBCSessionDataStore.SessionTableSchema schema)
{ {
_schema = schema; _schema = schema;
} }

View File

@ -22,15 +22,15 @@ package org.eclipse.jetty.server.session;
import java.util.Set; import java.util.Set;
/** /**
* NullSessionStore * NullSessionDataStore
* *
* *
*/ */
public class NullSessionStore extends AbstractSessionStore public class NullSessionDataStore extends AbstractSessionDataStore
{ {
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#load(java.lang.String) * @see org.eclipse.jetty.server.session.SessionDataStore#load(java.lang.String)
*/ */
@Override @Override
public SessionData load(String id) throws Exception public SessionData load(String id) throws Exception
@ -40,7 +40,7 @@ public class NullSessionStore extends AbstractSessionStore
/** /**
* @see org.eclipse.jetty.server.session.AbstractSessionStore#newSessionData(java.lang.String, long, long, long, long) * @see org.eclipse.jetty.server.session.AbstractSessionDataStore#newSessionData(java.lang.String, long, long, long, long)
*/ */
@Override @Override
public SessionData newSessionData(String id, long created, long accessed, long lastAccessed, long maxInactiveMs) public SessionData newSessionData(String id, long created, long accessed, long lastAccessed, long maxInactiveMs)
@ -49,7 +49,7 @@ public class NullSessionStore extends AbstractSessionStore
} }
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#delete(java.lang.String) * @see org.eclipse.jetty.server.session.SessionDataStore#delete(java.lang.String)
*/ */
@Override @Override
public boolean delete(String id) throws Exception public boolean delete(String id) throws Exception
@ -59,7 +59,7 @@ public class NullSessionStore extends AbstractSessionStore
/** /**
* @see org.eclipse.jetty.server.session.AbstractSessionStore#doStore(java.lang.String, org.eclipse.jetty.server.session.SessionData, long) * @see org.eclipse.jetty.server.session.AbstractSessionDataStore#doStore(java.lang.String, org.eclipse.jetty.server.session.SessionData, long)
*/ */
@Override @Override
public void doStore(String id, SessionData data, long lastSaveTime) throws Exception public void doStore(String id, SessionData data, long lastSaveTime) throws Exception
@ -69,7 +69,7 @@ public class NullSessionStore extends AbstractSessionStore
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#getExpired(Set) * @see org.eclipse.jetty.server.session.SessionDataStore#getExpired(Set)
*/ */
@Override @Override
public Set<String> doGetExpired(Set<String> candidates) public Set<String> doGetExpired(Set<String> candidates)
@ -79,7 +79,7 @@ public class NullSessionStore extends AbstractSessionStore
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#isPassivating() * @see org.eclipse.jetty.server.session.SessionDataStore#isPassivating()
*/ */
@Override @Override
public boolean isPassivating() public boolean isPassivating()
@ -89,7 +89,7 @@ public class NullSessionStore extends AbstractSessionStore
/** /**
* @see org.eclipse.jetty.server.session.SessionStore#exists(java.lang.String) * @see org.eclipse.jetty.server.session.SessionDataStore#exists(java.lang.String)
*/ */
@Override @Override
public boolean exists(String id) public boolean exists(String id)

View File

@ -68,12 +68,7 @@ public class Session implements SessionHandler.SessionIf
public enum State {VALID, INVALID, INVALIDATING}; public enum State {VALID, INVALID, INVALIDATING};
/**
* PassivationState
*
* States of a session - either active in memory or passivated to persistent store
*/
public enum PassivationState {PASSIVATED, ACTIVE};
protected SessionData _sessionData; //the actual data associated with a session protected SessionData _sessionData; //the actual data associated with a session
@ -84,22 +79,25 @@ public class Session implements SessionHandler.SessionIf
private boolean _newSession; private boolean _newSession;
private State _state = State.VALID; //state of the session:valid,invalid or being invalidated private State _state = State.VALID; //state of the session:valid,invalid or being invalidated
private Locker _lock = new Locker(); //sync lock private Locker _lock = new Locker(); //sync lock
private PassivationState _passivationState = PassivationState.ACTIVE; //passivated or not private boolean _resident = false;
private InspectionTimeout _inspectionTimeout = null; private SessionInactivityTimeout _sessionInactivityTimer = null;
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
/** /**
* InspectionTimeout * SessionInactivityTimeout
* *
* *
*/ */
public class InspectionTimeout extends IdleTimeout public class SessionInactivityTimeout extends IdleTimeout
{ {
public InspectionTimeout() /**
*
*/
public SessionInactivityTimeout()
{ {
super(getSessionHandler().getScheduler()); super(getSessionHandler().getScheduler());
} }
@ -112,7 +110,7 @@ public class Session implements SessionHandler.SessionIf
{ {
//called when the timer goes off //called when the timer goes off
if (LOG.isDebugEnabled()) LOG.debug("Timer expired for session {}", getId()); if (LOG.isDebugEnabled()) LOG.debug("Timer expired for session {}", getId());
getSessionHandler().inspect(Session.this); getSessionHandler().sessionInactivityTimerExpired(Session.this);
} }
/** /**
@ -127,7 +125,7 @@ public class Session implements SessionHandler.SessionIf
// BUT if passivated out to disk, do we really want this timer to keep going off? // BUT if passivated out to disk, do we really want this timer to keep going off?
try (Lock lock = _lock.lockIfNotHeld()) try (Lock lock = _lock.lockIfNotHeld())
{ {
return isValid() && !isPassivated(); return isValid() && isResident();
} }
} }
@ -148,12 +146,13 @@ public class Session implements SessionHandler.SessionIf
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
/** /**
* Create a new session * Create a new session
* * @param handler TODO
* @param request the request the session should be based on * @param request the request the session should be based on
* @param data the session data * @param data the session data
*/ */
public Session (HttpServletRequest request, SessionData data) public Session (SessionHandler handler, HttpServletRequest request, SessionData data)
{ {
_handler = handler;
_sessionData = data; _sessionData = data;
_newSession = true; _newSession = true;
_requests = 1; //access will not be called on this new session, but we are obviously in a request _requests = 1; //access will not be called on this new session, but we are obviously in a request
@ -164,10 +163,12 @@ public class Session implements SessionHandler.SessionIf
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
/** /**
* Re-create an existing session * Re-create an existing session
* @param handler TODO
* @param data the session data * @param data the session data
*/ */
public Session (SessionData data) public Session (SessionHandler handler, SessionData data)
{ {
_handler = handler;
_sessionData = data; _sessionData = data;
} }
@ -189,11 +190,6 @@ public class Session implements SessionHandler.SessionIf
/* ------------------------------------------------------------- */
public void setSessionHandler (SessionHandler manager)
{
_handler = manager;
}
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
@ -455,9 +451,9 @@ public class Session implements SessionHandler.SessionIf
try (Lock lock = _lock.lockIfNotHeld()) try (Lock lock = _lock.lockIfNotHeld())
{ {
_sessionData.setMaxInactiveMs((long)secs*1000L); _sessionData.setMaxInactiveMs((long)secs*1000L);
_sessionData.setExpiry(_sessionData.calcExpiry()); _sessionData.calcAndSetExpiry();
_sessionData.setDirty(true); _sessionData.setDirty(true);
setTimeout(); updateInactivityTimer();
if (LOG.isDebugEnabled()) if (LOG.isDebugEnabled())
{ {
if (secs <= 0) if (secs <= 0)
@ -470,53 +466,77 @@ public class Session implements SessionHandler.SessionIf
/** /**
* * Set the inactivity timer to the smaller of the session maxInactivity
* (ie session-timeout from web.xml), or the inactive eviction time.
*/ */
public void setTimeout () public void updateInactivityTimer ()
{ {
try (Lock lock = _lock.lockIfNotHeld()) try (Lock lock = _lock.lockIfNotHeld())
{ {
if (LOG.isDebugEnabled())LOG.debug("Set timeout called"); if (LOG.isDebugEnabled())LOG.debug("updateInactivityTimer");
long maxInactive = _sessionData.getMaxInactiveMs();
long maxIdle = TimeUnit.SECONDS.toMillis(getSessionHandler().getSessionStore().getIdlePassivationTimeoutSec());
long maxInactive = _sessionData.getMaxInactiveMs();
int evictionPolicy = getSessionHandler().getSessionCache().getEvictionPolicy();
if (maxInactive <= 0 && maxIdle <=0)
{
//session is immortal and idle passivation is not supported
if (_inspectionTimeout != null)
_inspectionTimeout.setIdleTimeout(-1);
if (LOG.isDebugEnabled()) LOG.debug("Session maxInactive <= 0 && idlePassivation <=0: timer cancelled");
return;
}
if (_inspectionTimeout == null)
_inspectionTimeout = new InspectionTimeout();
//set the inspection timer to the smaller of the maxIdle interval or the idlePassivation interval
long timeout = 0;
if (maxInactive <= 0) if (maxInactive <= 0)
timeout = maxIdle; {
else if (maxIdle <= 0) //sessions are immortal, they never expire
timeout = maxInactive; if (evictionPolicy < SessionCache.EVICT_ON_INACTIVITY)
{
//we do not want to evict inactive sessions
setInactivityTimer(-1L);
if (LOG.isDebugEnabled()) LOG.debug("Session is immortal && never evict: timer cancelled");
}
else
{
//sessions are immortal but we want to evict after inactivity
setInactivityTimer(TimeUnit.SECONDS.toMillis(evictionPolicy));
if (LOG.isDebugEnabled()) LOG.debug("Session is immortal; evict after {} sec inactivity", evictionPolicy);
}
}
else else
timeout = Math.min(maxInactive, maxIdle); {
//sessions are not immortal
_inspectionTimeout.setIdleTimeout(timeout); if (evictionPolicy < SessionCache.EVICT_ON_INACTIVITY)
if (LOG.isDebugEnabled()) LOG.debug("Session timer(ms)={}", timeout); {
//don't want to evict inactive sessions, set the timer for the session's maxInactive setting
setInactivityTimer(_sessionData.getMaxInactiveMs());
if (LOG.isDebugEnabled()) LOG.debug("No inactive session eviction");
}
else
{
//set the time to the lesser of the session's maxInactive and eviction timeout
setInactivityTimer(Math.min(maxInactive, TimeUnit.SECONDS.toMillis(evictionPolicy)));
if (LOG.isDebugEnabled()) LOG.debug("Inactivity timer set to lesser of maxInactive={} and inactivityEvict={}", maxInactive, evictionPolicy);
}
}
} }
} }
/**
* Set the inactivity timer
*
* @param ms value in millisec, -1 disables it
*/
private void setInactivityTimer (long ms)
{
if (_sessionInactivityTimer == null)
_sessionInactivityTimer = new SessionInactivityTimeout();
_sessionInactivityTimer.setIdleTimeout(ms);
}
public void stopTimeout () /**
*
*/
public void stopInactivityTimer ()
{ {
try (Lock lock = _lock.lockIfNotHeld()) try (Lock lock = _lock.lockIfNotHeld())
{ {
if (_inspectionTimeout != null) if (_sessionInactivityTimer != null)
{ {
_inspectionTimeout.setIdleTimeout(-1); _sessionInactivityTimer.setIdleTimeout(-1);
_inspectionTimeout = null; _sessionInactivityTimer = null;
if (LOG.isDebugEnabled()) LOG.debug("Session timer stopped"); if (LOG.isDebugEnabled()) LOG.debug("Session timer stopped");
} }
} }
@ -563,8 +583,8 @@ public class Session implements SessionHandler.SessionIf
if (_state != State.VALID) if (_state != State.VALID)
throw new IllegalStateException("Not valid for write: id="+_sessionData.getId()+" created="+_sessionData.getCreated()+" accessed="+_sessionData.getAccessed()+" lastaccessed="+_sessionData.getLastAccessed()+" maxInactiveMs="+_sessionData.getMaxInactiveMs()+" expiry="+_sessionData.getExpiry()); throw new IllegalStateException("Not valid for write: id="+_sessionData.getId()+" created="+_sessionData.getCreated()+" accessed="+_sessionData.getAccessed()+" lastaccessed="+_sessionData.getLastAccessed()+" maxInactiveMs="+_sessionData.getMaxInactiveMs()+" expiry="+_sessionData.getExpiry());
if (_passivationState == PassivationState.PASSIVATED) if (!isResident())
throw new IllegalStateException("Not valid for write: id="+_sessionData.getId()+" passivated"); throw new IllegalStateException("Not valid for write: id="+_sessionData.getId()+" not resident");
} }
@ -580,8 +600,8 @@ public class Session implements SessionHandler.SessionIf
if (_state == State.INVALID) if (_state == State.INVALID)
throw new IllegalStateException("Invalid for read: id="+_sessionData.getId()+" created="+_sessionData.getCreated()+" accessed="+_sessionData.getAccessed()+" lastaccessed="+_sessionData.getLastAccessed()+" maxInactiveMs="+_sessionData.getMaxInactiveMs()+" expiry="+_sessionData.getExpiry()); throw new IllegalStateException("Invalid for read: id="+_sessionData.getId()+" created="+_sessionData.getCreated()+" accessed="+_sessionData.getAccessed()+" lastaccessed="+_sessionData.getLastAccessed()+" maxInactiveMs="+_sessionData.getMaxInactiveMs()+" expiry="+_sessionData.getExpiry());
if (_passivationState == PassivationState.PASSIVATED) if (!isResident())
throw new IllegalStateException("Invalid for read: id="+_sessionData.getId()+" passivated"); throw new IllegalStateException("Invalid for read: id="+_sessionData.getId()+" not resident");
} }
@ -762,32 +782,7 @@ public class Session implements SessionHandler.SessionIf
setIdChanged(true); setIdChanged(true);
} }
/* ------------------------------------------------------------- */
/* * Swap the id on a session from old to new, keeping the object
* the same.
*
* @param oldId
* @param oldExtendedId
* @param newId
* @param newExtendedId
*/
/* public void renewId (String oldId, String oldExtendedId, String newId, String newExtendedId)
{
try (Lock lock = _lock.lockIfNotHeld())
{
checkValidForWrite(); //can't change id on invalid session
if (!oldId.equals(getId()))
throw new IllegalStateException("Id clash detected on renewal: was "+oldId+" but is "+ getId());
_sessionData.setId(newId);
setExtendedId(newExtendedId);
_sessionData.setLastSaved(0); //forces an insert
_sessionData.setDirty(true); //forces an insert
}
}*/
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
/** Called by users to invalidate a session, or called by the /** Called by users to invalidate a session, or called by the
* access method as a request enters the session if the session * access method as a request enters the session if the session
@ -934,36 +929,14 @@ public class Session implements SessionHandler.SessionIf
} }
public void setResident (boolean resident)
{
_resident = resident;
}
/** public boolean isResident ()
*
*/
public void setPassivated ()
{ {
checkLocked(); return _resident;
_passivationState = PassivationState.PASSIVATED;
}
/**
*
*/
public void setActive ()
{
checkLocked();
_passivationState = PassivationState.ACTIVE;
}
public boolean isActive ()
{
checkLocked();
return _passivationState == PassivationState.ACTIVE;
}
public boolean isPassivated ()
{
checkLocked();
return _passivationState == PassivationState.PASSIVATED;
} }
} }

View File

@ -26,16 +26,39 @@ import javax.servlet.http.HttpServletRequest;
import org.eclipse.jetty.util.component.LifeCycle; import org.eclipse.jetty.util.component.LifeCycle;
/** /**
* SessionStore * SessionCache
* *
* A store of Session objects. This store of Session objects can be backed by * A set of Session objects for a context that are actively being
* a SessionDataStore to persist/distribute the data contained in the Session objects. * managed by this context instance.
* *
* This store of Session objects ensures that all threads within the same context on * Multiple requests for the same session id on the same context should always
* the same node with the same session id will share exactly the same Session object. * share the same Session object from the SessionCache.
*
* The data for the Session objects is obtained from, and written to a SessionDataStore.
* It is assumed that the SessionDataStore is the authoritative source of session data:
* <ul>
* <li>if the session data is not present in the SessionDataStore the session does not exist.</li>
* <li>if the session data is present in the SessionDataStore but its expiry time has passed then
* the session is deemed to have expired</li>
*</ul>
*
* Examples of SessionDataStores are relational or nosql databases, filesystems, or other
* distributed mechanisms.
*
* A SessionCache is optionally able to passivate a managed Session to the SessionDataStore and
* evict it from the cache if it has been in memory, but not accessed for a configurable amount of time.
*
* Implementations of the SessionCache may also implement different strategies for writing out
* Session data to the SessionDataStore.
*/ */
public interface SessionCache extends LifeCycle public interface SessionCache extends LifeCycle
{ {
public static final int NEVER_EVICT = -1;
public static final int EVICT_ON_SESSION_EXIT = 0;
public static final int EVICT_ON_INACTIVITY = 1; //any number equal or greater is time in seconds
void initialize(SessionContext context); void initialize(SessionContext context);
SessionHandler getSessionHandler(); SessionHandler getSessionHandler();
Session newSession (HttpServletRequest request, String id, long time, long maxInactiveMs); Session newSession (HttpServletRequest request, String id, long time, long maxInactiveMs);
@ -47,9 +70,11 @@ public interface SessionCache extends LifeCycle
Session delete (String id) throws Exception; Session delete (String id) throws Exception;
void shutdown (); void shutdown ();
Set<String> checkExpiration (Set<String> candidates); Set<String> checkExpiration (Set<String> candidates);
void setIdlePassivationTimeoutSec(int sec); SessionDataStore getSessionDataStore();
int getIdlePassivationTimeoutSec(); void setSessionDataStore(SessionDataStore sds);
SessionStore getSessionStore(); void checkInactiveSession(Session session);
void setSessionStore(SessionStore sds); void setEvictionPolicy (int policy);
void passivateIdleSession(String id); int getEvictionPolicy ();
void setSaveOnInactiveEviction (boolean saveOnEvict);
boolean isSaveOnInactiveEviction ();
} }

View File

@ -66,7 +66,7 @@ public class SessionData implements Serializable
_accessed = accessed; _accessed = accessed;
_lastAccessed = lastAccessed; _lastAccessed = lastAccessed;
_maxInactiveMs = maxInactiveMs; _maxInactiveMs = maxInactiveMs;
_expiry = calcExpiry(); calcAndSetExpiry();
} }
@ -250,6 +250,11 @@ public class SessionData implements Serializable
{ {
return (getMaxInactiveMs() <= 0 ? 0 : (System.currentTimeMillis() + getMaxInactiveMs())); return (getMaxInactiveMs() <= 0 ? 0 : (System.currentTimeMillis() + getMaxInactiveMs()));
} }
public void calcAndSetExpiry ()
{
setExpiry(calcExpiry());
}
public long getCreated() public long getCreated()
{ {

View File

@ -0,0 +1,67 @@
//
// ========================================================================
// Copyright (c) 1995-2016 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
//
package org.eclipse.jetty.server.session;
/**
* SessionDataMap
*
* A map style access to SessionData keyed by the session id.
*/
public interface SessionDataMap
{
/**
* Initialize this session data store for the
* given context. A SessionDataStore can only
* be used by one context(/session manager).
*
* @param context context associated
*/
void initialize(SessionContext context);
/**
* Read in session data from storage
* @param id identity of session to load
* @return the SessionData matching the id
* @throws Exception if unable to load session data
*/
public SessionData load (String id) throws Exception;
/**
* Write out session data to storage
* @param id identity of session to store
* @param data info of session to store
* @throws Exception if unable to write session data
*/
public void store (String id, SessionData data) throws Exception;
/**
* Delete session data from storage
* @param id identity of session to delete
* @return true if the session was deleted from the permanent store
* @throws Exception if unable to delete session data
*/
public boolean delete (String id) throws Exception;
}

View File

@ -24,32 +24,13 @@ import java.util.Set;
import org.eclipse.jetty.util.component.LifeCycle; import org.eclipse.jetty.util.component.LifeCycle;
/** /**
* SessionStore * SessionDataStore
* *
* A store for the data contained in a Session object. The store * A store for the data contained in a Session object. The store
* would usually be persistent. * would usually be persistent.
*/ */
public interface SessionStore extends LifeCycle public interface SessionDataStore extends SessionDataMap, LifeCycle
{ {
/**
* Initialize this session data store for the
* given context. A SessionDataStore can only
* be used by one context(/session manager).
*
* @param context context associated
*/
void initialize(SessionContext context);
/**
* Read in session data from storage
* @param id identity of session to load
* @return the SessionData matching the id
* @throws Exception if unable to load session data
*/
public SessionData load (String id) throws Exception;
/** /**
* Create a new SessionData * Create a new SessionData
@ -63,35 +44,13 @@ public interface SessionStore extends LifeCycle
public SessionData newSessionData (String id, long created, long accessed, long lastAccessed, long maxInactiveMs); public SessionData newSessionData (String id, long created, long accessed, long lastAccessed, long maxInactiveMs);
/**
* Write out session data to storage
* @param id identity of session to store
* @param data info of session to store
* @throws Exception if unable to write session data
*/
public void store (String id, SessionData data) throws Exception;
/**
* Delete session data from storage
* @param id identity of session to delete
* @return true if the session was deleted from the permanent store
* @throws Exception if unable to delete session data
*/
public boolean delete (String id) throws Exception;
/** /**
* Called periodically, this method should search the data store * Called periodically, this method should search the data store
* for sessions that have been expired for a 'reasonable' amount * for sessions that have been expired for a 'reasonable' amount
* of time. * of time.
* @param candidates if provided, these are keys of sessions that * @param candidates if provided, these are keys of sessions that
* the SessionStore thinks has expired and should be verified by the * the SessionDataStore thinks has expired and should be verified by the
* SessionDataStore * SessionDataStore
* @return set of session ids * @return set of session ids
*/ */

View File

@ -20,11 +20,11 @@
package org.eclipse.jetty.server.session; package org.eclipse.jetty.server.session;
/** /**
* SessionStoreFactory * SessionDataStoreFactory
* *
* *
*/ */
public interface SessionStoreFactory public interface SessionDataStoreFactory
{ {
SessionStore getSessionStore (SessionHandler handler) throws Exception; SessionDataStore getSessionDataStore (SessionHandler handler) throws Exception;
} }

View File

@ -31,6 +31,8 @@ import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
import javax.servlet.AsyncEvent;
import javax.servlet.AsyncListener;
import javax.servlet.DispatcherType; import javax.servlet.DispatcherType;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.SessionCookieConfig; import javax.servlet.SessionCookieConfig;
@ -144,6 +146,49 @@ public class SessionHandler extends ScopedHandler
* max number of minutes that you can set. * max number of minutes that you can set.
*/ */
public final static java.math.BigDecimal MAX_INACTIVE_MINUTES = new java.math.BigDecimal(Integer.MAX_VALUE/60); public final static java.math.BigDecimal MAX_INACTIVE_MINUTES = new java.math.BigDecimal(Integer.MAX_VALUE/60);
/**
* SessionAsyncListener
*
* Used to ensure that a request for which async has been started
* has its session completed as the request exits the context.
*/
public class SessionAsyncListener implements AsyncListener
{
private Session _session;
public SessionAsyncListener(Session session)
{
_session = session;
}
@Override
public void onComplete(AsyncEvent event) throws IOException
{
//An async request has completed, so we can complete the session
complete(((HttpServletRequest)event.getAsyncContext().getRequest()).getSession(false));
}
@Override
public void onTimeout(AsyncEvent event) throws IOException
{
}
@Override
public void onError(AsyncEvent event) throws IOException
{
complete(((HttpServletRequest)event.getAsyncContext().getRequest()).getSession(false));
}
@Override
public void onStartAsync(AsyncEvent event) throws IOException
{
event.getAsyncContext().addListener(this);
}
}
static final HttpSessionContext __nullSessionContext=new HttpSessionContext() static final HttpSessionContext __nullSessionContext=new HttpSessionContext()
{ {
@ -161,6 +206,8 @@ public class SessionHandler extends ScopedHandler
} }
}; };
/** /**
* Setting of max inactive interval for new sessions * Setting of max inactive interval for new sessions
@ -310,6 +357,9 @@ public class SessionHandler extends ScopedHandler
*/ */
public void complete(HttpSession session) public void complete(HttpSession session)
{ {
if (session == null)
return;
Session s = ((SessionIf)session).getSession(); Session s = ((SessionIf)session).getSession();
try try
@ -322,6 +372,24 @@ public class SessionHandler extends ScopedHandler
LOG.warn(e); LOG.warn(e);
} }
} }
public void complete (Session session, Request request)
{
if (request.isAsyncStarted() && request.getDispatcherType() == DispatcherType.REQUEST)
{
request.getAsyncContext().addListener(new SessionAsyncListener(session));
}
else
{
complete(session);
}
//if dispatcher type is not async and not request, complete immediately (its a forward or an include)
//else if dispatcher type is request and not async, complete immediately
//else register an async callback completion listener that will complete the session
}
/* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */
@ -341,7 +409,7 @@ public class SessionHandler extends ScopedHandler
synchronized (server) synchronized (server)
{ {
//Get a SessionStore and a SessionDataStore, falling back to in-memory sessions only //Get a SessionDataStore and a SessionDataStore, falling back to in-memory sessions only
if (_sessionCache == null) if (_sessionCache == null)
{ {
SessionCacheFactory ssFactory = server.getBean(SessionCacheFactory.class); SessionCacheFactory ssFactory = server.getBean(SessionCacheFactory.class);
@ -350,14 +418,14 @@ public class SessionHandler extends ScopedHandler
else else
_sessionCache = new DefaultSessionCache(this); _sessionCache = new DefaultSessionCache(this);
SessionStore sds = null; SessionDataStore sds = null;
SessionStoreFactory sdsFactory = server.getBean(SessionStoreFactory.class); SessionDataStoreFactory sdsFactory = server.getBean(SessionDataStoreFactory.class);
if (sdsFactory != null) if (sdsFactory != null)
sds = sdsFactory.getSessionStore(this); sds = sdsFactory.getSessionDataStore(this);
else else
sds = new NullSessionStore(); sds = new NullSessionDataStore();
_sessionCache.setSessionStore(sds); _sessionCache.setSessionDataStore(sds);
} }
@ -730,11 +798,12 @@ public class SessionHandler extends ScopedHandler
Session session = _sessionCache.newSession(request, id, created, (_dftMaxIdleSecs>0?_dftMaxIdleSecs*1000L:-1)); Session session = _sessionCache.newSession(request, id, created, (_dftMaxIdleSecs>0?_dftMaxIdleSecs*1000L:-1));
session.setExtendedId(_sessionIdManager.getExtendedId(id, request)); session.setExtendedId(_sessionIdManager.getExtendedId(id, request));
session.getSessionData().setLastNode(_sessionIdManager.getWorkerName()); session.getSessionData().setLastNode(_sessionIdManager.getWorkerName());
session.setMaxInactiveInterval(_dftMaxIdleSecs>0?_dftMaxIdleSecs:-1); //TODO awkward: needed to kick off timer and calc expiry
if (request.isSecure()) if (request.isSecure())
session.setAttribute(Session.SESSION_CREATED_SECURE, Boolean.TRUE); session.setAttribute(Session.SESSION_CREATED_SECURE, Boolean.TRUE);
try try
{ {
_sessionCache.put(id, session); _sessionCache.put(id, session);
_sessionsCreatedStats.increment(); _sessionsCreatedStats.increment();
@ -934,15 +1003,15 @@ public class SessionHandler extends ScopedHandler
/** /**
* @return the session store * @return the session store
*/ */
public SessionCache getSessionStore () public SessionCache getSessionCache ()
{ {
return _sessionCache; return _sessionCache;
} }
public void setSessionStore (SessionCache store) public void setSessionCache (SessionCache cache)
{ {
_sessionCache = store; _sessionCache = cache;
} }
/* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */
@ -1214,7 +1283,18 @@ public class SessionHandler extends ScopedHandler
} }
public void inspect (Session session) /**
* Each session has a timer that is configured to go off
* when either the session has not been accessed for a
* configurable amount of time, or the session itself
* has passed its expiry.
* <ul>
* <li> for being expired </li>
* <li> for being idle </li>
* </ul>
* @param session
*/
public void sessionInactivityTimerExpired (Session session)
{ {
if (session == null) if (session == null)
return; return;
@ -1223,8 +1303,8 @@ public class SessionHandler extends ScopedHandler
//check if the session is: //check if the session is:
//1. valid //1. valid
//2. expired //2. expired
//3. passivatable //3. idle
boolean passivate = false; boolean expired = false;
try (Lock lock = session.lock()) try (Lock lock = session.lock())
{ {
if (LOG.isDebugEnabled()) if (LOG.isDebugEnabled())
@ -1233,22 +1313,24 @@ public class SessionHandler extends ScopedHandler
if (!session.isValid()) if (!session.isValid())
return; //do nothing, session is no longer valid return; //do nothing, session is no longer valid
if (session.isExpiredAt(System.currentTimeMillis())) if (session.isExpiredAt(System.currentTimeMillis()) && session.getRequests() <=0)
{ expired = true;
_candidateSessionIdsForExpiry.add(session.getId());
if (LOG.isDebugEnabled())LOG.debug("Session {} is candidate for expiry", session.getId());
}
else if (_sessionCache.getIdlePassivationTimeoutSec() > 0 && session.isIdleLongerThan(_sessionCache.getIdlePassivationTimeoutSec()))
{
passivate = true;
if (LOG.isDebugEnabled())LOG.debug("Session {} will be passivated", session.getId());
}
} }
if (passivate) if (expired)
_sessionCache.passivateIdleSession(session.getId()); //TODO call passivate inside lock {
//instead of expiring the session directly here, accumulate a list of
//session ids that need to be expired. This is an efficiency measure: as
//the expiration involves the SessionDataStore doing a delete, it is
//most efficient if it can be done as a bulk operation to eg reduce
//roundtrips to the persistent store.
_candidateSessionIdsForExpiry.add(session.getId());
if (LOG.isDebugEnabled())LOG.debug("Session {} is candidate for expiry", session.getId());
}
else
_sessionCache.checkInactiveSession(session); //if inactivity eviction is enabled the session will be deleted from the cache
} }
@ -1449,7 +1531,8 @@ public class SessionHandler extends ScopedHandler
{ {
SessionHandler old_session_manager = null; SessionHandler old_session_manager = null;
HttpSession old_session = null; HttpSession old_session = null;
HttpSession access = null; HttpSession existingSession = null;
try try
{ {
old_session_manager = baseRequest.getSessionHandler(); old_session_manager = baseRequest.getSessionHandler();
@ -1463,54 +1546,39 @@ public class SessionHandler extends ScopedHandler
checkRequestedSessionId(baseRequest,request); checkRequestedSessionId(baseRequest,request);
} }
// access any existing session // access any existing session for this context
HttpSession session = null; existingSession = baseRequest.getSession(false);
session = baseRequest.getSession(false); if ((existingSession != null) && (old_session_manager != this))
if (session != null)
{ {
if ((session != old_session) && (request.getDispatcherType() == DispatcherType.ASYNC || request.getDispatcherType() == DispatcherType.REQUEST)) HttpCookie cookie = access(existingSession,request.isSecure());
{ // Handle changed ID or max-age refresh, but only if this is not a redispatched request
access = session; if ((cookie != null) && (request.getDispatcherType() == DispatcherType.ASYNC || request.getDispatcherType() == DispatcherType.REQUEST))
HttpCookie cookie = access(session,request.isSecure()); baseRequest.getResponse().addCookie(cookie);
if (cookie != null) // Handle changed ID or max-age refresh
baseRequest.getResponse().addCookie(cookie);
}
}
else
{
session = baseRequest.recoverNewSession(this);
if (session != null)
baseRequest.setSession(session);
} }
if (LOG.isDebugEnabled()) if (LOG.isDebugEnabled())
{ {
LOG.debug("sessionHandler=" + this); LOG.debug("sessionHandler=" + this);
LOG.debug("session=" + session); LOG.debug("session=" + existingSession);
} }
// start manual inline of nextScope(target,baseRequest,request,response);
if (_nextScope != null) if (_nextScope != null)
_nextScope.doScope(target,baseRequest,request,response); _nextScope.doScope(target,baseRequest,request,response);
else if (_outerScope != null) else if (_outerScope != null)
_outerScope.doHandle(target,baseRequest,request,response); _outerScope.doHandle(target,baseRequest,request,response);
else else
doHandle(target,baseRequest,request,response); doHandle(target,baseRequest,request,response);
// end manual inline (pathentic attempt to reduce stack depth)
} }
finally finally
{ {
//if we accessed an existing session entering this context, then complete it
if (access != null)
complete(access);
//if there is a session that was created during handling this context, then complete it //if there is a session that was created during handling this context, then complete it
HttpSession session = baseRequest.getSession(false); HttpSession finalSession = baseRequest.getSession(false);
if ((session != null && old_session == null && session != access) && (request.getDispatcherType() == DispatcherType.ASYNC || request.getDispatcherType() == DispatcherType.REQUEST)) if ((finalSession != null) && (old_session_manager != this))
complete(session); {
complete((Session)finalSession, baseRequest);
}
if (old_session_manager != null && old_session_manager != this) if (old_session_manager != null && old_session_manager != this)
{ {

View File

@ -56,7 +56,7 @@ import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.server.handler.ErrorHandler; import org.eclipse.jetty.server.handler.ErrorHandler;
import org.eclipse.jetty.server.session.DefaultSessionIdManager; import org.eclipse.jetty.server.session.DefaultSessionIdManager;
import org.eclipse.jetty.server.session.DefaultSessionCache; import org.eclipse.jetty.server.session.DefaultSessionCache;
import org.eclipse.jetty.server.session.NullSessionStore; import org.eclipse.jetty.server.session.NullSessionDataStore;
import org.eclipse.jetty.server.session.Session; import org.eclipse.jetty.server.session.Session;
import org.eclipse.jetty.server.session.SessionData; import org.eclipse.jetty.server.session.SessionData;
import org.eclipse.jetty.server.session.SessionHandler; import org.eclipse.jetty.server.session.SessionHandler;
@ -514,8 +514,8 @@ public class ResponseTest
request.setRequestedSessionIdFromCookie(false); request.setRequestedSessionIdFromCookie(false);
SessionHandler handler = new SessionHandler(); SessionHandler handler = new SessionHandler();
DefaultSessionCache ss = new DefaultSessionCache(handler); DefaultSessionCache ss = new DefaultSessionCache(handler);
NullSessionStore ds = new NullSessionStore(); NullSessionDataStore ds = new NullSessionDataStore();
ss.setSessionStore(ds); ss.setSessionDataStore(ds);
handler.setSessionIdManager(new DefaultSessionIdManager(_server)); handler.setSessionIdManager(new DefaultSessionIdManager(_server));
request.setSessionHandler(handler); request.setSessionHandler(handler);
TestSession tsession = new TestSession(handler, "12345"); TestSession tsession = new TestSession(handler, "12345");
@ -594,10 +594,10 @@ public class ResponseTest
request.setRequestedSessionIdFromCookie(i>2); request.setRequestedSessionIdFromCookie(i>2);
SessionHandler handler = new SessionHandler(); SessionHandler handler = new SessionHandler();
NullSessionStore ds = new NullSessionStore(); NullSessionDataStore ds = new NullSessionDataStore();
DefaultSessionCache ss = new DefaultSessionCache(handler); DefaultSessionCache ss = new DefaultSessionCache(handler);
handler.setSessionStore(ss); handler.setSessionCache(ss);
ss.setSessionStore(ds); ss.setSessionDataStore(ds);
handler.setSessionIdManager(new DefaultSessionIdManager(_server)); handler.setSessionIdManager(new DefaultSessionIdManager(_server));
request.setSessionHandler(handler); request.setSessionHandler(handler);
request.setSession(new TestSession(handler, "12345")); request.setSession(new TestSession(handler, "12345"));
@ -898,8 +898,7 @@ public class ResponseTest
{ {
protected TestSession(SessionHandler handler, String id) protected TestSession(SessionHandler handler, String id)
{ {
super(new SessionData(id, "", "0.0.0.0", 0, 0, 0, 300)); super(handler, new SessionData(id, "", "0.0.0.0", 0, 0, 0, 300));
setSessionHandler(handler);
} }
} }
} }

View File

@ -65,11 +65,11 @@ public class FileSessionManagerTest
idmgr.setServer(server); idmgr.setServer(server);
server.setSessionIdManager(idmgr); server.setSessionIdManager(idmgr);
FileSessionStore ds = new FileSessionStore(); FileSessionDataStore ds = new FileSessionDataStore();
ds.setDeleteUnrestorableFiles(true); ds.setDeleteUnrestorableFiles(true);
DefaultSessionCache ss = new DefaultSessionCache(handler); DefaultSessionCache ss = new DefaultSessionCache(handler);
handler.setSessionStore(ss); handler.setSessionCache(ss);
ss.setSessionStore(ds); ss.setSessionDataStore(ds);
//manager.setLazyLoad(true); //manager.setLazyLoad(true);
File testDir = MavenTestingUtils.getTargetTestingDir("hashes"); File testDir = MavenTestingUtils.getTargetTestingDir("hashes");
testDir.mkdirs(); testDir.mkdirs();
@ -101,9 +101,9 @@ public class FileSessionManagerTest
server.setSessionIdManager(idmgr); server.setSessionIdManager(idmgr);
DefaultSessionCache ss = new DefaultSessionCache(handler); DefaultSessionCache ss = new DefaultSessionCache(handler);
FileSessionStore ds = new FileSessionStore(); FileSessionDataStore ds = new FileSessionDataStore();
ss.setSessionStore(ds); ss.setSessionDataStore(ds);
handler.setSessionStore(ss); handler.setSessionCache(ss);
ds.setDeleteUnrestorableFiles(true); ds.setDeleteUnrestorableFiles(true);
handler.setSessionIdManager(idmgr); handler.setSessionIdManager(idmgr);
@ -136,9 +136,9 @@ public class FileSessionManagerTest
handler.setServer(server); handler.setServer(server);
DefaultSessionCache ss = new DefaultSessionCache(handler); DefaultSessionCache ss = new DefaultSessionCache(handler);
FileSessionStore ds = new FileSessionStore(); FileSessionDataStore ds = new FileSessionDataStore();
ss.setSessionStore(ds); ss.setSessionDataStore(ds);
handler.setSessionStore(ss); handler.setSessionCache(ss);
ds.setStoreDir(testDir); ds.setStoreDir(testDir);
handler.setMaxInactiveInterval(5); handler.setMaxInactiveInterval(5);
Assert.assertTrue(testDir.exists()); Assert.assertTrue(testDir.exists());

View File

@ -165,13 +165,13 @@ public class SessionCookieTest
idMgr.setWorkerName("node1"); idMgr.setWorkerName("node1");
SessionHandler mgr = new SessionHandler(); SessionHandler mgr = new SessionHandler();
MockSessionStore store = new MockSessionStore(mgr); MockSessionStore store = new MockSessionStore(mgr);
store.setSessionStore(new NullSessionStore()); store.setSessionDataStore(new NullSessionDataStore());
mgr.setSessionStore(store); mgr.setSessionCache(store);
mgr.setSessionIdManager(idMgr); mgr.setSessionIdManager(idMgr);
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
Session session = new Session(new SessionData("123", "_foo", "0.0.0.0", now, now, now, 30)); Session session = new Session(null, new SessionData("123", "_foo", "0.0.0.0", now, now, now, 30));
SessionCookieConfig sessionCookieConfig = mgr.getSessionCookieConfig(); SessionCookieConfig sessionCookieConfig = mgr.getSessionCookieConfig();
sessionCookieConfig.setSecure(true); sessionCookieConfig.setSecure(true);

View File

@ -70,15 +70,16 @@ public class FileTestServer extends AbstractTestServer
assertFalse(files.length==0); assertFalse(files.length==0);
} }
} }
public static void assertFileExists (String sessionId, boolean exists) public static void assertFileExists (String sessionId, boolean exists)
{ {
assertNotNull(_tmpDir); assertNotNull(_tmpDir);
assertTrue(_tmpDir.exists()); assertTrue(_tmpDir.exists());
String[] files = _tmpDir.list(); String[] files = _tmpDir.list();
assertNotNull(files); assertNotNull(files);
assertFalse(files.length == 0); if (exists)
assertFalse(files.length == 0);
boolean found = false; boolean found = false;
for (String name:files) for (String name:files)
{ {
@ -143,10 +144,10 @@ public class FileTestServer extends AbstractTestServer
{ {
SessionHandler handler = new SessionHandler(); SessionHandler handler = new SessionHandler();
DefaultSessionCache ss = new DefaultSessionCache(handler); DefaultSessionCache ss = new DefaultSessionCache(handler);
handler.setSessionStore(ss); handler.setSessionCache(ss);
FileSessionStore ds = new FileSessionStore(); FileSessionDataStore ds = new FileSessionDataStore();
ds.setStoreDir(_tmpDir); ds.setStoreDir(_tmpDir);
ss.setSessionStore(ds); ss.setSessionDataStore(ds);
return handler; return handler;
} }

View File

@ -47,9 +47,9 @@ public class IdleSessionTest extends AbstractIdleSessionTest
* @see org.eclipse.jetty.server.session.AbstractIdleSessionTest#createServer(int, int, int, int) * @see org.eclipse.jetty.server.session.AbstractIdleSessionTest#createServer(int, int, int, int)
*/ */
@Override @Override
public AbstractTestServer createServer(final int port, final int max, final int scavenge, final int idleSec) public AbstractTestServer createServer(final int port, final int max, final int scavenge, final int evictionPolicy)
{ {
return new FileTestServer(port,max,scavenge, idleSec); return new FileTestServer(port,max,scavenge, evictionPolicy);
} }
@ -71,7 +71,7 @@ public class IdleSessionTest extends AbstractIdleSessionTest
public void checkSessionDeIdled(String sessionId) public void checkSessionDeIdled(String sessionId)
{ {
//Can't check absence of file to indicate session is de-idled //Can't check absence of file to indicate session is de-idled
//because the FileSessionStore writes out the session to a file if anything changes. //because the FileSessionDataStore writes out the session to a file if anything changes.
//The test changes an attribute so the file will probably exist. //The test changes an attribute so the file will probably exist.
} }
@ -83,6 +83,7 @@ public class IdleSessionTest extends AbstractIdleSessionTest
public void deleteSessionData(String sessionId) public void deleteSessionData(String sessionId)
{ {
FileTestServer.deleteFile(sessionId); FileTestServer.deleteFile(sessionId);
FileTestServer.assertFileExists(sessionId, false);
} }

View File

@ -37,9 +37,9 @@ public class ImmortalSessionTest extends AbstractImmortalSessionTest
@Override @Override
public AbstractTestServer createServer(int port, int max, int scavenge,int idlePassivatePeriod) public AbstractTestServer createServer(int port, int max, int scavenge,int evictionPolicy)
{ {
return new FileTestServer(port,max,scavenge, idlePassivatePeriod); return new FileTestServer(port,max,scavenge, evictionPolicy);
} }
} }

View File

@ -40,9 +40,9 @@ public class NewSessionTest extends AbstractNewSessionTest
FileTestServer.teardown(); FileTestServer.teardown();
} }
public AbstractTestServer createServer(int port, int max, int scavenge,int idlePassivatePeriod) public AbstractTestServer createServer(int port, int max, int scavenge,int evictionPolicy)
{ {
return new FileTestServer(port,max,scavenge,idlePassivatePeriod); return new FileTestServer(port,max,scavenge,evictionPolicy);
} }
@Test @Test

View File

@ -39,9 +39,9 @@ public class OrphanedSessionTest extends AbstractOrphanedSessionTest
FileTestServer.teardown(); FileTestServer.teardown();
} }
public AbstractTestServer createServer(int port, int max, int scavenge,int idlePassivatePeriod) public AbstractTestServer createServer(int port, int max, int scavenge,int evictionPolicy)
{ {
return new FileTestServer(port,max,scavenge,idlePassivatePeriod); return new FileTestServer(port,max,scavenge,evictionPolicy);
} }
@Test @Test

View File

@ -50,9 +50,9 @@ public class ProxySerializationTest extends AbstractProxySerializationTest
* @see org.eclipse.jetty.server.session.AbstractProxySerializationTest#createServer(int, int, int) * @see org.eclipse.jetty.server.session.AbstractProxySerializationTest#createServer(int, int, int)
*/ */
@Override @Override
public AbstractTestServer createServer(int port, int max, int scavenge,int idlePassivatePeriod ) public AbstractTestServer createServer(int port, int max, int scavenge,int evictionPolicy )
{ {
return new FileTestServer(port,max,scavenge, idlePassivatePeriod); return new FileTestServer(port,max,scavenge, evictionPolicy);
} }

View File

@ -41,9 +41,9 @@ public class ReentrantRequestSessionTest extends AbstractReentrantRequestSession
} }
public AbstractTestServer createServer(int port, int max, int scavenge, int idlePassivatePeriod) public AbstractTestServer createServer(int port, int max, int scavenge, int evictionPolicy)
{ {
return new FileTestServer(port, max, scavenge, idlePassivatePeriod); return new FileTestServer(port, max, scavenge, evictionPolicy);
} }
@Test @Test

View File

@ -38,9 +38,9 @@ public class RemoveSessionTest extends AbstractRemoveSessionTest
} }
public AbstractTestServer createServer(int port, int max, int scavenge,int idlePassivatePeriod) public AbstractTestServer createServer(int port, int max, int scavenge,int evictionPolicy)
{ {
return new FileTestServer(port,max,scavenge,idlePassivatePeriod); return new FileTestServer(port,max,scavenge,evictionPolicy);
} }
@Test @Test

View File

@ -40,9 +40,9 @@ public class SessionCookieTest extends AbstractSessionCookieTest
@Override @Override
public AbstractTestServer createServer(int port, int max, int scavenge,int idlePassivatePeriod) public AbstractTestServer createServer(int port, int max, int scavenge,int evictionPolicy)
{ {
return new FileTestServer(port, max, scavenge,idlePassivatePeriod); return new FileTestServer(port, max, scavenge,evictionPolicy);
} }
} }

View File

@ -38,9 +38,9 @@ public class SessionInvalidateAndCreateTest extends AbstractSessionInvalidateAnd
} }
@Override @Override
public AbstractTestServer createServer(int port, int max, int scavenge,int idlePassivatePeriod) public AbstractTestServer createServer(int port, int max, int scavenge,int evictionPolicy)
{ {
return new FileTestServer(port,max,scavenge,idlePassivatePeriod); return new FileTestServer(port,max,scavenge,evictionPolicy);
} }
@Test @Test

View File

@ -40,9 +40,9 @@ public class SessionRenewTest extends AbstractSessionRenewTest
} }
@Override @Override
public AbstractTestServer createServer(int port, int max, int scavenge,int idlePassivatePeriod) public AbstractTestServer createServer(int port, int max, int scavenge,int evictionPolicy)
{ {
return new FileTestServer(port, max, scavenge,idlePassivatePeriod); return new FileTestServer(port, max, scavenge,evictionPolicy);
} }
@Test @Test

View File

@ -38,9 +38,9 @@ public class SessionValueSharedSaving extends AbstractSessionValueSavingTest
@Override @Override
public AbstractTestServer createServer(int port, int max, int scavenge,int idlePassivatePeriod) public AbstractTestServer createServer(int port, int max, int scavenge,int evictionPolicy)
{ {
return new FileTestServer(port,max,scavenge,idlePassivatePeriod); return new FileTestServer(port,max,scavenge,evictionPolicy);
} }
} }

View File

@ -297,7 +297,7 @@ public class GCloudSessionTestSupport
public void listSessions () throws Exception public void listSessions () throws Exception
{ {
ensureDatastore(); ensureDatastore();
GqlQuery.Builder builder = Query.gqlQueryBuilder(ResultType.ENTITY, "select * from "+GCloudSessionStore.KIND); GqlQuery.Builder builder = Query.gqlQueryBuilder(ResultType.ENTITY, "select * from "+GCloudSessionDataStore.KIND);
Query<Entity> query = builder.build(); Query<Entity> query = builder.build();
@ -317,7 +317,7 @@ public class GCloudSessionTestSupport
{ {
HashSet<String> ids = new HashSet<String>(); HashSet<String> ids = new HashSet<String>();
ensureDatastore(); ensureDatastore();
GqlQuery.Builder builder = Query.gqlQueryBuilder(ResultType.ENTITY, "select * from "+GCloudSessionStore.KIND); GqlQuery.Builder builder = Query.gqlQueryBuilder(ResultType.ENTITY, "select * from "+GCloudSessionDataStore.KIND);
Query<Entity> query = builder.build(); Query<Entity> query = builder.build();
@ -336,7 +336,7 @@ public class GCloudSessionTestSupport
{ {
ensureDatastore(); ensureDatastore();
StructuredQuery<ProjectionEntity> keyOnlyProjectionQuery = Query.projectionEntityQueryBuilder() StructuredQuery<ProjectionEntity> keyOnlyProjectionQuery = Query.projectionEntityQueryBuilder()
.kind(GCloudSessionStore.KIND) .kind(GCloudSessionDataStore.KIND)
.projection(Projection.property("__key__")) .projection(Projection.property("__key__"))
.limit(100) .limit(100)
.build(); .build();
@ -355,7 +355,7 @@ public class GCloudSessionTestSupport
{ {
ensureDatastore(); ensureDatastore();
StructuredQuery<ProjectionEntity> keyOnlyProjectionQuery = Query.projectionEntityQueryBuilder() StructuredQuery<ProjectionEntity> keyOnlyProjectionQuery = Query.projectionEntityQueryBuilder()
.kind(GCloudSessionStore.KIND) .kind(GCloudSessionDataStore.KIND)
.projection(Projection.property("__key__")) .projection(Projection.property("__key__"))
.limit(100) .limit(100)
.build(); .build();

View File

@ -65,11 +65,11 @@ public class GCloudTestServer extends AbstractTestServer
{ {
SessionHandler handler = new SessionHandler(); SessionHandler handler = new SessionHandler();
handler.setSessionIdManager(_sessionIdManager); handler.setSessionIdManager(_sessionIdManager);
GCloudSessionStore ds = new GCloudSessionStore(); GCloudSessionDataStore ds = new GCloudSessionDataStore();
ds.setGCloudConfiguration((GCloudConfiguration)_config); ds.setGCloudConfiguration((GCloudConfiguration)_config);
DefaultSessionCache ss = new DefaultSessionCache(handler); DefaultSessionCache ss = new DefaultSessionCache(handler);
ss.setSessionStore(ds); ss.setSessionDataStore(ds);
handler.setSessionStore(ss); handler.setSessionCache(ss);
return handler; return handler;
} }

View File

@ -53,9 +53,9 @@ public class ImmortalSessionTest extends AbstractImmortalSessionTest
* @see org.eclipse.jetty.server.session.AbstractImmortalSessionTest#createServer(int, int, int) * @see org.eclipse.jetty.server.session.AbstractImmortalSessionTest#createServer(int, int, int)
*/ */
@Override @Override
public AbstractTestServer createServer(int port, int maxInactiveMs, int scavengeMs,int idlePassivatePeriod) public AbstractTestServer createServer(int port, int maxInactiveMs, int scavengeMs,int evictionPolicy)
{ {
return new GCloudTestServer(port, maxInactiveMs, scavengeMs, idlePassivatePeriod, _testSupport.getConfiguration()); return new GCloudTestServer(port, maxInactiveMs, scavengeMs, evictionPolicy, _testSupport.getConfiguration());
} }
@Test @Test

View File

@ -35,7 +35,7 @@ import org.junit.Ignore;
public class InvalidationSessionTest extends AbstractInvalidationSessionTest public class InvalidationSessionTest extends AbstractInvalidationSessionTest
{ {
static GCloudSessionTestSupport _testSupport; static GCloudSessionTestSupport _testSupport;
public static final int IDLE_PASSIVATE_SEC = 3; public static final int EVICT_SEC = 3;
@BeforeClass @BeforeClass
public static void setup () throws Exception public static void setup () throws Exception
@ -54,9 +54,9 @@ public class InvalidationSessionTest extends AbstractInvalidationSessionTest
* @see org.eclipse.jetty.server.session.AbstractInvalidationSessionTest#createServer(int) * @see org.eclipse.jetty.server.session.AbstractInvalidationSessionTest#createServer(int)
*/ */
@Override @Override
public AbstractTestServer createServer(int port, int maxInactive, int scavengeInterval, int idlePassivateInterval) public AbstractTestServer createServer(int port, int maxInactive, int scavengeInterval, int evictionPolicy)
{ {
GCloudTestServer server = new GCloudTestServer(port, maxInactive, scavengeInterval, idlePassivateInterval, _testSupport.getConfiguration()) GCloudTestServer server = new GCloudTestServer(port, maxInactive, scavengeInterval, evictionPolicy, _testSupport.getConfiguration())
{ {
/** /**
* @see org.eclipse.jetty.gcloud.session.GCloudTestServer#newSessionManager() * @see org.eclipse.jetty.gcloud.session.GCloudTestServer#newSessionManager()
@ -65,7 +65,7 @@ public class InvalidationSessionTest extends AbstractInvalidationSessionTest
public SessionHandler newSessionHandler() public SessionHandler newSessionHandler()
{ {
SessionHandler handler = super.newSessionHandler(); SessionHandler handler = super.newSessionHandler();
handler.getSessionStore().setIdlePassivationTimeoutSec(IDLE_PASSIVATE_SEC); handler.getSessionCache().setEvictionPolicy(EVICT_SEC);
return handler; return handler;
} }
@ -84,7 +84,7 @@ public class InvalidationSessionTest extends AbstractInvalidationSessionTest
//has expired on node2 for it to reload the session and discover it has been deleted. //has expired on node2 for it to reload the session and discover it has been deleted.
try try
{ {
Thread.currentThread().sleep((2*IDLE_PASSIVATE_SEC)*1000); Thread.currentThread().sleep((2*EVICT_SEC)*1000);
} }
catch (Exception e) catch (Exception e)
{ {

View File

@ -50,9 +50,9 @@ public class LastAccessTimeTest extends AbstractLastAccessTimeTest
* @see org.eclipse.jetty.server.session.AbstractLastAccessTimeTest#createServer(int, int, int) * @see org.eclipse.jetty.server.session.AbstractLastAccessTimeTest#createServer(int, int, int)
*/ */
@Override @Override
public AbstractTestServer createServer(int port, int max, int scavenge,int idlePassivatePeriod) public AbstractTestServer createServer(int port, int max, int scavenge,int evictionPolicy)
{ {
return new GCloudTestServer(port, max, scavenge, idlePassivatePeriod, _testSupport.getConfiguration()); return new GCloudTestServer(port, max, scavenge, evictionPolicy, _testSupport.getConfiguration());
} }
@Test @Test

View File

@ -51,9 +51,9 @@ public class LocalSessionScavengingTest extends AbstractLocalSessionScavengingTe
* @see org.eclipse.jetty.server.session.AbstractLocalSessionScavengingTest#createServer(int, int, int) * @see org.eclipse.jetty.server.session.AbstractLocalSessionScavengingTest#createServer(int, int, int)
*/ */
@Override @Override
public AbstractTestServer createServer(int port, int max, int scavenge,int idlePassivatePeriod) public AbstractTestServer createServer(int port, int max, int scavenge,int evictionPolicy)
{ {
return new GCloudTestServer(port, max, scavenge, idlePassivatePeriod, _testSupport.getConfiguration()); return new GCloudTestServer(port, max, scavenge, evictionPolicy, _testSupport.getConfiguration());
} }
@Test @Test

View File

@ -57,9 +57,9 @@ public class NewSessionTest extends AbstractNewSessionTest
* @see org.eclipse.jetty.server.session.AbstractNewSessionTest#createServer(int, int, int) * @see org.eclipse.jetty.server.session.AbstractNewSessionTest#createServer(int, int, int)
*/ */
@Override @Override
public AbstractTestServer createServer(int port, int max, int scavenge,int idlePassivatePeriod) public AbstractTestServer createServer(int port, int max, int scavenge,int evictionPolicy)
{ {
return new GCloudTestServer(port, max, scavenge, idlePassivatePeriod, _testSupport.getConfiguration()); return new GCloudTestServer(port, max, scavenge, evictionPolicy, _testSupport.getConfiguration());
} }
@Test @Test

View File

@ -52,9 +52,9 @@ public class OrphanedSessionTest extends AbstractOrphanedSessionTest
* @see org.eclipse.jetty.server.session.AbstractOrphanedSessionTest#createServer(int, int, int) * @see org.eclipse.jetty.server.session.AbstractOrphanedSessionTest#createServer(int, int, int)
*/ */
@Override @Override
public AbstractTestServer createServer(int port, int max, int scavenge,int idlePassivatePeriod) public AbstractTestServer createServer(int port, int max, int scavenge,int evictionPolicy)
{ {
return new GCloudTestServer(port, max, scavenge, idlePassivatePeriod, _testSupport.getConfiguration()); return new GCloudTestServer(port, max, scavenge, evictionPolicy, _testSupport.getConfiguration());
} }
@Test @Test

View File

@ -51,9 +51,9 @@ public class ReentrantRequestSessionTest extends AbstractReentrantRequestSession
* @see org.eclipse.jetty.server.session.AbstractReentrantRequestSessionTest#createServer(int) * @see org.eclipse.jetty.server.session.AbstractReentrantRequestSessionTest#createServer(int)
*/ */
@Override @Override
public AbstractTestServer createServer(int port,int max, int scavengePeriod,int idlePassivatePeriod) public AbstractTestServer createServer(int port,int max, int scavengePeriod,int evictionPolicy)
{ {
return new GCloudTestServer(port, max, scavengePeriod, idlePassivatePeriod, _testSupport.getConfiguration()); return new GCloudTestServer(port, max, scavengePeriod, evictionPolicy, _testSupport.getConfiguration());
} }
@Test @Test

View File

@ -54,9 +54,9 @@ public class RemoveSessionTest extends AbstractRemoveSessionTest
* @see org.eclipse.jetty.server.session.AbstractRemoveSessionTest#createServer(int, int, int) * @see org.eclipse.jetty.server.session.AbstractRemoveSessionTest#createServer(int, int, int)
*/ */
@Override @Override
public AbstractTestServer createServer(int port, int max, int scavenge,int idlePassivatePeriod) public AbstractTestServer createServer(int port, int max, int scavenge,int evictionPolicy)
{ {
return new GCloudTestServer(port, max, scavenge, idlePassivatePeriod, _testSupport.getConfiguration()); return new GCloudTestServer(port, max, scavenge, evictionPolicy, _testSupport.getConfiguration());
} }
@Test @Test

View File

@ -53,9 +53,9 @@ public class SameNodeLoadTest extends AbstractSameNodeLoadTest
* @see org.eclipse.jetty.server.session.AbstractSameNodeLoadTest#createServer(int, int, int, int) * @see org.eclipse.jetty.server.session.AbstractSameNodeLoadTest#createServer(int, int, int, int)
*/ */
@Override @Override
public AbstractTestServer createServer(int port, int max, int scavenge, int idlePassivationPeriod) public AbstractTestServer createServer(int port, int max, int scavenge, int evictionPolicy)
{ {
return new GCloudTestServer(port, max, scavenge, idlePassivationPeriod, _testSupport.getConfiguration()); return new GCloudTestServer(port, max, scavenge, evictionPolicy, _testSupport.getConfiguration());
} }
@Test @Test

View File

@ -57,9 +57,9 @@ public class SessionExpiryTest extends AbstractSessionExpiryTest
* @see org.eclipse.jetty.server.session.AbstractSessionExpiryTest#createServer(int, int, int) * @see org.eclipse.jetty.server.session.AbstractSessionExpiryTest#createServer(int, int, int)
*/ */
@Override @Override
public AbstractTestServer createServer(int port, int max, int scavenge, int idlePassivationPeriod) public AbstractTestServer createServer(int port, int max, int scavenge, int evictionPolicy)
{ {
return new GCloudTestServer(port, max, scavenge, idlePassivationPeriod, _testSupport.getConfiguration()); return new GCloudTestServer(port, max, scavenge, evictionPolicy, _testSupport.getConfiguration());
} }
@Test @Test

View File

@ -53,9 +53,9 @@ public class SessionInvalidateAndCreateTest extends AbstractSessionInvalidateAnd
* @see org.eclipse.jetty.server.session.AbstractSessionInvalidateAndCreateTest#createServer(int, int, int) * @see org.eclipse.jetty.server.session.AbstractSessionInvalidateAndCreateTest#createServer(int, int, int)
*/ */
@Override @Override
public AbstractTestServer createServer(int port, int max, int scavenge, int idlePassivationPeriod) public AbstractTestServer createServer(int port, int max, int scavenge, int evictionPolicy)
{ {
return new GCloudTestServer(port, max, scavenge, idlePassivationPeriod, _testSupport.getConfiguration()); return new GCloudTestServer(port, max, scavenge, evictionPolicy, _testSupport.getConfiguration());
} }
@Test @Test

View File

@ -56,9 +56,9 @@ public class SessionRenewTest extends AbstractSessionRenewTest
* @see org.eclipse.jetty.server.session.AbstractSessionRenewTest#createServer(int, int, int) * @see org.eclipse.jetty.server.session.AbstractSessionRenewTest#createServer(int, int, int)
*/ */
@Override @Override
public AbstractTestServer createServer(int port, int max, int scavenge, int idlePassivationPeriod) public AbstractTestServer createServer(int port, int max, int scavenge, int evictionPolicy)
{ {
return new GCloudTestServer(port,max, scavenge, idlePassivationPeriod, _testSupport.getConfiguration()); return new GCloudTestServer(port,max, scavenge, evictionPolicy, _testSupport.getConfiguration());
} }
@Test @Test

View File

@ -52,9 +52,9 @@ public class SessionValueSavingTest extends AbstractSessionValueSavingTest
* @see org.eclipse.jetty.server.session.AbstractSessionValueSavingTest#createServer(int, int, int) * @see org.eclipse.jetty.server.session.AbstractSessionValueSavingTest#createServer(int, int, int)
*/ */
@Override @Override
public AbstractTestServer createServer(int port, int max, int scavenge, int idlePassivationPeriod) public AbstractTestServer createServer(int port, int max, int scavenge, int evictionPolicy)
{ {
return new GCloudTestServer(port, max, scavenge, idlePassivationPeriod, _testSupport.getConfiguration()); return new GCloudTestServer(port, max, scavenge, evictionPolicy, _testSupport.getConfiguration());
} }
@Test @Test

View File

@ -33,9 +33,9 @@ public class HashTestServer extends AbstractTestServer
super(port, 30, 10, 2); super(port, 30, 10, 2);
} }
public HashTestServer(int port, int maxInactivePeriod, int scavengePeriod, int idlePassivatePeriod) public HashTestServer(int port, int maxInactivePeriod, int scavengePeriod, int evictionPolicy)
{ {
super(port, maxInactivePeriod, scavengePeriod, idlePassivatePeriod); super(port, maxInactivePeriod, scavengePeriod, evictionPolicy);
} }
@ -44,8 +44,8 @@ public class HashTestServer extends AbstractTestServer
{ {
SessionHandler handler = new SessionHandler(); SessionHandler handler = new SessionHandler();
DefaultSessionCache ss = new DefaultSessionCache(handler); DefaultSessionCache ss = new DefaultSessionCache(handler);
handler.setSessionStore(ss); handler.setSessionCache(ss);
ss.setSessionStore(new NullSessionStore()); ss.setSessionDataStore(new NullSessionDataStore());
return handler; return handler;
} }

View File

@ -22,9 +22,9 @@ public class ImmortalSessionTest extends AbstractImmortalSessionTest
{ {
@Override @Override
public AbstractTestServer createServer(int port, int max, int scavenge, int idlePassivationPeriod) public AbstractTestServer createServer(int port, int max, int scavenge, int evictionPolicy)
{ {
return new HashTestServer(port,max,scavenge,idlePassivationPeriod); return new HashTestServer(port,max,scavenge,evictionPolicy);
} }
} }

View File

@ -26,9 +26,9 @@ import org.junit.Test;
public class NewSessionTest extends AbstractNewSessionTest public class NewSessionTest extends AbstractNewSessionTest
{ {
public AbstractTestServer createServer(int port, int max, int scavenge, int idlePassivationPeriod) public AbstractTestServer createServer(int port, int max, int scavenge, int evictionPolicy)
{ {
return new HashTestServer(port,max,scavenge,idlePassivationPeriod); return new HashTestServer(port,max,scavenge,evictionPolicy);
} }
@Test @Test

View File

@ -30,9 +30,9 @@ public class ReentrantRequestSessionTest extends AbstractReentrantRequestSession
* @see org.eclipse.jetty.server.session.AbstractReentrantRequestSessionTest#createServer(int, int, int, int) * @see org.eclipse.jetty.server.session.AbstractReentrantRequestSessionTest#createServer(int, int, int, int)
*/ */
@Override @Override
public AbstractTestServer createServer(int port, int max, int scavenge, int idlePassivatePeriod) public AbstractTestServer createServer(int port, int max, int scavenge, int evictionPolicy)
{ {
return new HashTestServer(port, max, scavenge, idlePassivatePeriod); return new HashTestServer(port, max, scavenge, evictionPolicy);
} }
@Test @Test

View File

@ -34,9 +34,9 @@ public class RemoveSessionTest extends AbstractRemoveSessionTest
* @see org.eclipse.jetty.server.session.AbstractRemoveSessionTest#createServer(int, int, int, int) * @see org.eclipse.jetty.server.session.AbstractRemoveSessionTest#createServer(int, int, int, int)
*/ */
@Override @Override
public AbstractTestServer createServer(int port, int max, int scavenge, int idlePassivationPeriod) public AbstractTestServer createServer(int port, int max, int scavenge, int evictionPolicy)
{ {
return new HashTestServer (port, max, scavenge, idlePassivationPeriod); return new HashTestServer (port, max, scavenge, evictionPolicy);
} }
} }

View File

@ -22,9 +22,9 @@ public class SessionCookieTest extends AbstractSessionCookieTest
{ {
@Override @Override
public AbstractTestServer createServer(int port, int max, int scavenge, int idlePassivationPeriod) public AbstractTestServer createServer(int port, int max, int scavenge, int evictionPolicy)
{ {
return new HashTestServer(port, max, scavenge, idlePassivationPeriod); return new HashTestServer(port, max, scavenge, evictionPolicy);
} }
} }

View File

@ -24,9 +24,9 @@ public class SessionInvalidateAndCreateTest extends AbstractSessionInvalidateAnd
{ {
@Override @Override
public AbstractTestServer createServer(int port, int max, int scavenge, int idlePassivationPeriod) public AbstractTestServer createServer(int port, int max, int scavenge, int evictionPolicy)
{ {
return new HashTestServer(port,max,scavenge,idlePassivationPeriod); return new HashTestServer(port,max,scavenge,evictionPolicy);
} }
@Test @Test

View File

@ -31,9 +31,9 @@ public class SessionRenewTest extends AbstractSessionRenewTest
{ {
@Override @Override
public AbstractTestServer createServer(int port, int max, int scavenge, int idlePassivationPeriod) public AbstractTestServer createServer(int port, int max, int scavenge, int evictionPolicy)
{ {
return new HashTestServer(port, max, scavenge,idlePassivationPeriod); return new HashTestServer(port, max, scavenge,evictionPolicy);
} }
@Test @Test

View File

@ -22,9 +22,9 @@ public class SessionValueSharedSaving extends AbstractSessionValueSavingTest
{ {
@Override @Override
public AbstractTestServer createServer(int port, int max, int scavenge, int idlePassivationPeriod) public AbstractTestServer createServer(int port, int max, int scavenge, int evictionPolicy)
{ {
return new HashTestServer(port,max,scavenge,idlePassivationPeriod); return new HashTestServer(port,max,scavenge,evictionPolicy);
} }
} }

View File

@ -56,9 +56,9 @@ public class ImmortalSessionTest extends AbstractImmortalSessionTest
* @see org.eclipse.jetty.server.session.AbstractImmortalSessionTest#createServer(int, int, int) * @see org.eclipse.jetty.server.session.AbstractImmortalSessionTest#createServer(int, int, int)
*/ */
@Override @Override
public AbstractTestServer createServer(int port, int maxInactiveMs, int scavenge, int idlePassivateInterval) public AbstractTestServer createServer(int port, int maxInactiveMs, int scavenge, int evictionPolicy)
{ {
return new InfinispanTestSessionServer(port, maxInactiveMs, scavenge, idlePassivateInterval, __testSupport.getCache()); return new InfinispanTestSessionServer(port, maxInactiveMs, scavenge, evictionPolicy, __testSupport.getCache());
} }
@Override @Override

View File

@ -20,7 +20,7 @@
package org.eclipse.jetty.server.session; package org.eclipse.jetty.server.session;
import org.eclipse.jetty.server.SessionIdManager; import org.eclipse.jetty.server.SessionIdManager;
import org.eclipse.jetty.session.infinispan.InfinispanSessionStore; import org.eclipse.jetty.session.infinispan.InfinispanSessionDataStore;
import org.eclipse.jetty.webapp.WebAppContext; import org.eclipse.jetty.webapp.WebAppContext;
import org.infinispan.Cache; import org.infinispan.Cache;
import org.infinispan.commons.api.BasicCache; import org.infinispan.commons.api.BasicCache;
@ -37,9 +37,9 @@ public class InfinispanTestSessionServer extends AbstractTestServer
public InfinispanTestSessionServer(int port, int maxInactivePeriod, int scavengePeriod, int idlePassivatePeriod, BasicCache config) public InfinispanTestSessionServer(int port, int maxInactivePeriod, int scavengePeriod, int evictionPolicy, BasicCache config)
{ {
super(port, maxInactivePeriod, scavengePeriod, idlePassivatePeriod, config); super(port, maxInactivePeriod, scavengePeriod, evictionPolicy, config);
} }
@ -48,11 +48,11 @@ public class InfinispanTestSessionServer extends AbstractTestServer
public SessionHandler newSessionHandler() public SessionHandler newSessionHandler()
{ {
SessionHandler handler = new SessionHandler(); SessionHandler handler = new SessionHandler();
InfinispanSessionStore sds = new InfinispanSessionStore(); InfinispanSessionDataStore sds = new InfinispanSessionDataStore();
sds.setCache((BasicCache)_config); sds.setCache((BasicCache)_config);
DefaultSessionCache ss = new DefaultSessionCache(handler); DefaultSessionCache ss = new DefaultSessionCache(handler);
ss.setSessionStore(sds); ss.setSessionDataStore(sds);
handler.setSessionStore(ss); handler.setSessionCache(ss);
return handler; return handler;
} }
@ -61,7 +61,7 @@ public class InfinispanTestSessionServer extends AbstractTestServer
BasicCache cache = (BasicCache)_config; BasicCache cache = (BasicCache)_config;
if (cache != null) if (cache != null)
{ {
return cache.containsKey(((InfinispanSessionStore)(context.getSessionHandler().getSessionStore().getSessionStore())).getCacheKey(id)); return cache.containsKey(((InfinispanSessionDataStore)(context.getSessionHandler().getSessionCache().getSessionDataStore())).getCacheKey(id));
} }
return false; return false;
@ -72,7 +72,7 @@ public class InfinispanTestSessionServer extends AbstractTestServer
BasicCache cache = (BasicCache)_config; BasicCache cache = (BasicCache)_config;
if (cache != null) if (cache != null)
{ {
return cache.get(((InfinispanSessionStore)(context.getSessionHandler().getSessionStore().getSessionStore())).getCacheKey(id)); return cache.get(((InfinispanSessionDataStore)(context.getSessionHandler().getSessionCache().getSessionDataStore())).getCacheKey(id));
} }
return null; return null;

View File

@ -42,9 +42,9 @@ public class LastAccessTimeTest extends AbstractLastAccessTimeTest
@Override @Override
public AbstractTestServer createServer(int port, int max, int scavenge, int idlePassivateInterval) public AbstractTestServer createServer(int port, int max, int scavenge, int evictionPolicy)
{ {
return new InfinispanTestSessionServer(port, max, scavenge, idlePassivateInterval, __testSupport.getCache()); return new InfinispanTestSessionServer(port, max, scavenge, evictionPolicy, __testSupport.getCache());
} }
@Override @Override

View File

@ -51,9 +51,9 @@ public class LocalSessionScavengingTest extends AbstractLocalSessionScavengingTe
* @see org.eclipse.jetty.server.session.AbstractLocalSessionScavengingTest#createServer(int, int, int) * @see org.eclipse.jetty.server.session.AbstractLocalSessionScavengingTest#createServer(int, int, int)
*/ */
@Override @Override
public AbstractTestServer createServer(int port, int max, int scavenge, int idlePassivateInterval) public AbstractTestServer createServer(int port, int max, int scavenge, int evictionPolicy)
{ {
return new InfinispanTestSessionServer(port, max, scavenge, idlePassivateInterval, __testSupport.getCache()); return new InfinispanTestSessionServer(port, max, scavenge, evictionPolicy, __testSupport.getCache());
} }
} }

View File

@ -50,9 +50,9 @@ public class NewSessionTest extends AbstractNewSessionTest
* @see org.eclipse.jetty.server.session.AbstractNewSessionTest#createServer(int, int, int) * @see org.eclipse.jetty.server.session.AbstractNewSessionTest#createServer(int, int, int)
*/ */
@Override @Override
public AbstractTestServer createServer(int port, int max, int scavenge, int idlePassivateInterval) public AbstractTestServer createServer(int port, int max, int scavenge, int evictionPolicy)
{ {
return new InfinispanTestSessionServer(port, max, scavenge, idlePassivateInterval, __testSupport.getCache()); return new InfinispanTestSessionServer(port, max, scavenge, evictionPolicy, __testSupport.getCache());
} }

View File

@ -49,9 +49,9 @@ public class ReentrantRequestSessionTest extends AbstractReentrantRequestSession
* @see org.eclipse.jetty.server.session.AbstractReentrantRequestSessionTest#createServer(int) * @see org.eclipse.jetty.server.session.AbstractReentrantRequestSessionTest#createServer(int)
*/ */
@Override @Override
public AbstractTestServer createServer(int port,int maxInactive, int scavenge, int idlePassivateInterval) public AbstractTestServer createServer(int port,int maxInactive, int scavenge, int evictionPolicy)
{ {
return new InfinispanTestSessionServer(port, maxInactive, scavenge, idlePassivateInterval, __testSupport.getCache()); return new InfinispanTestSessionServer(port, maxInactive, scavenge, evictionPolicy, __testSupport.getCache());
} }
@Override @Override

View File

@ -43,9 +43,9 @@ public class RemoveSessionTest extends AbstractRemoveSessionTest
@Override @Override
public AbstractTestServer createServer(int port, int max, int scavenge, int idlePassivateInterval) public AbstractTestServer createServer(int port, int max, int scavenge, int evictionPolicy)
{ {
InfinispanTestSessionServer s = new InfinispanTestSessionServer(port, max, scavenge, idlePassivateInterval, __testSupport.getCache()); InfinispanTestSessionServer s = new InfinispanTestSessionServer(port, max, scavenge, evictionPolicy, __testSupport.getCache());
return s; return s;
} }

View File

@ -51,9 +51,9 @@ public class SameNodeLoadTest extends AbstractSameNodeLoadTest
* @see org.eclipse.jetty.server.session.AbstractSameNodeLoadTest#createServer(int) * @see org.eclipse.jetty.server.session.AbstractSameNodeLoadTest#createServer(int)
*/ */
@Override @Override
public AbstractTestServer createServer(int port,int maxInactive, int scavenge, int idlePassivateInterval) public AbstractTestServer createServer(int port,int maxInactive, int scavenge, int evictionPolicy)
{ {
InfinispanTestSessionServer server = new InfinispanTestSessionServer(port,maxInactive, scavenge, idlePassivateInterval, __testSupport.getCache()); InfinispanTestSessionServer server = new InfinispanTestSessionServer(port,maxInactive, scavenge, evictionPolicy, __testSupport.getCache());
return server; return server;
} }

View File

@ -42,9 +42,9 @@ public class SessionExpiryTest extends AbstractSessionExpiryTest
} }
@Override @Override
public AbstractTestServer createServer(int port, int max, int scavenge, int idlePassivateInterval) public AbstractTestServer createServer(int port, int max, int scavenge, int evictionPolicy)
{ {
InfinispanTestSessionServer server = new InfinispanTestSessionServer(port, max, scavenge, idlePassivateInterval, __testSupport.getCache()); InfinispanTestSessionServer server = new InfinispanTestSessionServer(port, max, scavenge, evictionPolicy, __testSupport.getCache());
return server; return server;
} }

View File

@ -50,9 +50,9 @@ public class SessionInvalidateAndCreateTest extends AbstractSessionInvalidateAnd
* @see org.eclipse.jetty.server.session.AbstractSessionInvalidateAndCreateTest#createServer(int, int, int) * @see org.eclipse.jetty.server.session.AbstractSessionInvalidateAndCreateTest#createServer(int, int, int)
*/ */
@Override @Override
public AbstractTestServer createServer(int port, int max, int scavenge, int idlePassivateInterval) public AbstractTestServer createServer(int port, int max, int scavenge, int evictionPolicy)
{ {
return new InfinispanTestSessionServer(port, max, scavenge, idlePassivateInterval, __testSupport.getCache()); return new InfinispanTestSessionServer(port, max, scavenge, evictionPolicy, __testSupport.getCache());
} }
@Override @Override

View File

@ -57,9 +57,9 @@ public class SessionRenewTest extends AbstractSessionRenewTest
* @see org.eclipse.jetty.server.session.AbstractSessionRenewTest#createServer(int, int, int) * @see org.eclipse.jetty.server.session.AbstractSessionRenewTest#createServer(int, int, int)
*/ */
@Override @Override
public AbstractTestServer createServer(int port, int max, int scavenge, int idlePassivateInterval) public AbstractTestServer createServer(int port, int max, int scavenge, int evictionPolicy)
{ {
return new InfinispanTestSessionServer(port, max, scavenge, idlePassivateInterval, __testSupport.getCache()); return new InfinispanTestSessionServer(port, max, scavenge, evictionPolicy, __testSupport.getCache());
} }
@Test @Test

View File

@ -59,9 +59,9 @@ public class RemoteImmortalSessionTest extends AbstractImmortalSessionTest
* @see org.eclipse.jetty.server.session.AbstractImmortalSessionTest#createServer(int, int, int) * @see org.eclipse.jetty.server.session.AbstractImmortalSessionTest#createServer(int, int, int)
*/ */
@Override @Override
public AbstractTestServer createServer(int port, int maxInactiveMs, int scavenge, int idlePassivateInterval) public AbstractTestServer createServer(int port, int maxInactiveMs, int scavenge, int evictionPolicy)
{ {
return new InfinispanTestSessionServer(port, maxInactiveMs, scavenge, idlePassivateInterval, __testSupport.getCache()); return new InfinispanTestSessionServer(port, maxInactiveMs, scavenge, evictionPolicy, __testSupport.getCache());
} }
@Override @Override

View File

@ -56,9 +56,9 @@ public class RemoteInvalidationSessionTest extends AbstractInvalidationSessionTe
* @see org.eclipse.jetty.server.session.AbstractInvalidationSessionTest#createServer(int) * @see org.eclipse.jetty.server.session.AbstractInvalidationSessionTest#createServer(int)
*/ */
@Override @Override
public AbstractTestServer createServer(int port, int maxInterval, int scavengeInterval, int idlePassivateInterval) public AbstractTestServer createServer(int port, int maxInterval, int scavengeInterval, int evictionPolicy)
{ {
return new InfinispanTestSessionServer(port, maxInterval, scavengeInterval, idlePassivateInterval, __testSupport.getCache()); return new InfinispanTestSessionServer(port, maxInterval, scavengeInterval, evictionPolicy, __testSupport.getCache());
} }

View File

@ -52,9 +52,9 @@ public class RemoteLastAccessTimeTest extends AbstractLastAccessTimeTest
@Override @Override
public AbstractTestServer createServer(int port, int max, int scavenge, int idlePassivateInterval) public AbstractTestServer createServer(int port, int max, int scavenge, int evictionPolicy)
{ {
return new InfinispanTestSessionServer(port, max, scavenge, idlePassivateInterval, __testSupport.getCache()); return new InfinispanTestSessionServer(port, max, scavenge, evictionPolicy, __testSupport.getCache());
} }
@Override @Override

View File

@ -53,9 +53,9 @@ public class RemoteLocalSessionScavengingTest extends AbstractLocalSessionScaven
* @see org.eclipse.jetty.server.session.AbstractLocalSessionScavengingTest#createServer(int, int, int) * @see org.eclipse.jetty.server.session.AbstractLocalSessionScavengingTest#createServer(int, int, int)
*/ */
@Override @Override
public AbstractTestServer createServer(int port, int max, int scavenge, int idlePassivateInterval) public AbstractTestServer createServer(int port, int max, int scavenge, int evictionPolicy)
{ {
return new InfinispanTestSessionServer(port, max, scavenge, idlePassivateInterval, __testSupport.getCache()); return new InfinispanTestSessionServer(port, max, scavenge, evictionPolicy, __testSupport.getCache());
} }
} }

View File

@ -53,9 +53,9 @@ public class RemoteNewSessionTest extends AbstractNewSessionTest
* @see org.eclipse.jetty.server.session.AbstractNewSessionTest#createServer(int, int, int) * @see org.eclipse.jetty.server.session.AbstractNewSessionTest#createServer(int, int, int)
*/ */
@Override @Override
public AbstractTestServer createServer(int port, int max, int scavenge, int idlePassivateInterval) public AbstractTestServer createServer(int port, int max, int scavenge, int evictionPolicy)
{ {
return new InfinispanTestSessionServer(port, max, scavenge, idlePassivateInterval, __testSupport.getCache()); return new InfinispanTestSessionServer(port, max, scavenge, evictionPolicy, __testSupport.getCache());
} }

View File

@ -52,9 +52,9 @@ public class RemoteReentrantRequestSessionTest extends AbstractReentrantRequestS
* @see org.eclipse.jetty.server.session.AbstractReentrantRequestSessionTest#createServer(int) * @see org.eclipse.jetty.server.session.AbstractReentrantRequestSessionTest#createServer(int)
*/ */
@Override @Override
public AbstractTestServer createServer(int port, int maxInactive, int scavenge, int idlePassivateInterval) public AbstractTestServer createServer(int port, int maxInactive, int scavenge, int evictionPolicy)
{ {
return new InfinispanTestSessionServer(port, maxInactive, scavenge, idlePassivateInterval, __testSupport.getCache()); return new InfinispanTestSessionServer(port, maxInactive, scavenge, evictionPolicy, __testSupport.getCache());
} }
@Override @Override

View File

@ -46,9 +46,9 @@ public class RemoteRemoveSessionTest extends AbstractRemoveSessionTest
@Override @Override
public AbstractTestServer createServer(int port, int max, int scavenge, int idlePassivateInterval) public AbstractTestServer createServer(int port, int max, int scavenge, int evictionPolicy)
{ {
InfinispanTestSessionServer s = new InfinispanTestSessionServer(port, max, scavenge,idlePassivateInterval, __testSupport.getCache()); InfinispanTestSessionServer s = new InfinispanTestSessionServer(port, max, scavenge,evictionPolicy, __testSupport.getCache());
return s; return s;
} }

View File

@ -54,9 +54,9 @@ public class RemoteSameNodeLoadTest extends AbstractSameNodeLoadTest
* @see org.eclipse.jetty.server.session.AbstractSameNodeLoadTest#createServer(int) * @see org.eclipse.jetty.server.session.AbstractSameNodeLoadTest#createServer(int)
*/ */
@Override @Override
public AbstractTestServer createServer(int port, int maxInactive, int scavenge, int idlePassivateInterval) public AbstractTestServer createServer(int port, int maxInactive, int scavenge, int evictionPolicy)
{ {
InfinispanTestSessionServer server = new InfinispanTestSessionServer(port, maxInactive, scavenge,idlePassivateInterval, __testSupport.getCache()); InfinispanTestSessionServer server = new InfinispanTestSessionServer(port, maxInactive, scavenge,evictionPolicy, __testSupport.getCache());
return server; return server;
} }

View File

@ -45,9 +45,9 @@ public class RemoteSessionExpiryTest extends AbstractSessionExpiryTest
} }
@Override @Override
public AbstractTestServer createServer(int port, int max, int scavenge, int idlePassivateInterval) public AbstractTestServer createServer(int port, int max, int scavenge, int evictionPolicy)
{ {
InfinispanTestSessionServer server = new InfinispanTestSessionServer(port, max, scavenge, idlePassivateInterval, __testSupport.getCache()); InfinispanTestSessionServer server = new InfinispanTestSessionServer(port, max, scavenge, evictionPolicy, __testSupport.getCache());
return server; return server;
} }

View File

@ -53,9 +53,9 @@ public class RemoteSessionInvalidateAndCreateTest extends AbstractSessionInvalid
* @see org.eclipse.jetty.server.session.AbstractSessionInvalidateAndCreateTest#createServer(int, int, int) * @see org.eclipse.jetty.server.session.AbstractSessionInvalidateAndCreateTest#createServer(int, int, int)
*/ */
@Override @Override
public AbstractTestServer createServer(int port, int max, int scavenge, int idlePassivateInterval) public AbstractTestServer createServer(int port, int max, int scavenge, int evictionPolicy)
{ {
return new InfinispanTestSessionServer(port, max, scavenge, idlePassivateInterval, __testSupport.getCache()); return new InfinispanTestSessionServer(port, max, scavenge, evictionPolicy, __testSupport.getCache());
} }
@Override @Override

View File

@ -56,9 +56,9 @@ public class RemoteSessionRenewTest extends AbstractSessionRenewTest
* @see org.eclipse.jetty.server.session.AbstractSessionRenewTest#createServer(int, int, int) * @see org.eclipse.jetty.server.session.AbstractSessionRenewTest#createServer(int, int, int)
*/ */
@Override @Override
public AbstractTestServer createServer(int port, int max, int scavenge, int idlePassivateInterval) public AbstractTestServer createServer(int port, int max, int scavenge, int evictionPolicy)
{ {
return new InfinispanTestSessionServer(port, max, scavenge, idlePassivateInterval, __testSupport.getCache()); return new InfinispanTestSessionServer(port, max, scavenge, evictionPolicy, __testSupport.getCache());
} }
@Test @Test

View File

@ -58,12 +58,12 @@ public class DirtyAttributeTest
public static int INACTIVE = 4; public static int INACTIVE = 4;
public static int SCAVENGE = 1; public static int SCAVENGE = 1;
public static int INSPECT = 1; public static int INSPECT = 1;
public static int IDLE_PASSIVATE = 3; public static int EVICT_SECS = 3;
@Test @Test
public void testDirtyWrite() throws Exception public void testDirtyWrite() throws Exception
{ {
AbstractTestServer server = new JdbcTestServer(0,INACTIVE,SCAVENGE, IDLE_PASSIVATE); AbstractTestServer server = new JdbcTestServer(0,INACTIVE,SCAVENGE, EVICT_SECS);
ServletContextHandler ctxA = server.addContext("/mod"); ServletContextHandler ctxA = server.addContext("/mod");
ctxA.addServlet(TestDirtyServlet.class, "/test"); ctxA.addServlet(TestDirtyServlet.class, "/test");

View File

@ -29,9 +29,9 @@ import org.junit.Test;
public class ImmortalSessionTest extends AbstractImmortalSessionTest public class ImmortalSessionTest extends AbstractImmortalSessionTest
{ {
public AbstractTestServer createServer(int port, int maxInactiveMs, int scavengeMs, int idlePassivate) public AbstractTestServer createServer(int port, int maxInactiveMs, int scavengeMs, int evictionPolicy)
{ {
return new JdbcTestServer(port, maxInactiveMs, scavengeMs, idlePassivate); return new JdbcTestServer(port, maxInactiveMs, scavengeMs, evictionPolicy);
} }
@Test @Test

View File

@ -29,9 +29,9 @@ public class InvalidationSessionTest extends AbstractInvalidationSessionTest
{ {
public static final int IDLE_PASSIVATE_SEC = 3; public static final int IDLE_PASSIVATE_SEC = 3;
public AbstractTestServer createServer(int port, int maxInactive, int scavengeInterval, int idlePassivateInterval) public AbstractTestServer createServer(int port, int maxInactive, int scavengeInterval, int evictionPolicy)
{ {
return new JdbcTestServer(port, maxInactive, scavengeInterval, idlePassivateInterval); return new JdbcTestServer(port, maxInactive, scavengeInterval, evictionPolicy);
} }
public void pause() public void pause()

View File

@ -103,14 +103,14 @@ public class JdbcTestServer extends AbstractTestServer
{ {
SessionHandler handler = new SessionHandler(); SessionHandler handler = new SessionHandler();
DefaultSessionCache sessionStore = new DefaultSessionCache(handler); DefaultSessionCache sessionStore = new DefaultSessionCache(handler);
handler.setSessionStore(sessionStore); handler.setSessionCache(sessionStore);
JDBCSessionStore ds = new JDBCSessionStore(); JDBCSessionDataStore ds = new JDBCSessionDataStore();
sessionStore.setSessionStore(ds); sessionStore.setSessionDataStore(ds);
ds.setGracePeriodSec(_scavengePeriod); ds.setGracePeriodSec(_scavengePeriod);
DatabaseAdaptor da = new DatabaseAdaptor(); DatabaseAdaptor da = new DatabaseAdaptor();
da.setDriverInfo(DRIVER_CLASS, (_config==null?DEFAULT_CONNECTION_URL:(String)_config)); da.setDriverInfo(DRIVER_CLASS, (_config==null?DEFAULT_CONNECTION_URL:(String)_config));
ds.setDatabaseAdaptor(da); ds.setDatabaseAdaptor(da);
JDBCSessionStore.SessionTableSchema sessionTableSchema = new JDBCSessionStore.SessionTableSchema(); JDBCSessionDataStore.SessionTableSchema sessionTableSchema = new JDBCSessionDataStore.SessionTableSchema();
sessionTableSchema.setTableName(TABLE); sessionTableSchema.setTableName(TABLE);
sessionTableSchema.setIdColumn(ID_COL); sessionTableSchema.setIdColumn(ID_COL);
sessionTableSchema.setAccessTimeColumn(ACCESS_COL); sessionTableSchema.setAccessTimeColumn(ACCESS_COL);

View File

@ -26,9 +26,9 @@ import org.junit.Test;
*/ */
public class LastAccessTimeTest extends AbstractLastAccessTimeTest public class LastAccessTimeTest extends AbstractLastAccessTimeTest
{ {
public AbstractTestServer createServer(int port, int max, int scavenge, int idlePassivate) public AbstractTestServer createServer(int port, int max, int scavenge, int evictionPolicy)
{ {
return new JdbcTestServer(port,max,scavenge, idlePassivate); return new JdbcTestServer(port,max,scavenge, evictionPolicy);
} }
@Test @Test

View File

@ -43,9 +43,9 @@ public class LocalSessionScavengingTest extends AbstractLocalSessionScavengingTe
} }
} }
public AbstractTestServer createServer(int port, int max, int scavenge, int idlePassivate) public AbstractTestServer createServer(int port, int max, int scavenge, int evictionPolicy)
{ {
return new JdbcTestServer(port,max,scavenge, idlePassivate); return new JdbcTestServer(port,max,scavenge, evictionPolicy);
} }
@Test @Test

View File

@ -49,13 +49,12 @@ public class ModifyMaxInactiveIntervalTest
public static int __inactive = 4; public static int __inactive = 4;
public static int newMaxInactive = 20; public static int newMaxInactive = 20;
public static int __scavenge = 1; public static int __scavenge = 1;
public static int __inspect = 1;
public static int __idlePassivate = -1;
@Test @Test
public void testSessionExpiryAfterModifiedMaxInactiveInterval() throws Exception public void testSessionExpiryAfterModifiedMaxInactiveInterval() throws Exception
{ {
AbstractTestServer server = new JdbcTestServer(0,__inactive,__scavenge, __idlePassivate); AbstractTestServer server = new JdbcTestServer(0,__inactive,__scavenge, SessionCache.NEVER_EVICT);
ServletContextHandler ctxA = server.addContext("/mod"); ServletContextHandler ctxA = server.addContext("/mod");
ctxA.addServlet(TestModServlet.class, "/test"); ctxA.addServlet(TestModServlet.class, "/test");

View File

@ -29,9 +29,9 @@ public class NewSessionTest extends AbstractNewSessionTest
/** /**
* @see org.eclipse.jetty.server.session.AbstractNewSessionTest#createServer(int, int, int) * @see org.eclipse.jetty.server.session.AbstractNewSessionTest#createServer(int, int, int)
*/ */
public AbstractTestServer createServer(int port, int max, int scavenge, int idlePassivate) public AbstractTestServer createServer(int port, int max, int scavenge, int evictionPolicy)
{ {
return new JdbcTestServer(port,max,scavenge, idlePassivate); return new JdbcTestServer(port,max,scavenge, evictionPolicy);
} }
@Test @Test

View File

@ -26,9 +26,9 @@ import org.junit.Test;
*/ */
public class OrphanedSessionTest extends AbstractOrphanedSessionTest public class OrphanedSessionTest extends AbstractOrphanedSessionTest
{ {
public AbstractTestServer createServer(int port, int max, int scavenge, int idlePassivate) public AbstractTestServer createServer(int port, int max, int scavenge, int evictionPolicy)
{ {
return new JdbcTestServer(port,max,scavenge,idlePassivate); return new JdbcTestServer(port,max,scavenge,evictionPolicy);
} }
@Test @Test

Some files were not shown because too many files have changed in this diff Show More