fix(backend-http): thread-safe project cacher
This commit is contained in:
parent
f475a79507
commit
c0322b85f6
2 changed files with 15 additions and 9 deletions
7
backend/pkg/db/cache/pg_cache.go
vendored
7
backend/pkg/db/cache/pg_cache.go
vendored
|
|
@ -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),
|
||||
}
|
||||
}
|
||||
|
|
|
|||
17
backend/pkg/db/cache/project.go
vendored
17
backend/pkg/db/cache/project.go
vendored
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue