Skip to content

Commit

Permalink
fallback to upstream when sessions are missing from cache (gravitatio…
Browse files Browse the repository at this point in the history
  • Loading branch information
fspmarshall authored Jan 8, 2024
1 parent 61a0b88 commit 7989ac4
Showing 1 changed file with 55 additions and 4 deletions.
59 changes: 55 additions & 4 deletions lib/cache/cache.go
Original file line number Diff line number Diff line change
Expand Up @@ -2262,7 +2262,19 @@ func (c *Cache) GetAppSession(ctx context.Context, req types.GetAppSessionReques
return nil, trace.Wrap(err)
}
defer rg.Release()
return rg.reader.GetAppSession(ctx, req)
sess, err := rg.reader.GetAppSession(ctx, req)
if trace.IsNotFound(err) && rg.IsCacheRead() {
// release read lock early
rg.Release()
// fallback is sane because method is never used
// in construction of derivative caches.
if sess, err := c.Config.AppSession.GetAppSession(ctx, req); err == nil {
c.Logger.Warnf("Cache was forced to load session %v/%v from upstream. Frequent occurrence may indicate sync/perf issues.", sess.GetSubKind(), sess.GetName())
return sess, nil
}
}

return sess, trace.Wrap(err)
}

// GetSnowflakeSession gets Snowflake web session.
Expand All @@ -2275,7 +2287,20 @@ func (c *Cache) GetSnowflakeSession(ctx context.Context, req types.GetSnowflakeS
return nil, trace.Wrap(err)
}
defer rg.Release()
return rg.reader.GetSnowflakeSession(ctx, req)

sess, err := rg.reader.GetSnowflakeSession(ctx, req)
if trace.IsNotFound(err) && rg.IsCacheRead() {
// release read lock early
rg.Release()
// fallback is sane because method is never used
// in construction of derivative caches.
if sess, err := c.Config.SnowflakeSession.GetSnowflakeSession(ctx, req); err == nil {
c.Logger.Warnf("Cache was forced to load session %v/%v from upstream. Frequent occurrence may indicate sync/perf issues.", sess.GetSubKind(), sess.GetName())
return sess, nil
}
}

return sess, trace.Wrap(err)
}

// GetSAMLIdPSession gets a SAML IdP session.
Expand All @@ -2288,7 +2313,20 @@ func (c *Cache) GetSAMLIdPSession(ctx context.Context, req types.GetSAMLIdPSessi
return nil, trace.Wrap(err)
}
defer rg.Release()
return rg.reader.GetSAMLIdPSession(ctx, req)

sess, err := rg.reader.GetSAMLIdPSession(ctx, req)
if trace.IsNotFound(err) && rg.IsCacheRead() {
// release read lock early
rg.Release()
// fallback is sane because method is never used
// in construction of derivative caches.
if sess, err := c.Config.SAMLIdPSession.GetSAMLIdPSession(ctx, req); err == nil {
c.Logger.Warnf("Cache was forced to load session %v/%v from upstream. Frequent occurrence may indicate sync/perf issues.", sess.GetSubKind(), sess.GetName())
return sess, nil
}
}

return sess, trace.Wrap(err)
}

// GetDatabaseServers returns all registered database proxy servers.
Expand Down Expand Up @@ -2340,7 +2378,20 @@ func (c *Cache) GetWebSession(ctx context.Context, req types.GetWebSessionReques
return nil, trace.Wrap(err)
}
defer rg.Release()
return rg.reader.Get(ctx, req)

sess, err := rg.reader.Get(ctx, req)

if trace.IsNotFound(err) && rg.IsCacheRead() {
// release read lock early
rg.Release()
// fallback is sane because method is never used
// in construction of derivative caches.
if sess, err := c.Config.WebSession.Get(ctx, req); err == nil {
c.Logger.Warnf("Cache was forced to load session %v/%v from upstream. Frequent occurrence may indicate sync/perf issues.", sess.GetSubKind(), sess.GetName())
return sess, nil
}
}
return sess, trace.Wrap(err)
}

// GetWebToken gets a web token.
Expand Down

0 comments on commit 7989ac4

Please sign in to comment.