Skip to content

Commit

Permalink
[cluster-agent/languagedetection] Use strings.Builder to reduce alloc…
Browse files Browse the repository at this point in the history
…ations
  • Loading branch information
davidor committed Mar 5, 2025
1 parent 71deb82 commit b064d4f
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 10 deletions.
8 changes: 6 additions & 2 deletions cmd/cluster-agent/api/v1/languagedetection/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -112,9 +112,13 @@ func (handler *languageDetectionHandler) leaderHandler(w http.ResponseWriter, r

ownersLanguagesFromRequest := getOwnersLanguages(requestData, time.Now().Add(handler.cfg.languageTTL))

log.Tracef("Owner Languages state pre merge-and-flush: %s", handler.ownersLanguages.String())
if log.ShouldLog(log.TraceLvl) { // Avoid call to String() if not needed
log.Tracef("Owner Languages state pre merge-and-flush: %s", handler.ownersLanguages.String())
}
err = handler.ownersLanguages.mergeAndFlush(ownersLanguagesFromRequest, handler.wlm)
log.Tracef("Owner Languages state post merge-and-flush: %s", handler.ownersLanguages.String())
if log.ShouldLog(log.TraceLvl) { // Avoid call to String() if not needed
log.Tracef("Owner Languages state post merge-and-flush: %s", handler.ownersLanguages.String())
}
if err != nil {
http.Error(w, fmt.Sprintf("failed to store some (or all) languages in workloadmeta store: %s", err), http.StatusInternalServerError)
ProcessedRequests.Inc(statusError)
Expand Down
37 changes: 29 additions & 8 deletions cmd/cluster-agent/api/v1/languagedetection/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,20 +77,41 @@ func (ownersLanguages *OwnersLanguages) String() string {
ownersLanguages.mutex.Lock()
defer ownersLanguages.mutex.Unlock()

state := "["
var sb strings.Builder
sb.WriteString("[")

firstOwner := true
for owner, langs := range ownersLanguages.containersLanguages {
state += fmt.Sprintf("(%s/%s/%s, %v,[", owner.Namespace, owner.Kind, owner.Name, langs.dirty)
if !firstOwner {
sb.WriteString(",")
}

sb.WriteString(fmt.Sprintf("(%s/%s/%s, %v,[", owner.Namespace, owner.Kind, owner.Name, langs.dirty))

firstContainer := true
for container, languageSet := range langs.languages {
state += container.Name + ": ("
if !firstContainer {
sb.WriteString(",")
}
sb.WriteString(container.Name + ": (")

languages := make([]string, 0, len(languageSet))
for languagename := range languageSet {
state += fmt.Sprintf("%s,", languagename)
languages = append(languages, string(languagename))
}
state += "),"
sb.WriteString(strings.Join(languages, ","))

sb.WriteString(")")
firstContainer = false
}
state += "]),"

sb.WriteString("])")
firstOwner = false
}
state += "]"
return state

sb.WriteString("]")

return sb.String()
}

// getOrInitialize returns the containers languages for a specific namespaced owner, initialising it if it doesn't already
Expand Down

0 comments on commit b064d4f

Please sign in to comment.