diff --git a/modules/session/virtual.go b/modules/session/virtual.go index 027960a2896..96719201674 100644 --- a/modules/session/virtual.go +++ b/modules/session/virtual.go @@ -107,10 +107,11 @@ func init() { // VirtualStore represents a virtual session store implementation. type VirtualStore struct { - p *VirtualSessionProvider - sid string - lock sync.RWMutex - data map[interface{}]interface{} + p *VirtualSessionProvider + sid string + lock sync.RWMutex + data map[interface{}]interface{} + released bool } // NewVirtualStore creates and returns a virtual session store. @@ -164,7 +165,7 @@ func (s *VirtualStore) Release() error { // Now ensure that we don't exist! realProvider := s.p.provider - if realProvider.Exist(s.sid) { + if !s.released && realProvider.Exist(s.sid) { // This is an error! return fmt.Errorf("new sid '%s' already exists", s.sid) } @@ -172,12 +173,19 @@ func (s *VirtualStore) Release() error { if err != nil { return err } + if err := realStore.Flush(); err != nil { + return err + } for key, value := range s.data { if err := realStore.Set(key, value); err != nil { return err } } - return realStore.Release() + err = realStore.Release() + if err == nil { + s.released = true + } + return err } return nil }