private ObjectInputStream createObjectInputStream( final ByteArrayInputStream bis ) throws IOException { final ObjectInputStream ois; ClassLoader classLoader = null; if ( _manager != null && _manager.getContext() != null ) { classLoader = _manager.getContainerClassLoader(); } if ( classLoader != null ) { ois = new CustomObjectInputStream( bis, classLoader ); } else { ois = new ObjectInputStream( bis ); } return ois; }
final int delay = manager.getContext().getBackgroundProcessorDelay(); manager.setMaxInactiveInterval( delay * 4 ); Thread.sleep( TimeUnit.SECONDS.toMillis( manager.getMaxInactiveInterval() ) - 500 ); assertNotNull( _memcached.get( sessionId1 ), "Session should still exist in memcached." );
@BeforeMethod public void setup() throws LifecycleException, ClassNotFoundException, IOException { _manager = mock( SessionManager.class ); final Context context = new StandardContext(); when( _manager.getContext() ).thenReturn( context ); // needed for createSession // Manager.getContainer no longer available in tc 8.5+ if(_managerHasGetContainer) { when( _manager.getContainer() ).thenReturn( context ); } when( _manager.newMemcachedBackupSession() ).thenAnswer(new Answer<MemcachedBackupSession>() { @Override public MemcachedBackupSession answer(final InvocationOnMock invocation) throws Throwable { return newMemcachedBackupSession( _manager ); } }); final MemcachedSessionService service = new DummyMemcachedSessionService<SessionManager>( _manager ); when( _manager.createSession( anyString() ) ).thenAnswer(new Answer<MemcachedBackupSession>() { @Override public MemcachedBackupSession answer(final InvocationOnMock invocation) throws Throwable { return createSession(service); } }); when( _manager.readPrincipal( (ObjectInputStream)any() ) ).thenReturn( createPrincipal() ); when( _manager.getMemcachedSessionService() ).thenReturn( service ); when( _manager.willAttributeDistribute(anyString(), any())).thenReturn(true); }
MemcachedBackupSession result = _manager.getSessionInternal( id ); if ( result != null ) { synchronized (_manager.getSessionsInternal()) { if(_manager.getSessionInternal(id) == null) { addValidLoadedSession(result); || _trackingHostValve.isIgnoredRequest() && !_manager.contextHasFormBasedSecurityConstraint())) { if(_log.isDebugEnabled()) { _log.debug("Returning for session id " + id + " (isConnectorSessionLookup: "+ isConnectorSessionLookup() + if(!_sticky) { synchronized (_manager.getSessionsInternal()) { if(_manager.getSessionInternal(id) != null) { result = _manager.getSessionInternal(id);
final MemcachedBackupSession msmSession = _manager.getSessionInternal( sessionId ); if ( msmSession == null ) { if(_log.isDebugEnabled()) synchronized (_manager.getSessionsInternal()) { _manager.removeInternal( msmSession, false );
static DeserializationResult deserializeSessionFields( final byte[] data, final SessionManager manager ) throws InvalidVersionException { final MemcachedBackupSession result = manager.newMemcachedBackupSession();
session.setValid( true ); session.setCreationTime( System.currentTimeMillis() ); session.setMaxInactiveInterval( _manager.isMaxInactiveIntervalSet() ? _manager.getMaxInactiveInterval() : _manager.getContext().getSessionTimeout() * 60 ); sessionId = _manager.generateSessionId(); synchronized (_manager.getSessionsInternal()) { session.registerReference(); _manager.incrementSessionCounter();
final MemcachedBackupSession msmSession = _manager.getSessionInternal( sessionId ); if ( msmSession == null ) { if(_log.isDebugEnabled()) synchronized (_manager.getSessionsInternal()) { _manager.removeInternal( msmSession, false );
protected void updateExpirationInMemcached() { if ( _enabled.get() && _sticky ) { final Session[] sessions = _manager.findSessions(); final int delay = _manager.getContext().getBackgroundProcessorDelay(); for ( final Session s : sessions ) { final MemcachedBackupSession session = (MemcachedBackupSession) s;
_currentRequest = currentRequest; _msmContext = _sessionBackupService.getManager().getContext();
final String sessionCookieName = _manager.getSessionCookieName(); _currentRequest = new CurrentRequest(); _trackingHostValve = createRequestTrackingHostValve(sessionCookieName, _currentRequest); final Context context = _manager.getContext(); context.getParent().getPipeline().addValve(_trackingHostValve); _trackingContextValve = createRequestTrackingContextValve(sessionCookieName);
final int processExpiresOffset = getManager().getProcessExpiresFrequency() * getManager().getContext().getBackgroundProcessorDelay(); return expirationTime + processExpiresOffset;
/** * Filter map of attributes using our name pattern. * * @return the filtered attribute map that only includes attributes that shall be stored in memcached. */ public ConcurrentMap<String, Object> getAttributesFiltered() { if ( this.manager == null ) { throw new IllegalStateException( "There's no manager set." ); } final Pattern pattern = ((SessionManager)manager).getMemcachedSessionService().getSessionAttributePattern(); final ConcurrentMap<String, Object> attributes = getAttributesInternal(); if ( pattern == null ) { return attributes; } final ConcurrentMap<String, Object> result = new ConcurrentHashMap<String, Object>( attributes.size() ); for ( final Map.Entry<String, Object> entry: attributes.entrySet() ) { if ( pattern.matcher(entry.getKey()).matches() ) { result.put( entry.getKey(), entry.getValue() ); } } return result; }
private String handleSessionTakeOver( final MemcachedBackupSession session ) { checkMaxActiveSessions(); final String origSessionId = session.getIdInternal(); final String newSessionId = _memcachedNodesManager.changeSessionIdForTomcatFailover(session.getIdInternal(), _manager.getJvmRoute()); // If this session was already loaded we need to remove it from the session map // See http://code.google.com/p/memcached-session-manager/issues/detail?id=92 if ( _manager.getSessionsInternal().containsKey( origSessionId ) ) { _manager.getSessionsInternal().remove( origSessionId ); } session.setIdInternal( newSessionId ); // a concurrent/earlier request might already have added the session (#282) if ( !_manager.getSessionsInternal().containsKey( newSessionId ) ) { addValidLoadedSession(session, true); deleteFromMemcached(origSessionId); _statistics.requestWithTomcatFailover(); } return newSessionId; }
/** * Check whether the given attribute name matches our name pattern and shall be stored in memcached. * * @return true if the name matches */ private boolean filterAttribute( final String name ) { if ( this.manager == null ) { throw new IllegalStateException( "There's no manager set." ); } final Pattern pattern = ((SessionManager)manager).getMemcachedSessionService().getSessionAttributePattern(); if ( pattern == null ) { return true; } return pattern.matcher(name).matches(); }
private static Principal deserializePrincipal( final byte[] data, final SessionManager manager ) { ByteArrayInputStream bis = null; ObjectInputStream ois = null; try { bis = new ByteArrayInputStream( data ); ois = new ObjectInputStream( bis ); return manager.readPrincipal( ois ); } catch ( final IOException e ) { throw new IllegalArgumentException( "Could not deserialize principal", e ); } catch ( final ClassNotFoundException e ) { throw new IllegalArgumentException( "Could not deserialize principal", e ); } finally { closeSilently( bis ); closeSilently( ois ); } }
public void shutdown() { _log.info( "Stopping services." ); _manager.getContext().getParent().getPipeline().removeValve(_trackingHostValve); _manager.getContext().getPipeline().removeValve(_trackingContextValve); _backupSessionService.shutdown(); if ( _lockingStrategy != null ) { _lockingStrategy.shutdown(); } if ( _storage != null ) { _storage.shutdown(); _storage = null; } _transcoderFactory = null; _invalidSessionsCache.clear(); }
private void addValidLoadedSession( final StandardSession session, final boolean activate ) { // make sure the listeners know about it. (as done by PersistentManagerBase) if ( session.isNew() ) { session.tellNew(); } _manager.add( session ); if ( activate ) { session.activate(); } // endAccess() to ensure timeouts happen correctly. // access() to keep access count correct or it will end up // negative session.access(); session.endAccess(); }
private ObjectInputStream createObjectInputStream( final ByteArrayInputStream bis ) throws IOException { final ObjectInputStream ois; ClassLoader classLoader = null; if ( _manager != null && _manager.getContext() != null ) { classLoader = _manager.getContainerClassLoader(); } if ( classLoader != null ) { ois = new CustomObjectInputStream( bis, classLoader ); } else { ois = new ObjectInputStream( bis ); } return ois; }
protected MemcachedNodesManager createMemcachedNodesManager(final String memcachedNodes, final String failoverNodes) { final Context context = _manager.getContext(); final String webappVersion = Reflections.invoke(context, "getWebappVersion", null); final StorageKeyFormat storageKeyFormat = StorageKeyFormat.of(_storageKeyPrefix, context.getParent().getName(), context.getName(), webappVersion); return MemcachedNodesManager.createFor( memcachedNodes, failoverNodes, storageKeyFormat, _storageClientCallback); }