code: public void requestFinished(final String sessionId, final String requestId) {
          if(!_sticky) {
              final MemcachedBackupSession msmSession = _manager.getSessionInternal( sessionId );
              if ( msmSession == null ) {
                  if(_log.isDebugEnabled())
                      _log.debug( "No session found in session map for " + sessionId );
                  return;
              }
  
              if ( !msmSession.isValidInternal() ) {
                  if(_log.isDebugEnabled())
                      _log.debug( "Non valid session found in session map for " + sessionId );
                  return;
              }
  
              synchronized (_manager.getSessionsInternal()) {
                  // if another thread in the meantime retrieved the session
                  // we must not remove it as this would case session data loss
                  // for the other request
                  if ( msmSession.releaseReference() > 0 ) {
                      if(_log.isDebugEnabled())
                          _log.debug( "Session " + sessionId + " is still used by another request, skipping backup and (optional) lock handling/release." );
                      return;
                  }
                  msmSession.passivate();
                  _manager.removeInternal( msmSession, false );
              }
  
              if(msmSession.isLocked()) {
                  _lockingStrategy.releaseLock(sessionId);
                  msmSession.releaseLock();
                  _lockingStrategy.registerReadonlyRequest(requestId);
              }
  
          }
      }
docs: Is invoked for requests matching {@link #setRequestUriIgnorePattern(String)} at the end
  of the request. Any acquired resources should be freed.
  @param sessionId the sessionId, must not be null.
  @param requestId the uri/id of the request for that the session backup shall be performed, used for readonly tracking.