From c0322b85f6cb2bf36a457982942044c61bfa3c23 Mon Sep 17 00:00:00 2001 From: ShiKhu Date: Mon, 22 Nov 2021 21:41:10 +0100 Subject: [PATCH] fix(backend-http): thread-safe project cacher --- backend/pkg/db/cache/pg_cache.go | 7 ++++--- backend/pkg/db/cache/project.go | 17 +++++++++++------ 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/backend/pkg/db/cache/pg_cache.go b/backend/pkg/db/cache/pg_cache.go index 0ca429eb5..9a62354f1 100644 --- a/backend/pkg/db/cache/pg_cache.go +++ b/backend/pkg/db/cache/pg_cache.go @@ -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), } } diff --git a/backend/pkg/db/cache/project.go b/backend/pkg/db/cache/project.go index 1411e608b..6a7739bdd 100644 --- a/backend/pkg/db/cache/project.go +++ b/backend/pkg/db/cache/project.go @@ -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 }