@@ -23,6 +23,7 @@ import (
23
23
"log"
24
24
"net/http"
25
25
"os"
26
+ "sync"
26
27
"time"
27
28
28
29
eventingv1alpha1 "github.com/knative/eventing/pkg/apis/eventing/v1alpha1"
43
44
44
45
readTimeout = 1 * time .Minute
45
46
writeTimeout = 1 * time .Minute
47
+ wg sync.WaitGroup
46
48
)
47
49
48
50
func main () {
@@ -75,8 +77,10 @@ func main() {
75
77
}
76
78
77
79
err = mgr .Add (& runnableServer {
78
- logger : logger ,
79
- s : s ,
80
+ logger : logger ,
81
+ s : s ,
82
+ ShutdownTimeout : writeTimeout ,
83
+ wg : & wg ,
80
84
})
81
85
if err != nil {
82
86
logger .Fatal ("Unable to add runnableServer" , zap .Error (err ))
@@ -102,6 +106,7 @@ func main() {
102
106
s : metricsSrv ,
103
107
logger : logger ,
104
108
ShutdownTimeout : writeTimeout ,
109
+ wg : & wg ,
105
110
})
106
111
if err != nil {
107
112
logger .Fatal ("Unable to add metrics runnableServer" , zap .Error (err ))
@@ -114,12 +119,8 @@ func main() {
114
119
logger .Error ("manager.Start() returned an error" , zap .Error (err ))
115
120
}
116
121
logger .Info ("Exiting..." )
117
-
118
- ctx , cancel := context .WithTimeout (context .Background (), writeTimeout )
119
- defer cancel ()
120
- if err = s .Shutdown (ctx ); err != nil {
121
- logger .Error ("Shutdown returned an error" , zap .Error (err ))
122
- }
122
+ wg .Wait ()
123
+ logger .Info ("Done." )
123
124
}
124
125
125
126
func getRequiredEnv (envKey string ) string {
@@ -202,13 +203,31 @@ type runnableServer struct {
202
203
// shutdown will never time out.
203
204
// TODO alternative: zero shuts down immediately, negative means infinite
204
205
ShutdownTimeout time.Duration
206
+ // wg is a temporary workaround for Manager returning immediately without
207
+ // waiting for Runnables to stop. See
208
+ // https://github.com/kubernetes-sigs/controller-runtime/issues/350.
209
+ wg * sync.WaitGroup
205
210
}
206
211
207
212
func (r * runnableServer ) Start (stopCh <- chan struct {}) error {
208
213
logger := r .logger .With (zap .String ("address" , r .s .Addr ))
209
214
logger .Info ("Listening..." )
215
+
216
+ errCh := make (chan error )
217
+
210
218
go func () {
211
- <- stopCh
219
+ r .wg .Add (1 )
220
+ err := r .s .ListenAndServe ()
221
+ if err != http .ErrServerClosed {
222
+ errCh <- err
223
+ }
224
+ }()
225
+
226
+ var err error
227
+ select {
228
+ case err = <- errCh :
229
+ logger .Error ("Error running HTTP server" , zap .Error (err ))
230
+ case <- stopCh :
212
231
var ctx context.Context
213
232
var cancel context.CancelFunc
214
233
if r .ShutdownTimeout > 0 {
@@ -218,11 +237,12 @@ func (r *runnableServer) Start(stopCh <-chan struct{}) error {
218
237
ctx = context .Background ()
219
238
}
220
239
logger .Info ("Shutting down..." )
221
- if err : = r .s .Shutdown (ctx ); err != nil {
240
+ if err = r .s .Shutdown (ctx ); err != nil {
222
241
logger .Error ("Shutdown returned an error" , zap .Error (err ))
223
242
} else {
224
243
logger .Info ("Shutdown done" )
225
244
}
226
- }()
227
- return r .s .ListenAndServe ()
245
+ }
246
+ r .wg .Done ()
247
+ return err
228
248
}
0 commit comments