fix(backend-http): thread-safe project cacher

This commit is contained in:
ShiKhu 2021-11-22 21:41:10 +01:00
parent f475a79507
commit c0322b85f6
2 changed files with 15 additions and 9 deletions

View file

@ -2,6 +2,7 @@ package cache
import (
"time"
"sync"
"openreplay/backend/pkg/db/postgres"
. "openreplay/backend/pkg/db/types"
@ -20,8 +21,8 @@ type ProjectMeta struct {
type PGCache struct {
*postgres.Conn
sessions map[uint64]*Session
projects map[uint32]*ProjectMeta
projectsByKeys map[string]*ProjectMeta
projects map[uint32]*ProjectMeta
projectsByKeys sync.Map // map[string]*ProjectMeta
projectExpirationTimeout time.Duration
}
@ -31,7 +32,7 @@ func NewPGCache(pgConn *postgres.Conn, projectExpirationTimeoutMs int64) *PGCach
Conn: pgConn,
sessions: make(map[uint64]*Session),
projects: make(map[uint32]*ProjectMeta),
projectsByKeys: make(map[string]*ProjectMeta),
//projectsByKeys: make(map[string]*ProjectMeta),
projectExpirationTimeout: time.Duration(1000 * projectExpirationTimeoutMs),
}
}

View file

@ -6,16 +6,21 @@ import (
)
func (c *PGCache) GetProjectByKey(projectKey string) (*Project, error) {
if c.projectsByKeys[ projectKey ] != nil &&
time.Now().Before(c.projectsByKeys[ projectKey ].expirationTime) {
return c.projectsByKeys[ projectKey ].Project, nil
pmInterface, found := c.projectsByKeys.Load(projectKey)
if found {
if pm, ok := pmInterface.(*ProjectMeta); ok {
if time.Now().Before(pm.expirationTime) {
return pm.Project, nil
}
}
}
p, err := c.Conn.GetProjectByKey(projectKey)
if err != nil {
return nil, err
}
c.projectsByKeys[ projectKey ] = &ProjectMeta{ p, time.Now().Add(c.projectExpirationTimeout) }
c.projects[ p.ProjectID ] = c.projectsByKeys[ projectKey ]
c.projects[ p.ProjectID ] = &ProjectMeta{ p, time.Now().Add(c.projectExpirationTimeout) }
c.projectsByKeys.Store(projectKey, c.projects[ p.ProjectID ])
return p, nil
}
@ -31,7 +36,7 @@ func (c *PGCache) GetProject(projectID uint32) (*Project, error) {
return nil, err
}
c.projects[ projectID ] = &ProjectMeta{ p, time.Now().Add(c.projectExpirationTimeout) }
c.projectsByKeys[ p.ProjectKey ] = c.projects[ projectID ]
c.projectsByKeys.Store(p.ProjectKey, c.projects[ projectID ])
return p, nil
}