Skip to content

Commit 9da2e62

Browse files
Remove context lock from API VM interface (#2165)
1 parent 9dbf82a commit 9da2e62

File tree

22 files changed

+522
-726
lines changed

22 files changed

+522
-726
lines changed

api/server/middleware_handler.go

Lines changed: 0 additions & 21 deletions
This file was deleted.

api/server/mock_server.go

Lines changed: 9 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/server/server.go

Lines changed: 18 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,11 @@ package server
55

66
import (
77
"context"
8-
"errors"
98
"fmt"
109
"net"
1110
"net/http"
1211
"net/url"
1312
"path"
14-
"sync"
1513
"time"
1614

1715
"github.com/NYTimes/gziphandler"
@@ -39,15 +37,13 @@ const (
3937
)
4038

4139
var (
42-
errUnknownLockOption = errors.New("invalid lock options")
43-
4440
_ PathAdder = readPathAdder{}
4541
_ Server = (*server)(nil)
4642
)
4743

4844
type PathAdder interface {
4945
// AddRoute registers a route to a handler.
50-
AddRoute(handler *common.HTTPHandler, lock *sync.RWMutex, base, endpoint string) error
46+
AddRoute(handler http.Handler, base, endpoint string) error
5147

5248
// AddAliases registers aliases to the server
5349
AddAliases(endpoint string, aliases ...string) error
@@ -56,7 +52,7 @@ type PathAdder interface {
5652
type PathAdderWithReadLock interface {
5753
// AddRouteWithReadLock registers a route to a handler assuming the http
5854
// read lock is currently held.
59-
AddRouteWithReadLock(handler *common.HTTPHandler, lock *sync.RWMutex, base, endpoint string) error
55+
AddRouteWithReadLock(handler http.Handler, base, endpoint string) error
6056

6157
// AddAliasesWithReadLock registers aliases to the server assuming the http read
6258
// lock is currently held.
@@ -182,13 +178,8 @@ func (s *server) Dispatch() error {
182178
}
183179

184180
func (s *server) RegisterChain(chainName string, ctx *snow.ConsensusContext, vm common.VM) {
185-
var (
186-
handlers map[string]*common.HTTPHandler
187-
err error
188-
)
189-
190181
ctx.Lock.Lock()
191-
handlers, err = vm.CreateHandlers(context.TODO())
182+
handlers, err := vm.CreateHandlers(context.TODO())
192183
ctx.Lock.Unlock()
193184
if err != nil {
194185
s.log.Error("failed to create handlers",
@@ -224,112 +215,44 @@ func (s *server) RegisterChain(chainName string, ctx *snow.ConsensusContext, vm
224215
}
225216
}
226217

227-
func (s *server) addChainRoute(chainName string, handler *common.HTTPHandler, ctx *snow.ConsensusContext, base, endpoint string) error {
218+
func (s *server) addChainRoute(chainName string, handler http.Handler, ctx *snow.ConsensusContext, base, endpoint string) error {
228219
url := fmt.Sprintf("%s/%s", baseURL, base)
229220
s.log.Info("adding route",
230221
zap.String("url", url),
231222
zap.String("endpoint", endpoint),
232223
)
233224
if s.tracingEnabled {
234-
handler = &common.HTTPHandler{
235-
LockOptions: handler.LockOptions,
236-
Handler: api.TraceHandler(handler.Handler, chainName, s.tracer),
237-
}
238-
}
239-
// Apply middleware to grab/release chain's lock before/after calling API method
240-
h, err := lockMiddleware(
241-
handler.Handler,
242-
handler.LockOptions,
243-
s.tracingEnabled,
244-
s.tracer,
245-
&ctx.Lock,
246-
)
247-
if err != nil {
248-
return err
225+
handler = api.TraceHandler(handler, chainName, s.tracer)
249226
}
250227
// Apply middleware to reject calls to the handler before the chain finishes bootstrapping
251-
h = rejectMiddleware(h, ctx)
252-
h = s.metrics.wrapHandler(chainName, h)
253-
return s.router.AddRouter(url, endpoint, h)
228+
handler = rejectMiddleware(handler, ctx)
229+
handler = s.metrics.wrapHandler(chainName, handler)
230+
return s.router.AddRouter(url, endpoint, handler)
254231
}
255232

256-
func (s *server) AddRoute(handler *common.HTTPHandler, lock *sync.RWMutex, base, endpoint string) error {
257-
return s.addRoute(handler, lock, base, endpoint)
233+
func (s *server) AddRoute(handler http.Handler, base, endpoint string) error {
234+
return s.addRoute(handler, base, endpoint)
258235
}
259236

260-
func (s *server) AddRouteWithReadLock(handler *common.HTTPHandler, lock *sync.RWMutex, base, endpoint string) error {
237+
func (s *server) AddRouteWithReadLock(handler http.Handler, base, endpoint string) error {
261238
s.router.lock.RUnlock()
262239
defer s.router.lock.RLock()
263-
return s.addRoute(handler, lock, base, endpoint)
240+
return s.addRoute(handler, base, endpoint)
264241
}
265242

266-
func (s *server) addRoute(handler *common.HTTPHandler, lock *sync.RWMutex, base, endpoint string) error {
243+
func (s *server) addRoute(handler http.Handler, base, endpoint string) error {
267244
url := fmt.Sprintf("%s/%s", baseURL, base)
268245
s.log.Info("adding route",
269246
zap.String("url", url),
270247
zap.String("endpoint", endpoint),
271248
)
272249

273250
if s.tracingEnabled {
274-
handler = &common.HTTPHandler{
275-
LockOptions: handler.LockOptions,
276-
Handler: api.TraceHandler(handler.Handler, url, s.tracer),
277-
}
278-
}
279-
280-
// Apply middleware to grab/release chain's lock before/after calling API method
281-
h, err := lockMiddleware(
282-
handler.Handler,
283-
handler.LockOptions,
284-
s.tracingEnabled,
285-
s.tracer,
286-
lock,
287-
)
288-
if err != nil {
289-
return err
290-
}
291-
h = s.metrics.wrapHandler(base, h)
292-
return s.router.AddRouter(url, endpoint, h)
293-
}
294-
295-
// Wraps a handler by grabbing and releasing a lock before calling the handler.
296-
func lockMiddleware(
297-
handler http.Handler,
298-
lockOption common.LockOption,
299-
tracingEnabled bool,
300-
tracer trace.Tracer,
301-
lock *sync.RWMutex,
302-
) (http.Handler, error) {
303-
var (
304-
name string
305-
lockedHandler http.Handler
306-
)
307-
switch lockOption {
308-
case common.WriteLock:
309-
name = "writeLock"
310-
lockedHandler = middlewareHandler{
311-
before: lock.Lock,
312-
after: lock.Unlock,
313-
handler: handler,
314-
}
315-
case common.ReadLock:
316-
name = "readLock"
317-
lockedHandler = middlewareHandler{
318-
before: lock.RLock,
319-
after: lock.RUnlock,
320-
handler: handler,
321-
}
322-
case common.NoLock:
323-
return handler, nil
324-
default:
325-
return nil, errUnknownLockOption
326-
}
327-
328-
if !tracingEnabled {
329-
return lockedHandler, nil
251+
handler = api.TraceHandler(handler, url, s.tracer)
330252
}
331253

332-
return api.TraceHandler(lockedHandler, name, tracer), nil
254+
handler = s.metrics.wrapHandler(base, handler)
255+
return s.router.AddRouter(url, endpoint, handler)
333256
}
334257

335258
// Reject middleware wraps a handler. If the chain that the context describes is
@@ -383,8 +306,8 @@ func PathWriterFromWithReadLock(pather PathAdderWithReadLock) PathAdder {
383306
}
384307
}
385308

386-
func (a readPathAdder) AddRoute(handler *common.HTTPHandler, lock *sync.RWMutex, base, endpoint string) error {
387-
return a.pather.AddRouteWithReadLock(handler, lock, base, endpoint)
309+
func (a readPathAdder) AddRoute(handler http.Handler, base, endpoint string) error {
310+
return a.pather.AddRouteWithReadLock(handler, base, endpoint)
388311
}
389312

390313
func (a readPathAdder) AddAliases(endpoint string, aliases ...string) error {

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ require (
1111
github.com/DataDog/zstd v1.5.2
1212
github.com/Microsoft/go-winio v0.5.2
1313
github.com/NYTimes/gziphandler v1.1.1
14-
github.com/ava-labs/coreth v0.12.5-rc.6
14+
github.com/ava-labs/coreth v0.12.6-rc.0
1515
github.com/ava-labs/ledger-avalanche/go v0.0.0-20230105152938-00a24d05a8c7
1616
github.com/btcsuite/btcd/btcutil v1.1.3
1717
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@ github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah
6161
github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM=
6262
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
6363
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
64-
github.com/ava-labs/coreth v0.12.5-rc.6 h1:OajGUyKkO5Q82XSuMa8T5UD6QywtCHUiZ4Tv3RFmRBU=
65-
github.com/ava-labs/coreth v0.12.5-rc.6/go.mod h1:s5wVyy+5UCCk2m0Tq3jVmy0UqOpKBDYqRE13gInCJVs=
64+
github.com/ava-labs/coreth v0.12.6-rc.0 h1:EaARpccHwa7+P60EXQ/dYUCetZmJjw9RO5L7ebutqXk=
65+
github.com/ava-labs/coreth v0.12.6-rc.0/go.mod h1:sNbwitXv4AhLvWpSqy6V8yzkhGFeWBQFD31/xiRDJ5M=
6666
github.com/ava-labs/ledger-avalanche/go v0.0.0-20230105152938-00a24d05a8c7 h1:EdxD90j5sClfL5Ngpz2TlnbnkNYdFPDXa0jDOjam65c=
6767
github.com/ava-labs/ledger-avalanche/go v0.0.0-20230105152938-00a24d05a8c7/go.mod h1:XhiXSrh90sHUbkERzaxEftCmUz53eCijshDLZ4fByVM=
6868
github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g=

indexer/indexer.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -357,8 +357,7 @@ func (i *indexer) registerChainHelper(
357357
_ = index.Close()
358358
return nil, err
359359
}
360-
handler := &common.HTTPHandler{LockOptions: common.NoLock, Handler: apiServer}
361-
if err := i.pathAdder.AddRoute(handler, &sync.RWMutex{}, "index/"+name, "/"+endpoint); err != nil {
360+
if err := i.pathAdder.AddRoute(apiServer, "index/"+name, "/"+endpoint); err != nil {
362361
_ = index.Close()
363362
return nil, err
364363
}

indexer/indexer_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package indexer
55

66
import (
77
"errors"
8+
"net/http"
89
"sync"
910
"testing"
1011
"time"
@@ -19,7 +20,6 @@ import (
1920
"github.com/ava-labs/avalanchego/ids"
2021
"github.com/ava-labs/avalanchego/snow"
2122
"github.com/ava-labs/avalanchego/snow/engine/avalanche/vertex"
22-
"github.com/ava-labs/avalanchego/snow/engine/common"
2323
"github.com/ava-labs/avalanchego/snow/engine/snowman/block/mocks"
2424
"github.com/ava-labs/avalanchego/utils"
2525
"github.com/ava-labs/avalanchego/utils/logging"
@@ -37,7 +37,7 @@ type apiServerMock struct {
3737
endpoints []string
3838
}
3939

40-
func (a *apiServerMock) AddRoute(_ *common.HTTPHandler, _ *sync.RWMutex, base, endpoint string) error {
40+
func (a *apiServerMock) AddRoute(_ http.Handler, base, endpoint string) error {
4141
a.timesCalled++
4242
a.bases = append(a.bases, base)
4343
a.endpoints = append(a.endpoints, endpoint)

0 commit comments

Comments
 (0)