From 741580da99fab1a25458ce9b8be6252ae917401e Mon Sep 17 00:00:00 2001 From: Geoffrey Ragot Date: Tue, 12 Sep 2023 14:37:25 +0200 Subject: [PATCH] fix: concurrent random access --- .../ledger/internal/api/v1/middlewares_resolver.go | 9 ++++++++- .../ledger/internal/api/v2/middlewares_resolver.go | 9 ++++++++- .../ledger/internal/storage/ledgerstore/balances.go | 1 - 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/components/ledger/internal/api/v1/middlewares_resolver.go b/components/ledger/internal/api/v1/middlewares_resolver.go index 0d10c62d96..16b6a92b47 100644 --- a/components/ledger/internal/api/v1/middlewares_resolver.go +++ b/components/ledger/internal/api/v1/middlewares_resolver.go @@ -3,6 +3,7 @@ package v1 import ( "math/rand" "net/http" + "sync" "time" "github.com/formancehq/ledger/internal/api/backend" @@ -11,7 +12,10 @@ import ( "github.com/go-chi/chi/v5" ) -var r *rand.Rand +var ( + r *rand.Rand + mu sync.Mutex +) func init() { r = rand.New(rand.NewSource(time.Now().UnixNano())) @@ -20,6 +24,9 @@ func init() { var letterRunes = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") func randomTraceID(n int) string { + mu.Lock() + defer mu.Unlock() + b := make([]rune, n) for i := range b { b[i] = letterRunes[r.Intn(len(letterRunes))] diff --git a/components/ledger/internal/api/v2/middlewares_resolver.go b/components/ledger/internal/api/v2/middlewares_resolver.go index 5e5a3c18e0..ee5548bcdf 100644 --- a/components/ledger/internal/api/v2/middlewares_resolver.go +++ b/components/ledger/internal/api/v2/middlewares_resolver.go @@ -3,6 +3,7 @@ package v2 import ( "math/rand" "net/http" + "sync" "time" "github.com/formancehq/ledger/internal/api/backend" @@ -11,7 +12,10 @@ import ( "github.com/go-chi/chi/v5" ) -var r *rand.Rand +var ( + r *rand.Rand + mu sync.Mutex +) func init() { r = rand.New(rand.NewSource(time.Now().UnixNano())) @@ -20,6 +24,9 @@ func init() { var letterRunes = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") func randomTraceID(n int) string { + mu.Lock() + defer mu.Unlock() + b := make([]rune, n) for i := range b { b[i] = letterRunes[r.Intn(len(letterRunes))] diff --git a/components/ledger/internal/storage/ledgerstore/balances.go b/components/ledger/internal/storage/ledgerstore/balances.go index 068e477b19..c6224cda7f 100644 --- a/components/ledger/internal/storage/ledgerstore/balances.go +++ b/components/ledger/internal/storage/ledgerstore/balances.go @@ -27,7 +27,6 @@ func (store *Store) GetAggregatedBalances(ctx context.Context, q *GetAggregatedB NewSelect(). Table(MovesTableName). ColumnExpr("distinct on (moves.account_address, moves.asset) moves.*"). - Order("account_address", "asset", "moves.seq desc"). Apply(filterPIT(q.Options.Options.PIT, "insertion_date")) // todo(gfyrag): expose capability to use effective_date if q.Options.QueryBuilder != nil {