mirror of
https://github.com/minio/minio.git
synced 2025-11-09 13:39:46 -05:00
Load STS accounts into IAM cache lazily (#17994)
In situations with large number of STS credentials on disk, IAM load time is high. To mitigate this, STS accounts will now be loaded into memory only on demand - i.e. when the credential is used. In each IAM cache (re)load we skip loading STS credentials and STS policy mappings into memory. Since STS accounts only expire and cannot be deleted, there is no risk of invalid credentials being reused, because credential validity is checked when it is used.
This commit is contained in:
committed by
GitHub
parent
18e23bafd9
commit
ed2c2a285f
30
cmd/iam.go
30
cmd/iam.go
@@ -849,13 +849,20 @@ func (sys *IAMSys) GetUserInfo(ctx context.Context, name string) (u madmin.UserI
|
||||
return u, errServerNotInitialized
|
||||
}
|
||||
|
||||
loadUserCalled := false
|
||||
select {
|
||||
case <-sys.configLoaded:
|
||||
default:
|
||||
sys.store.LoadUser(ctx, name)
|
||||
loadUserCalled = true
|
||||
}
|
||||
|
||||
return sys.store.GetUserInfo(name)
|
||||
userInfo, err := sys.store.GetUserInfo(name)
|
||||
if err == errNoSuchUser && !loadUserCalled {
|
||||
sys.store.LoadUser(ctx, name)
|
||||
userInfo, err = sys.store.GetUserInfo(name)
|
||||
}
|
||||
return userInfo, err
|
||||
}
|
||||
|
||||
// QueryPolicyEntities - queries policy associations for builtin users/groups/policies.
|
||||
@@ -1421,31 +1428,24 @@ func (sys *IAMSys) GetUser(ctx context.Context, accessKey string) (u UserIdentit
|
||||
return u, false
|
||||
}
|
||||
|
||||
fallback := false
|
||||
if accessKey == globalActiveCred.AccessKey {
|
||||
return newUserIdentity(globalActiveCred), true
|
||||
}
|
||||
|
||||
loadUserCalled := false
|
||||
select {
|
||||
case <-sys.configLoaded:
|
||||
default:
|
||||
sys.store.LoadUser(ctx, accessKey)
|
||||
fallback = true
|
||||
loadUserCalled = true
|
||||
}
|
||||
|
||||
u, ok = sys.store.GetUser(accessKey)
|
||||
if !ok && !fallback {
|
||||
// accessKey not found, also
|
||||
// IAM store is not in fallback mode
|
||||
// we can try to reload again from
|
||||
// the IAM store and see if credential
|
||||
// exists now. If it doesn't proceed to
|
||||
// fail.
|
||||
if !ok && !loadUserCalled {
|
||||
sys.store.LoadUser(ctx, accessKey)
|
||||
u, ok = sys.store.GetUser(accessKey)
|
||||
}
|
||||
|
||||
if !ok {
|
||||
if accessKey == globalActiveCred.AccessKey {
|
||||
return newUserIdentity(globalActiveCred), true
|
||||
}
|
||||
}
|
||||
return u, ok && u.Credentials.IsValid()
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user