From a08c786691932192149fa08ee83f337d85abfd01 Mon Sep 17 00:00:00 2001 From: Archana Shinde Date: Tue, 23 Jan 2018 16:23:01 -0800 Subject: [PATCH 1/3] tests: Close all KSM related fds Close all KSM related fds that we create in our KSM tests. While these are left open while running the proxy_test.go tests, where detecting leaking file descriptors is relevant, it looks like the open ksm fds get closed by the go runtime in the newer version of Go leading to different before and after file descriptor snapshots in the proxy_test.go tests. Fixes #198 Signed-off-by: Archana Shinde --- ksm_test.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/ksm_test.go b/ksm_test.go index 3a62582..321bf1c 100644 --- a/ksm_test.go +++ b/ksm_test.go @@ -131,6 +131,18 @@ func initKSM(root string, t *testing.T) *ksm { return k } +func closeKSMFds(k *ksm) { + if k.run.file != nil { + _ = k.run.close() + } + if k.sleepInterval.file != nil { + _ = k.sleepInterval.close() + } + if k.pagesToScan.file != nil { + _ = k.pagesToScan.close() + } +} + func TestKSMAvailabilityDummy(t *testing.T) { _, err := newKSM("foo") assert.NotNil(t, err) @@ -138,6 +150,7 @@ func TestKSMAvailabilityDummy(t *testing.T) { func TestKSMAvailability(t *testing.T) { k := initKSM(defaultKSMRoot, t) + defer closeKSMFds(k) err := k.isAvailable() assert.Nil(t, err) @@ -209,6 +222,7 @@ func TestKSMInit(t *testing.T) { assert.Nil(t, err) k := initKSM(defaultKSMRoot, t) + defer closeKSMFds(k) assert.Equal(t, k.initialPagesToScan, scan) assert.Equal(t, k.initialSleepInterval, interval) @@ -250,6 +264,7 @@ func TestKSMRestore(t *testing.T) { assert.Nil(t, err) k := initKSM(defaultKSMRoot, t) + defer closeKSMFds(k) // Write dummy values and read them back var newInterval = "foo" @@ -299,6 +314,7 @@ func TestKSMRestore(t *testing.T) { func TestKSMKick(t *testing.T) { k := initKSM(defaultKSMRoot, t) + defer closeKSMFds(k) timer := time.NewTimer(time.Second) k.throttling = true @@ -334,6 +350,7 @@ func TestKSMTune(t *testing.T) { assert.Nil(t, err) k := initKSM(defaultKSMRoot, t) + defer closeKSMFds(k) for _, v := range ksmSettings { err = k.tune(v) @@ -474,6 +491,7 @@ func testThrottle(k *ksm, t *testing.T) { func TestKSMThrottle(t *testing.T) { k := initKSM(defaultKSMRoot, t) + defer closeKSMFds(k) // Let's make the throttling down faster, for quicker tests purpose. ksmAggressiveInterval = 500 * time.Millisecond From daebb1b77a80e0ff9b67cea08a5323492c28fad3 Mon Sep 17 00:00:00 2001 From: Archana Shinde Date: Tue, 23 Jan 2018 16:12:10 -0800 Subject: [PATCH 2/3] tests: Close /dev/null file descriptor This file is opened to check our file descriptor leak detector works correctly. Close it before exiting the test. Signed-off-by: Archana Shinde --- fdleak_test.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/fdleak_test.go b/fdleak_test.go index fe73820..c392a1d 100644 --- a/fdleak_test.go +++ b/fdleak_test.go @@ -280,7 +280,7 @@ func TestFdDetectorLeak(t *testing.T) { t.Error(err) } - _, err = os.Open("/dev/null") + f, err := os.Open("/dev/null") if err != nil { t.Error(err) } @@ -296,6 +296,10 @@ func TestFdDetectorLeak(t *testing.T) { fmt.Print(buffer.String()) t.Fatal() } + + if err := f.Close(); err != nil { + t.Error(err) + } } func TestFdDetectorCompare(t *testing.T) { From cc533a3a6dcc14ce8fde90afad718e3ef0663786 Mon Sep 17 00:00:00 2001 From: Archana Shinde Date: Tue, 23 Jan 2018 16:24:03 -0800 Subject: [PATCH 3/3] tests: Add defer statements to close file descriptors Move the defer statements to close fds immediately after they are opened, to make sure they get closed in case of error occuring later on in the program flow. Signed-off-by: Archana Shinde --- ksm_test.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ksm_test.go b/ksm_test.go index 321bf1c..1c9be06 100644 --- a/ksm_test.go +++ b/ksm_test.go @@ -57,21 +57,20 @@ func ksmTestPrepare() error { if err != nil { return err } + defer ksmTestRun.Close() ksmTestPagesToScan, err := os.Create(filepath.Join(defaultKSMRoot, ksmPagesToScan)) if err != nil { return err } + defer ksmTestPagesToScan.Close() ksmTestSleepMillisec, err := os.Create(filepath.Join(defaultKSMRoot, ksmSleepMillisec)) if err != nil { return err } - defer ksmTestRun.Close() - defer ksmTestPagesToScan.Close() defer ksmTestSleepMillisec.Close() - return nil }