websocket/exchanges: populate context before multi connection upgrade (#1933)

* websocket/exchanges: populate context before multi connection upgrade

* fix test

* linter: fix

* gk: dial

* gk: nits rm param names

---------

Co-authored-by: Ryan O'Hara-Reid <ryan.oharareid@thrasher.io>
This commit is contained in:
Ryan O'Hara-Reid
2025-06-17 13:43:00 +10:00
committed by GitHub
parent 2958e64afe
commit 3e80f1b9e5
64 changed files with 1160 additions and 1124 deletions

View File

@@ -36,6 +36,7 @@ var defaultSubscriptions = subscription.List{
// WsConnect initiates a websocket connection
func (b *Bithumb) WsConnect() error {
ctx := context.TODO()
if !b.Websocket.IsEnabled() || !b.IsEnabled() {
return websocket.ErrWebsocketNotEnabled
}
@@ -44,17 +45,15 @@ func (b *Bithumb) WsConnect() error {
dialer.HandshakeTimeout = b.Config.HTTPTimeout
dialer.Proxy = http.ProxyFromEnvironment
err := b.Websocket.Conn.Dial(&dialer, http.Header{})
err := b.Websocket.Conn.Dial(ctx, &dialer, http.Header{})
if err != nil {
return fmt.Errorf("%v - Unable to connect to Websocket. Error: %w",
b.Name,
err)
return fmt.Errorf("%v - Unable to connect to Websocket. Error: %w", b.Name, err)
}
b.Websocket.Wg.Add(1)
go b.wsReadData()
b.setupOrderbookManager()
b.setupOrderbookManager(ctx)
return nil
}
@@ -183,9 +182,10 @@ func (b *Bithumb) GetSubscriptionTemplate(_ *subscription.Subscription) (*templa
// Subscribe subscribes to a set of channels
func (b *Bithumb) Subscribe(subs subscription.List) error {
ctx := context.TODO()
var errs error
for _, s := range subs {
err := b.Websocket.Conn.SendJSONMessage(context.TODO(), request.Unset, json.RawMessage(s.QualifiedChannel))
err := b.Websocket.Conn.SendJSONMessage(ctx, request.Unset, json.RawMessage(s.QualifiedChannel))
if err == nil {
err = b.Websocket.AddSuccessfulSubscriptions(b.Websocket.Conn, s)
}

View File

@@ -51,7 +51,7 @@ func TestWsHandleData(t *testing.T) {
},
}
dummy.setupOrderbookManager()
dummy.setupOrderbookManager(t.Context())
dummy.API.Endpoints = b.NewEndpoints()
welcomeMsg := []byte(`{"status":"0000","resmsg":"Connected Successfully"}`)

View File

@@ -85,21 +85,13 @@ func (b *Bithumb) applyBufferUpdate(pair currency.Pair) error {
recent, err := b.Websocket.Orderbook.GetOrderbook(pair, asset.Spot)
if err != nil {
log.Errorf(
log.WebsocketMgr,
"%s error fetching recent orderbook when applying updates: %s\n",
b.Name,
err)
log.Errorf(log.WebsocketMgr, "%s error fetching recent orderbook when applying updates: %s\n", b.Name, err)
}
if recent != nil {
err = b.obm.checkAndProcessOrderbookUpdate(b.processBooks, pair, recent)
if err != nil {
log.Errorf(
log.WebsocketMgr,
"%s error processing update - initiating new orderbook sync via REST: %s\n",
b.Name,
err)
log.Errorf(log.WebsocketMgr, "%s error processing update - initiating new orderbook sync via REST: %s\n", b.Name, err)
err = b.obm.setNeedsFetchingBook(pair)
if err != nil {
return err
@@ -112,7 +104,7 @@ func (b *Bithumb) applyBufferUpdate(pair currency.Pair) error {
// SynchroniseWebsocketOrderbook synchronises full orderbook for currency pair
// asset
func (b *Bithumb) SynchroniseWebsocketOrderbook() {
func (b *Bithumb) SynchroniseWebsocketOrderbook(ctx context.Context) {
b.Websocket.Wg.Add(1)
go func() {
defer b.Websocket.Wg.Done()
@@ -127,11 +119,9 @@ func (b *Bithumb) SynchroniseWebsocketOrderbook() {
}
}
case j := <-b.obm.jobs:
err := b.processJob(j.Pair)
err := b.processJob(ctx, j.Pair)
if err != nil {
log.Errorf(log.WebsocketMgr,
"%s processing websocket orderbook error %v",
b.Name, err)
log.Errorf(log.WebsocketMgr, "%s processing websocket orderbook error %v", b.Name, err)
}
}
}
@@ -139,8 +129,8 @@ func (b *Bithumb) SynchroniseWebsocketOrderbook() {
}
// processJob fetches and processes orderbook updates
func (b *Bithumb) processJob(p currency.Pair) error {
err := b.SeedLocalCache(context.TODO(), p)
func (b *Bithumb) processJob(ctx context.Context, p currency.Pair) error {
err := b.SeedLocalCache(ctx, p)
if err != nil {
return fmt.Errorf("%s %s seeding local cache for orderbook error: %v",
p, asset.Spot, err)
@@ -178,7 +168,7 @@ func (b *Bithumb) flushAndCleanup(p currency.Pair) {
}
}
func (b *Bithumb) setupOrderbookManager() {
func (b *Bithumb) setupOrderbookManager(ctx context.Context) {
if b.obm.state == nil {
b.obm.state = make(map[currency.Code]map[currency.Code]map[asset.Item]*update)
b.obm.jobs = make(chan job, maxWSOrderbookJobs)
@@ -197,7 +187,7 @@ func (b *Bithumb) setupOrderbookManager() {
for range maxWSOrderbookWorkers {
// 10 workers for synchronising book
b.SynchroniseWebsocketOrderbook()
b.SynchroniseWebsocketOrderbook(ctx)
}
}