ydb-platform/ydb-go-yc-metadata

Производительность метода InstanceServiceAccountCredentials.Token

Opened this issue · 0 comments

В своем проекте я собрал несколько pprof cpu профилей и нашел там критическое место с бесконечным циклом:

for {
select {
case <-ctx.Done():
return "", &createTokenError{
Cause: ctx.Err(),
Reason: ctx.Err().Error(),
}
default:
m.mu.RLock()
token, err = m.token, m.err
m.mu.RUnlock()
if token != "" || err != nil {
return token, err
}
// not yet initialized, wait
}
}
.

В случае недоступности metadataURL, в этом месте можно нагрузить CPU.

Время терялось на <-ctx.Done() и m.mu.RLock().

Профили находятся в архиве: https://gist.github.com/kulaginds/9bcdda3661005c6b5e552608794996c1.