Skip to content

Commit 1a26a2e

Browse files
committed
more
Signed-off-by: Takeshi Yoneda <[email protected]>
1 parent 96e6441 commit 1a26a2e

File tree

1 file changed

+24
-1
lines changed

1 file changed

+24
-1
lines changed

tests/internal/testenvironment/test_environment.go

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,16 @@ func requireEnvoy(t testing.TB,
258258
envoyYamlPath := t.TempDir() + "/envoy.yaml"
259259
require.NoError(t, os.WriteFile(envoyYamlPath, []byte(processedConfig), 0o600))
260260

261-
cmd := testsinternal.GoToolCmdContext(t.Context(), "func-e", "run",
261+
// Note: do not pass t.Context() to CommandContext, as it's canceled
262+
// *before* t.Cleanup functions are called.
263+
//
264+
// > Context returns a context that is canceled just before
265+
// > Cleanup-registered functions are called.
266+
//
267+
// That means the subprocess gets killed before we can send it an interrupt
268+
// signal for graceful shutdown, which results in orphaned subprocesses.
269+
ctx, cancel := context.WithCancel(context.Background())
270+
cmd := testsinternal.GoToolCmdContext(ctx, "func-e", "run",
262271
"-c", envoyYamlPath,
263272
"--concurrency", strconv.Itoa(max(runtime.NumCPU(), 2)),
264273
// This allows multiple Envoy instances to run in parallel.
@@ -268,6 +277,20 @@ func requireEnvoy(t testing.TB,
268277
)
269278
// Use the existing environment for func-e.
270279
cmd.Env = os.Environ()
280+
cmd.WaitDelay = 3 * time.Second // auto-kill after 3 seconds.
281+
t.Cleanup(func() {
282+
defer cancel()
283+
// Graceful shutdown, should kill the Envoy subprocess, too.
284+
if err := cmd.Process.Signal(os.Interrupt); err != nil {
285+
t.Logf("Failed to send interrupt to aigw process: %v", err)
286+
}
287+
// Wait for the process to exit gracefully, in worst case this is
288+
// killed in 3 seconds by WaitDelay above. In that case, you may
289+
// have a zombie Envoy process left behind!
290+
if _, err := cmd.Process.Wait(); err != nil {
291+
t.Logf("Failed to wait for aigw process to exit: %v", err)
292+
}
293+
})
271294

272295
// wait for the ready message or exit.
273296
StartAndAwaitReady(t, cmd, stdout, stderr, "starting main dispatch loop")

0 commit comments

Comments
 (0)