[ARVADOS] created: 2.1.0-1569-g9ff58642c

Git user git at public.arvados.org
Mon Nov 1 18:52:11 UTC 2021


        at  9ff58642c2c1eaae8d6dd7c01e8fb85a030c2dfc (commit)


commit 9ff58642c2c1eaae8d6dd7c01e8fb85a030c2dfc
Author: Tom Clegg <tom at curii.com>
Date:   Mon Nov 1 14:49:29 2021 -0400

    12859: Fix unclosed file descriptors in local filesystem driver.
    
    Temporary file was not being closed/removed in the case where client
    disconnection is detected while waiting for the volume-level serialize
    lock.
    
    Also, GetDeviceID was leaking one file descriptor per volume at
    startup time.
    
    Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tom at curii.com>

diff --git a/services/keepstore/unix_volume.go b/services/keepstore/unix_volume.go
index a74616604..f076ccf18 100644
--- a/services/keepstore/unix_volume.go
+++ b/services/keepstore/unix_volume.go
@@ -135,6 +135,7 @@ func (v *UnixVolume) GetDeviceID() string {
 	if err != nil {
 		return giveup("opening %q: %s", udir, err)
 	}
+	defer d.Close()
 	uuids, err := d.Readdirnames(0)
 	if err != nil {
 		return giveup("reading %q: %s", udir, err)
@@ -274,29 +275,25 @@ func (v *UnixVolume) WriteBlock(ctx context.Context, loc string, rdr io.Reader)
 		return fmt.Errorf("error creating directory %s: %s", bdir, err)
 	}
 
-	tmpfile, tmperr := v.os.TempFile(bdir, "tmp"+loc)
-	if tmperr != nil {
-		return fmt.Errorf("TempFile(%s, tmp%s) failed: %s", bdir, loc, tmperr)
-	}
-
 	bpath := v.blockPath(loc)
+	tmpfile, err := v.os.TempFile(bdir, "tmp"+loc)
+	if err != nil {
+		return fmt.Errorf("TempFile(%s, tmp%s) failed: %s", bdir, loc, err)
+	}
+	defer v.os.Remove(tmpfile.Name())
+	defer tmpfile.Close()
 
-	if err := v.lock(ctx); err != nil {
+	if err = v.lock(ctx); err != nil {
 		return err
 	}
 	defer v.unlock()
 	n, err := io.Copy(tmpfile, rdr)
 	v.os.stats.TickOutBytes(uint64(n))
 	if err != nil {
-		err = fmt.Errorf("error writing %s: %s", bpath, err)
-		tmpfile.Close()
-		v.os.Remove(tmpfile.Name())
-		return err
+		return fmt.Errorf("error writing %s: %s", bpath, err)
 	}
-	if err := tmpfile.Close(); err != nil {
-		err = fmt.Errorf("error closing %s: %s", tmpfile.Name(), err)
-		v.os.Remove(tmpfile.Name())
-		return err
+	if err = tmpfile.Close(); err != nil {
+		return fmt.Errorf("error closing %s: %s", tmpfile.Name(), err)
 	}
 	// ext4 uses a low-precision clock and effectively backdates
 	// files by up to 10 ms, sometimes across a 1-second boundary,
@@ -307,14 +304,10 @@ func (v *UnixVolume) WriteBlock(ctx context.Context, loc string, rdr io.Reader)
 	v.os.stats.TickOps("utimes")
 	v.os.stats.Tick(&v.os.stats.UtimesOps)
 	if err = os.Chtimes(tmpfile.Name(), ts, ts); err != nil {
-		err = fmt.Errorf("error setting timestamps on %s: %s", tmpfile.Name(), err)
-		v.os.Remove(tmpfile.Name())
-		return err
+		return fmt.Errorf("error setting timestamps on %s: %s", tmpfile.Name(), err)
 	}
-	if err := v.os.Rename(tmpfile.Name(), bpath); err != nil {
-		err = fmt.Errorf("error renaming %s to %s: %s", tmpfile.Name(), bpath, err)
-		v.os.Remove(tmpfile.Name())
-		return err
+	if err = v.os.Rename(tmpfile.Name(), bpath); err != nil {
+		return fmt.Errorf("error renaming %s to %s: %s", tmpfile.Name(), bpath, err)
 	}
 	return nil
 }

-----------------------------------------------------------------------


hooks/post-receive
-- 




More information about the arvados-commits mailing list