From fcf887f999c9b30316e2958978b3cf1e387bb92e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois-Xavier=20Deltombe?= Date: Wed, 8 Feb 2012 15:47:36 +0000 Subject: [PATCH] Little optimization on deleteing and updating Session (Lemonldap-430) --- .../lib/Lemonldap/NG/Portal/Simple.pm | 94 +++++-------------- 1 file changed, 26 insertions(+), 68 deletions(-) diff --git a/modules/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Simple.pm b/modules/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Simple.pm index 366ed2bdd..bf183fa07 100644 --- a/modules/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Simple.pm +++ b/modules/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Simple.pm @@ -999,6 +999,8 @@ sub updatePersistentSession { # Update session stored. # If no id is given, try to get it from cookie. # If the session is available, update datas with $info. +# Note that outdated session data may remain some time on +# server local cache, if there are several LL::NG servers. # @param infos hash reference of information to update # @param id Session ID # @return nothing @@ -1016,39 +1018,39 @@ sub updateSession { if ( defined $cookies{ $self->{cookieName} } ); } - # Update sessionInfo data if ($id) { + # Update sessionInfo data + ## sessionInfo updated if $id defined : quite strange !! + ## See http://jira.ow2.org/browse/LEMONLDAP-430 foreach ( keys %$infos ) { $self->lmLog( "Update sessionInfo $_ with " . $infos->{$_}, 'debug' ); $self->{sessionInfo}->{$_} = $infos->{$_}; } - } - # Delete session in local storage - $self->_deleteSessionFromLocalStorage($id); + # Delete session from local storage + eval { $self->{lmConf}->{refLocalStorage}->remove($id); }; - # Update session in the backend - if ($id) { - my $h = $self->getApacheSession( $id, 1 ) or return (); - - # Store/update session values - foreach ( keys %$infos ) { - if ( defined( $infos->{$_} ) ) { - $self->lmLog( "Update session key $_ with " . $infos->{$_}, - 'debug' ); - $h->{$_} = $infos->{$_}; - } - else { - $self->lmLog( "Delete session key $_", 'debug' ); - delete $h->{$_}; + # Update session in global storage + if ( my $h = $self->getApacheSession( $id, 1 ) ) { + # Store/update session values + foreach ( keys %$infos ) { + if ( defined( $infos->{$_} ) ) { + $self->lmLog( "Update session key $_ with " . $infos->{$_}, + 'debug' ); + $h->{$_} = $infos->{$_}; + } + else { + $self->lmLog( "Delete session key $_", 'debug' ); + delete $h->{$_}; + } } + + # Store updateTime + $h->{updateTime} = &POSIX::strftime( "%Y%m%d%H%M%S", localtime() ); + + untie %$h; } - - # Store updateTime - $h->{updateTime} = &POSIX::strftime( "%Y%m%d%H%M%S", localtime() ); - - untie %$h; } } @@ -1330,47 +1332,6 @@ sub _deleteSession { return $result; } -##@method boolean _deleteSessionFromLocalStorage(string id) -# Find session in local storage (cache) and remove it -# @param id Session identifier -# @return result -sub _deleteSessionFromLocalStorage { - my ( $self, $id ) = splice @_; - my $result; - - # Exit directly if no id given - return 1 unless defined $id; - - if ( defined $self->{localStorage} ) { - $self->loadModule( $self->{localStorage} ); - my $cache; - eval '$cache = new ' - . $self->{localStorage} - . '($self->{localStorageOptions})'; - if ( defined $cache ) { - my $nb = 0; - eval { $nb = $cache->remove($id); }; - unless ($nb) { - $self->lmLog( "Unable to remove session $id from local storage", - 'warn' ); - $result = 0; - } - else { - $self->lmLog( "Session $id removed from local storage", - 'debug' ); - $result = 1; - } - } - } - else { - - # If no local storage, this is OK - $result = 1; - } - - return $result; -} - ##@method private void _dump(void* variable) # Dump variable in debug mode # @param $variable @@ -1628,7 +1589,7 @@ sub controlExistingSession { # Logout if required if ( $self->param('logout') ) { - # Delete session in global storage + # Delete session unless ( $self->_deleteSession($h) ) { $self->lmLog( "Unable to delete session $id", 'error' ); return PE_ERROR; @@ -1638,9 +1599,6 @@ sub controlExistingSession { 'debug' ); } - # Delete session in local storage - $self->_deleteSessionFromLocalStorage($id); - # Call issuerDB logout on each used issuerDBmodule my $issuerDBList = $self->{sessionInfo}->{_issuerDB}; if ( defined $issuerDBList ) {