Skip to content

Commit 743351a

Browse files
committed
Make locking issue in kick a bit more debuggable
1 parent 1d65b36 commit 743351a

3 files changed

Lines changed: 42 additions & 40 deletions

File tree

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,7 @@ require (
321321
github.com/xaionaro-go/xfyne v0.0.0-20250615190411-4c96281f6e25
322322
github.com/xaionaro-go/xlogrus v0.0.0-20250111150201-60557109545a
323323
github.com/xaionaro-go/xpath v0.0.0-20250111145115-55f5728f643f
324-
github.com/xaionaro-go/xsync v0.0.0-20250713122735-6e002588c3d0
324+
github.com/xaionaro-go/xsync v0.0.0-20250816221754-5ff810dd0a2c
325325
github.com/yutopp/go-flv v0.3.1
326326
golang.org/x/crypto v0.39.0
327327
google.golang.org/grpc v1.73.0

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1159,6 +1159,8 @@ github.com/xaionaro-go/xpath v0.0.0-20250111145115-55f5728f643f h1:ofxY1akRlVdJ/
11591159
github.com/xaionaro-go/xpath v0.0.0-20250111145115-55f5728f643f/go.mod h1:f0DVcqddOy1RALOgXJHwpQnkp1u1yeBX/+A2+Bf4EGc=
11601160
github.com/xaionaro-go/xsync v0.0.0-20250713122735-6e002588c3d0 h1:JDl35mgD3RsmEx7xbBCSONLceBCTFUWQvPUG5YsWrgU=
11611161
github.com/xaionaro-go/xsync v0.0.0-20250713122735-6e002588c3d0/go.mod h1:FCpywNAl4a4hgzE8j7Z+TpdhBQi5WHxnI35jOrFpoQw=
1162+
github.com/xaionaro-go/xsync v0.0.0-20250816221754-5ff810dd0a2c h1:d1jyWhrTnHhwk+16Y7fexlXQCqfvm0NCsDvdsg2mcCA=
1163+
github.com/xaionaro-go/xsync v0.0.0-20250816221754-5ff810dd0a2c/go.mod h1:FCpywNAl4a4hgzE8j7Z+TpdhBQi5WHxnI35jOrFpoQw=
11621164
github.com/xaionaro-go/youtube-live-chat-downloader/v2 v2.0.0-20250726224735-811554015ae8 h1:iRcIRlIryjDkgFoKJZQQWra/zv783CnKtXnpq9z7VTQ=
11631165
github.com/xaionaro-go/youtube-live-chat-downloader/v2 v2.0.0-20250726224735-811554015ae8/go.mod h1:TrUogg8mrebgMD/JU094CmSXn3yKrt+CZjiDL3YtmMw=
11641166
github.com/xaionaro-go/zerolog2belt v0.0.0-20241103164018-a3bc1ea487e5 h1:jAy7VLg8y8XE1R8jBte4PRDJzOaAE+sUfmttfB9ZcAY=

pkg/streamcontrol/kick/kick.go

Lines changed: 39 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -160,50 +160,51 @@ func (k *Kick) keepAliveLoop(
160160
func (k *Kick) initChatHandler(
161161
ctx context.Context,
162162
) error {
163-
if !k.ChatHandlerLocker.Lock(ctx) {
164-
return ctx.Err()
165-
}
163+
return xsync.DoA1R1(ctx, &k.ChatHandlerLocker, k.initChatHandlerNoLock, ctx)
164+
}
166165

166+
func (k *Kick) initChatHandlerNoLock(
167+
ctx context.Context,
168+
) error {
167169
chatHandler, err := k.newChatHandlerOBSOLETE(ctx, k.CurrentConfig.Config.Channel, k.onChatHandlerClose)
168170
if err == nil {
169-
k.ChatHandlerLocker.Unlock()
170171
k.ChatHandler = chatHandler
171172
return nil
172173
}
173174

174-
go func() {
175-
defer k.ChatHandlerLocker.Unlock()
176-
defer logger.Debugf(ctx, "/initChatHandler")
177-
for {
178-
logger.Errorf(ctx, "unable to initialize chat handler: %v", err)
179-
time.Sleep(time.Second)
180-
select {
181-
case <-k.CloseCtx.Done():
182-
logger.Debugf(ctx, "initChatHandler: cancelled (case #1)")
183-
return
184-
case <-ctx.Done():
185-
logger.Debugf(ctx, "initChatHandler: cancelled (case #2)")
186-
return
187-
default:
188-
}
189-
chatHandler, err = k.newChatHandlerOBSOLETE(ctx, k.CurrentConfig.Config.Channel, k.onChatHandlerClose)
190-
if err == nil {
191-
break
192-
}
175+
for {
176+
logger.Errorf(ctx, "unable to initialize chat handler: %v", err)
177+
time.Sleep(time.Second)
178+
select {
179+
case <-k.CloseCtx.Done():
180+
logger.Debugf(ctx, "initChatHandler: cancelled (case #1)")
181+
return fmt.Errorf("k.CloseCtx is closed: %w", k.CloseCtx.Err())
182+
case <-ctx.Done():
183+
logger.Debugf(ctx, "initChatHandler: cancelled (case #2)")
184+
return fmt.Errorf("ctx is closed: %w", ctx.Err())
185+
default:
186+
}
187+
chatHandler, err = k.newChatHandlerOBSOLETE(ctx, k.CurrentConfig.Config.Channel, k.onChatHandlerClose)
188+
if err != nil {
189+
logger.Debugf(ctx, "initChatHandler: unable to create a new chat handler: %v", err)
190+
continue
193191
}
194192
k.ChatHandler = chatHandler
195-
}()
196-
return nil
193+
return nil
194+
}
197195
}
198196

199197
func (k *Kick) onChatHandlerClose(
200198
ctx context.Context,
201199
h *ChatHandlerOBSOLETE,
202200
) {
203-
if !k.ChatHandlerLocker.Lock(ctx) {
204-
return
205-
}
206-
defer k.ChatHandlerLocker.Unlock()
201+
xsync.DoA2(ctx, &k.ChatHandlerLocker, k.onChatHandlerCloseNoLock, ctx, h)
202+
}
203+
204+
func (k *Kick) onChatHandlerCloseNoLock(
205+
ctx context.Context,
206+
h *ChatHandlerOBSOLETE,
207+
) {
207208
if h != k.ChatHandler {
208209
logger.Errorf(ctx, "chat handler was already replaced")
209210
return
@@ -550,11 +551,9 @@ func (k *Kick) GetAllCategories(
550551
func (k *Kick) tryGetChatHandler(
551552
ctx context.Context,
552553
) *ChatHandlerOBSOLETE {
553-
if !k.ChatHandlerLocker.Lock(ctx) {
554-
return nil
555-
}
556-
defer k.ChatHandlerLocker.Unlock()
557-
return k.ChatHandler
554+
return xsync.DoR1(ctx, &k.ChatHandlerLocker, func() *ChatHandlerOBSOLETE {
555+
return k.ChatHandler
556+
})
558557
}
559558

560559
func (k *Kick) getChatHandler(
@@ -761,10 +760,11 @@ func (k *Kick) prepareNoLock(ctx context.Context) error {
761760
err = fmt.Errorf("initChannelInfo: %w", err)
762761
return
763762
}
764-
if err = k.initChatHandler(ctx); err != nil {
765-
err = fmt.Errorf("initChatHandler: %w", err)
766-
return
767-
}
763+
observability.Go(ctx, func(ctx context.Context) {
764+
if err = k.initChatHandler(ctx); err != nil {
765+
logger.Errorf(ctx, "initChatHandler: %v", err)
766+
}
767+
})
768768
})
769769
return err
770770
}
@@ -846,7 +846,7 @@ func (k *Kick) refreshAccessToken(
846846

847847
err = k.setToken(ctx, resp, time.Now())
848848
if err != nil {
849-
return fmt.Errorf("unable to set access token: %w")
849+
return fmt.Errorf("unable to set access token: %w", err)
850850
}
851851

852852
return nil

0 commit comments

Comments
 (0)