Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitf39d152

Browse files
committed
feat: add WaitUntilEmpty to LogSender
1 parent2a2203e commitf39d152

File tree

2 files changed

+65
-1
lines changed

2 files changed

+65
-1
lines changed

‎codersdk/agentsdk/logs.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,34 @@ func (l *LogSender) GetScriptLogger(logSourceID uuid.UUID) ScriptLogger {
483483
returnScriptLogger{srcID:logSourceID,sender:l}
484484
}
485485

486+
// WaitUntilEmpty waits until the LogSender's queues are empty or the given context expires.
487+
func (l*LogSender)WaitUntilEmpty(ctx context.Context)error {
488+
ctxDone:=false
489+
nevermind:=make(chanstruct{})
490+
deferclose(nevermind)
491+
gofunc() {
492+
select {
493+
case<-ctx.Done():
494+
l.L.Lock()
495+
deferl.L.Unlock()
496+
ctxDone=true
497+
l.Broadcast()
498+
return
499+
case<-nevermind:
500+
return
501+
}
502+
}()
503+
l.L.Lock()
504+
deferl.L.Unlock()
505+
forlen(l.queues)!=0&&!ctxDone {
506+
l.Wait()
507+
}
508+
iflen(l.queues)==0 {
509+
returnnil
510+
}
511+
returnctx.Err()
512+
}
513+
486514
typeScriptLoggerstruct {
487515
sender*LogSender
488516
srcID uuid.UUID

‎codersdk/agentsdk/logs_internal_test.go

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,12 @@ func TestLogSender_Mainline(t *testing.T) {
5656
loopErr<-err
5757
}()
5858

59+
empty:=make(chanerror,1)
60+
gofunc() {
61+
err:=uut.WaitUntilEmpty(ctx)
62+
empty<-err
63+
}()
64+
5965
// since neither source has even been flushed, it should immediately Flush
6066
// both, although the order is not controlled
6167
varlogReqs []*proto.BatchCreateLogsRequest
@@ -104,8 +110,11 @@ func TestLogSender_Mainline(t *testing.T) {
104110
require.Equal(t,proto.Log_DEBUG,req.Logs[0].GetLevel())
105111
require.Equal(t,t1,req.Logs[0].GetCreatedAt().AsTime())
106112

113+
err:=testutil.RequireRecvCtx(ctx,t,empty)
114+
require.NoError(t,err)
115+
107116
cancel()
108-
err:=testutil.RequireRecvCtx(testCtx,t,loopErr)
117+
err=testutil.RequireRecvCtx(testCtx,t,loopErr)
109118
require.NoError(t,err)
110119

111120
// we can still enqueue more logs after SendLoop returns
@@ -363,6 +372,33 @@ func TestLogSender_SendError(t *testing.T) {
363372
uut.L.Unlock()
364373
}
365374

375+
funcTestLogSender_WaitUntilEmpty_ContextExpired(t*testing.T) {
376+
t.Parallel()
377+
testCtx:=testutil.Context(t,testutil.WaitShort)
378+
ctx,cancel:=context.WithCancel(testCtx)
379+
logger:=slogtest.Make(t,nil).Leveled(slog.LevelDebug)
380+
uut:=NewLogSender(logger)
381+
382+
t0:=dbtime.Now()
383+
384+
ls1:= uuid.UUID{0x11}
385+
uut.Enqueue(ls1,Log{
386+
CreatedAt:t0,
387+
Output:"test log 0, src 1",
388+
Level:codersdk.LogLevelInfo,
389+
})
390+
391+
empty:=make(chanerror,1)
392+
gofunc() {
393+
err:=uut.WaitUntilEmpty(ctx)
394+
empty<-err
395+
}()
396+
397+
cancel()
398+
err:=testutil.RequireRecvCtx(testCtx,t,empty)
399+
require.ErrorIs(t,err,context.Canceled)
400+
}
401+
366402
typefakeLogDeststruct {
367403
reqschan*proto.BatchCreateLogsRequest
368404
respschan*proto.BatchCreateLogsResponse

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp