[arvados] updated: 2.1.0-2926-gbf6539ec9

git repository hosting git at public.arvados.org
Thu Sep 22 15:21:55 UTC 2022


Summary of changes:
 sdk/go/arvados/fs_site.go | 50 ++++++++++++++++++++++++++---------------------
 1 file changed, 28 insertions(+), 22 deletions(-)

       via  bf6539ec9d5f207be4be363720ef118e25e7abbe (commit)
      from  6289b570a8eb6aea964c14c8e8c5bf11443f726d (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.


commit bf6539ec9d5f207be4be363720ef118e25e7abbe
Author: Tom Clegg <tom at curii.com>
Date:   Thu Sep 22 11:16:38 2022 -0400

    19362: Cleanup/comment locking.
    
    Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tom at curii.com>

diff --git a/sdk/go/arvados/fs_site.go b/sdk/go/arvados/fs_site.go
index 6719488e2..a4a18837e 100644
--- a/sdk/go/arvados/fs_site.go
+++ b/sdk/go/arvados/fs_site.go
@@ -153,16 +153,6 @@ func (fs *customFileSystem) newNode(name string, perm os.FileMode, modTime time.
 }
 
 func (fs *customFileSystem) newCollectionOrProjectHardlink(parent inode, id string) (inode, error) {
-	fs.byIDLock.Lock()
-	n := fs.byID[id]
-	if n != nil {
-		// Avoid the extra remote API lookup if we already
-		// have a singleton for this ID.
-		fs.byIDLock.Unlock()
-		return &hardlink{inode: n, parent: parent, name: id}, nil
-	}
-	fs.byIDLock.Unlock()
-
 	if strings.Contains(id, "-4zz18-") || pdhRegexp.MatchString(id) {
 		node, err := fs.collectionSingleton(id)
 		if os.IsNotExist(err) {
@@ -172,13 +162,22 @@ func (fs *customFileSystem) newCollectionOrProjectHardlink(parent inode, id stri
 		}
 		return &hardlink{inode: node, parent: parent, name: id}, nil
 	} else if strings.Contains(id, "-j7d0g-") || strings.Contains(id, "-tpzed-") {
-		proj, err := fs.getProject(id)
-		if os.IsNotExist(err) {
-			return nil, nil
-		} else if err != nil {
-			return nil, err
+		fs.byIDLock.Lock()
+		node := fs.byID[id]
+		fs.byIDLock.Unlock()
+		if node == nil {
+			// Look up the project synchronously before
+			// calling projectSingleton (otherwise we
+			// wouldn't detect a nonexistent project until
+			// it's too late to return ErrNotExist).
+			proj, err := fs.getProject(id)
+			if os.IsNotExist(err) {
+				return nil, nil
+			} else if err != nil {
+				return nil, err
+			}
+			node = fs.projectSingleton(id, proj)
 		}
-		node := fs.projectSingleton(id, proj)
 		return &hardlink{inode: node, parent: parent, name: id}, nil
 	} else {
 		return nil, nil
@@ -242,12 +241,13 @@ func (fs *customFileSystem) getProject(uuid string) (*Group, error) {
 }
 
 func (fs *customFileSystem) collectionSingleton(id string) (inode, error) {
+	// Return existing singleton, if we have it
 	fs.byIDLock.Lock()
-	if n := fs.byID[id]; n != nil {
-		fs.byIDLock.Unlock()
-		return n, nil
-	}
+	existing := fs.byID[id]
 	fs.byIDLock.Unlock()
+	if existing != nil {
+		return existing, nil
+	}
 
 	coll, err := fs.getCollection(id)
 	if err != nil {
@@ -260,11 +260,17 @@ func (fs *customFileSystem) collectionSingleton(id string) (inode, error) {
 	cfs := newfs.(*collectionFileSystem)
 	cfs.SetParent(fs.byIDRoot, id)
 
+	// Check again in case another goroutine has added a node to
+	// fs.byID since we checked above.
 	fs.byIDLock.Lock()
 	defer fs.byIDLock.Unlock()
-	if n := fs.byID[id]; n != nil {
-		return n, nil
+	if existing = fs.byID[id]; existing != nil {
+		// Other goroutine won the race. Discard the node we
+		// just made, and return the race winner.
+		return existing, nil
 	}
+	// We won the race. Save the new node in fs.byID and
+	// fs.byIDRoot.
 	fs.byID[id] = cfs
 	fs.byIDRoot.Lock()
 	defer fs.byIDRoot.Unlock()

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


hooks/post-receive
-- 




More information about the arvados-commits mailing list