Update profile outside of process lock

This commit is contained in:
Daniel 2020-12-04 17:01:27 +01:00
parent 8e34be70bb
commit d9fcf8e64d
2 changed files with 24 additions and 13 deletions

View file

@ -9,16 +9,20 @@ import (
// GetProfile finds and assigns a profile set to the process.
func (p *Process) GetProfile(ctx context.Context) (changed bool, err error) {
// Update profile metadata outside of *Process lock.
var localProfile *profile.Profile
defer p.updateProfileMetadata(localProfile)
p.Lock()
defer p.Unlock()
// only find profiles if not already done.
// Check if profile is already loaded.
if p.profile != nil {
log.Tracer(ctx).Trace("process: profile already loaded")
// Mark profile as used.
p.profile.MarkUsed()
return false, nil
return
}
// If not, continue with loading the profile.
log.Tracer(ctx).Trace("process: loading profile")
// Check if we need a special profile.
@ -31,11 +35,24 @@ func (p *Process) GetProfile(ctx context.Context) (changed bool, err error) {
}
// Get the (linked) local profile.
localProfile, err := profile.GetProfile(profile.SourceLocal, profileID, p.Path)
localProfile, err = profile.GetProfile(profile.SourceLocal, profileID, p.Path)
if err != nil {
return false, err
}
// Assign profile to process.
p.LocalProfileKey = localProfile.Key()
p.profile = localProfile.LayeredProfile()
return true, nil
}
func (p *Process) updateProfileMetadata(localProfile *profile.Profile) {
// Check if there is a profile to work with.
if localProfile == nil {
return
}
// Update metadata of profile.
metadataUpdated := localProfile.UpdateMetadata(p.Name)
@ -49,10 +66,4 @@ func (p *Process) GetProfile(ctx context.Context) (changed bool, err error) {
log.Warningf("process: failed to save profile %s: %s", localProfile.ScopedID(), err)
}
}
// Assign profile to process.
p.LocalProfileKey = localProfile.Key()
p.profile = localProfile.LayeredProfile()
return true, nil
}

View file

@ -410,7 +410,7 @@ func (profile *Profile) UpdateMetadata(processName string) (changed bool) {
var needsUpdateFromSystem bool
// Check profile name.
_, filename := filepath.Split(profile.LinkedPath)
filename := filepath.Base(profile.LinkedPath)
// Update profile name if it is empty or equals the filename, which is the
// case for older profiles.
@ -464,7 +464,7 @@ func (profile *Profile) updateMetadataFromSystem(ctx context.Context) error {
}
// Get filename of linked path for comparison.
_, filename := filepath.Split(profile.LinkedPath)
filename := filepath.Base(profile.LinkedPath)
// TODO: Theoretically, the generated name from the system could be identical
// to the filename. This would mean that the worker is triggered every time