Skip to content

Commit e060cb4

Browse files
committed
Use LRU cache for runners in HTTP API
1 parent e51fe34 commit e060cb4

File tree

1 file changed

+15
-10
lines changed

1 file changed

+15
-10
lines changed

main.go

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ import (
88
"log/slog"
99
"net/http"
1010
"os"
11-
"sync"
1211
"time"
1312

1413
sqlrunner "github.com/database-playground/sqlrunner/lib"
14+
lru "github.com/hashicorp/golang-lru/v2"
1515
"golang.org/x/sync/singleflight"
1616
)
1717

@@ -21,7 +21,15 @@ func main() {
2121
addr = ":" + os.Getenv("PORT")
2222
}
2323

24-
service := &SqlQueryService{}
24+
runnersCache, err := lru.New[string, *sqlrunner.SQLRunner](20)
25+
if err != nil {
26+
slog.Error("failed to create LRU cache for runners", slog.Any("error", err))
27+
os.Exit(1)
28+
}
29+
30+
service := &SqlQueryService{
31+
runnersCache: runnersCache,
32+
}
2533
http.Handle("POST /query", service)
2634

2735
slog.Info("Listening", slog.String("addr", addr))
@@ -32,9 +40,8 @@ func main() {
3240
}
3341

3442
type SqlQueryService struct {
35-
// fixme: lru
36-
runners sync.Map
37-
sfgroup singleflight.Group
43+
runnersCache *lru.Cache[string, *sqlrunner.SQLRunner]
44+
sfgroup singleflight.Group
3845
}
3946

4047
func (s *SqlQueryService) ServeHTTP(w http.ResponseWriter, r *http.Request) {
@@ -75,9 +82,9 @@ func (s *SqlQueryService) ServeHTTP(w http.ResponseWriter, r *http.Request) {
7582

7683
func (s *SqlQueryService) findRunner(schema string) (*sqlrunner.SQLRunner, error) {
7784
// If we have already prepared a runner for this schema, return it.
78-
runner, ok := s.runners.Load(schema)
85+
runner, ok := s.runnersCache.Get(schema)
7986
if ok {
80-
return runner.(*sqlrunner.SQLRunner), nil
87+
return runner, nil
8188
}
8289

8390
result, err, _ := s.sfgroup.Do(schema, func() (any, error) {
@@ -86,16 +93,14 @@ func (s *SqlQueryService) findRunner(schema string) (*sqlrunner.SQLRunner, error
8693
return nil, fmt.Errorf("create SQLRunner: %w", err)
8794
}
8895

89-
s.runners.Store(schema, newRunner)
96+
s.runnersCache.Add(schema, newRunner)
9097
return newRunner, nil
9198
})
9299
if err != nil {
93100
return nil, err
94101
}
95102

96103
typedResult := result.(*sqlrunner.SQLRunner)
97-
98-
s.runners.Store(schema, typedResult)
99104
return typedResult, err
100105
}
101106

0 commit comments

Comments
 (0)