20831: DiscoveryDocument fn improvements
authorPeter Amstutz <peter.amstutz@curii.com>
Mon, 27 Nov 2023 17:29:28 +0000 (12:29 -0500)
committerPeter Amstutz <peter.amstutz@curii.com>
Mon, 27 Nov 2023 17:29:28 +0000 (12:29 -0500)
* Only cache discovery document for 1 hour
* rpc.Conn takes a mutex when working with discovery document
* Simplify a couple of cases where calling chooseBackend would always return conn.local

Arvados-DCO-1.1-Signed-off-by: Peter Amstutz <peter.amstutz@curii.com>

lib/controller/federation/conn.go
lib/controller/rpc/conn.go

index 75b9f2136bde805df4e6d91e478d93d70e49f38f..c5facdc7d9cf58fd2dbfa01091620a0a528e2381 100644 (file)
@@ -225,11 +225,11 @@ func (conn *Conn) ConfigGet(ctx context.Context) (json.RawMessage, error) {
 }
 
 func (conn *Conn) VocabularyGet(ctx context.Context) (arvados.Vocabulary, error) {
-       return conn.chooseBackend(conn.cluster.ClusterID).VocabularyGet(ctx)
+       return conn.local.VocabularyGet(ctx)
 }
 
 func (conn *Conn) DiscoveryDocument(ctx context.Context) (arvados.DiscoveryDocument, error) {
-       return conn.chooseBackend(conn.cluster.ClusterID).DiscoveryDocument(ctx)
+       return conn.local.DiscoveryDocument(ctx)
 }
 
 func (conn *Conn) Login(ctx context.Context, options arvados.LoginOptions) (arvados.LoginResponse, error) {
index 6195b79da13794cee9dcfd2143cf05e3321a4a5e..5d1b0e52fec59d3df918ec8385af14bcd9a8e5b3 100644 (file)
@@ -49,6 +49,8 @@ type Conn struct {
        baseURL           url.URL
        tokenProvider     TokenProvider
        discoveryDocument *arvados.DiscoveryDocument
+       discoveryDocumentMtx sync.Mutex
+       discoveryDocumentExpires time.Time
 }
 
 func NewConn(clusterID string, url *url.URL, insecure bool, tp TokenProvider) *Conn {
@@ -194,7 +196,9 @@ func (conn *Conn) VocabularyGet(ctx context.Context) (arvados.Vocabulary, error)
 }
 
 func (conn *Conn) DiscoveryDocument(ctx context.Context) (arvados.DiscoveryDocument, error) {
-       if conn.discoveryDocument != nil {
+       conn.discoveryDocumentMtx.Lock()
+       defer conn.discoveryDocumentMtx.Unlock()
+       if conn.discoveryDocument != nil && time.Now().Before(conn.discoveryDocumentExpires) {
                return *conn.discoveryDocument, nil
        }
        var dd arvados.DiscoveryDocument
@@ -203,6 +207,7 @@ func (conn *Conn) DiscoveryDocument(ctx context.Context) (arvados.DiscoveryDocum
                return dd, err
        }
        conn.discoveryDocument = &dd
+       discoveryDocumentExpires = time.Now().Add(time.Hour)
        return *conn.discoveryDocument, nil
 }