diff --git a/main.go b/main.go index a162053..4911ce5 100644 --- a/main.go +++ b/main.go @@ -1,17 +1,17 @@ package main import ( - "fmt" "context" + "fmt" "log" "net/http" "os" "os/signal" "time" - "golang.org/x/sync/errgroup" "github.com/99designs/gqlgen/graphql/handler" "github.com/rs/cors" + "golang.org/x/sync/errgroup" "github.com/sour-is/ev/api/gql_ev" "github.com/sour-is/ev/internal/graph" @@ -67,7 +67,7 @@ func run(ctx context.Context) error { "endpoint": "https://ev.sour.is/inbox/01GA4Q3NDX4TPAZ2EZ8E92CQE6", "key": "kex1pqwqatj6sge7qaqrsvk4u4yhue4x3vej8znetkwj6a5k0xds2fmqqe3plh" }`) - }, + }, ) mux.Handle("/.well-known/salty/0ce550020ce36a9932b286b141edd515d33c2b0f51c715445de89ae106345993.json", wk) diff --git a/pkg/es/driver/disk-store/disk-store.go b/pkg/es/driver/disk-store/disk-store.go index f9a586c..d10c2ea 100644 --- a/pkg/es/driver/disk-store/disk-store.go +++ b/pkg/es/driver/disk-store/disk-store.go @@ -17,8 +17,12 @@ import ( "github.com/sour-is/ev/pkg/math" ) +type openlogs struct { + logs map[string]*locker.Locked[wal.Log] +} type diskStore struct { - path string + path string + openlogs *locker.Locked[openlogs] } const AppendOnly = es.AppendOnly @@ -48,13 +52,26 @@ func (diskStore) Open(_ context.Context, dsn string) (driver.Driver, error) { } } - return &diskStore{path: path}, nil + logs := &openlogs{logs: make(map[string]*locker.Locked[wal.Log])} + return &diskStore{path: path, openlogs: locker.New(logs)}, nil } func (ds *diskStore) EventLog(ctx context.Context, streamID string) (driver.EventLog, error) { el := &eventLog{streamID: streamID} - l, err := wal.Open(filepath.Join(ds.path, streamID), wal.DefaultOptions) - el.events = locker.New(l) - return el, err + + return el, ds.openlogs.Modify(ctx, func(openlogs *openlogs) error { + if events, ok := openlogs.logs[streamID]; ok { + el.events = events + return nil + } + + l, err := wal.Open(filepath.Join(ds.path, streamID), wal.DefaultOptions) + if err != nil { + return err + } + el.events = locker.New(l) + openlogs.logs[streamID] = el.events + return nil + }) } type eventLog struct {