@@ -41,6 +41,7 @@ import (
41
41
"k8s.io/kubectl/pkg/util"
42
42
"k8s.io/kubectl/pkg/util/completion"
43
43
"k8s.io/kubectl/pkg/util/i18n"
44
+ "k8s.io/kubectl/pkg/util/interrupt"
44
45
"k8s.io/kubectl/pkg/util/templates"
45
46
)
46
47
@@ -124,7 +125,7 @@ type LogsOptions struct {
124
125
Options runtime.Object
125
126
Resources []string
126
127
127
- ConsumeRequestFn func (rest.ResponseWrapper , io.Writer ) error
128
+ ConsumeRequestFn func (context. Context , rest.ResponseWrapper , io.Writer ) error
128
129
129
130
// PodLogOptions
130
131
SinceTime string
@@ -375,22 +376,29 @@ func (o LogsOptions) RunLogs() error {
375
376
len (requests ), o .MaxFollowConcurrency ,
376
377
)
377
378
}
378
-
379
- return o .parallelConsumeRequest (requests )
380
379
}
381
380
382
- return o .sequentialConsumeRequest (requests )
381
+ ctx , cancel := context .WithCancel (context .Background ())
382
+ defer cancel ()
383
+ intr := interrupt .New (nil , cancel )
384
+ return intr .Run (func () error {
385
+ if o .Follow && len (requests ) > 1 {
386
+ return o .parallelConsumeRequest (ctx , requests )
387
+ }
388
+
389
+ return o .sequentialConsumeRequest (ctx , requests )
390
+ })
383
391
}
384
392
385
- func (o LogsOptions ) parallelConsumeRequest (requests map [corev1.ObjectReference ]rest.ResponseWrapper ) error {
393
+ func (o LogsOptions ) parallelConsumeRequest (ctx context. Context , requests map [corev1.ObjectReference ]rest.ResponseWrapper ) error {
386
394
reader , writer := io .Pipe ()
387
395
wg := & sync.WaitGroup {}
388
396
wg .Add (len (requests ))
389
397
for objRef , request := range requests {
390
398
go func (objRef corev1.ObjectReference , request rest.ResponseWrapper ) {
391
399
defer wg .Done ()
392
400
out := o .addPrefixIfNeeded (objRef , writer )
393
- if err := o .ConsumeRequestFn (request , out ); err != nil {
401
+ if err := o .ConsumeRequestFn (ctx , request , out ); err != nil {
394
402
if ! o .IgnoreLogErrors {
395
403
writer .CloseWithError (err )
396
404
@@ -413,10 +421,10 @@ func (o LogsOptions) parallelConsumeRequest(requests map[corev1.ObjectReference]
413
421
return err
414
422
}
415
423
416
- func (o LogsOptions ) sequentialConsumeRequest (requests map [corev1.ObjectReference ]rest.ResponseWrapper ) error {
424
+ func (o LogsOptions ) sequentialConsumeRequest (ctx context. Context , requests map [corev1.ObjectReference ]rest.ResponseWrapper ) error {
417
425
for objRef , request := range requests {
418
426
out := o .addPrefixIfNeeded (objRef , o .Out )
419
- if err := o .ConsumeRequestFn (request , out ); err != nil {
427
+ if err := o .ConsumeRequestFn (ctx , request , out ); err != nil {
420
428
if ! o .IgnoreLogErrors {
421
429
return err
422
430
}
@@ -457,8 +465,8 @@ func (o LogsOptions) addPrefixIfNeeded(ref corev1.ObjectReference, writer io.Wri
457
465
// A successful read returns err == nil, not err == io.EOF.
458
466
// Because the function is defined to read from request until io.EOF, it does
459
467
// not treat an io.EOF as an error to be reported.
460
- func DefaultConsumeRequest (request rest.ResponseWrapper , out io.Writer ) error {
461
- readCloser , err := request .Stream (context . TODO () )
468
+ func DefaultConsumeRequest (ctx context. Context , request rest.ResponseWrapper , out io.Writer ) error {
469
+ readCloser , err := request .Stream (ctx )
462
470
if err != nil {
463
471
return err
464
472
}
0 commit comments