mirror of
https://github.com/optim-enterprises-bv/vault.git
synced 2025-10-29 09:42:25 +00:00
Sort namespaces, mounts, and clients before adding them to HLL (#28062)
* sort namespaces and mounts before adding them * also sort clients * add comments * pr comment fixes * changelog * changelog update
This commit is contained in:
3
changelog/28062.txt
Normal file
3
changelog/28062.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
```release-note:improvement
|
||||
core/activity: Ensure client count queries that include the current month return consistent results by sorting the clients before performing estimation
|
||||
```
|
||||
@@ -8,6 +8,7 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"slices"
|
||||
"sort"
|
||||
"strings"
|
||||
"time"
|
||||
@@ -156,20 +157,30 @@ func (a *ActivityLog) computeCurrentMonthForBillingPeriodInternal(ctx context.Co
|
||||
return nil, errors.New("malformed current month used to calculate current month's activity")
|
||||
}
|
||||
|
||||
for nsID, namespace := range month.Namespaces {
|
||||
namespaces := month.Namespaces.sort()
|
||||
for _, n := range namespaces {
|
||||
nsID := n.id
|
||||
namespace := n.processByNamespace
|
||||
namespaceActivity := &activity.MonthlyNamespaceRecord{NamespaceID: nsID, Counts: &activity.CountsRecord{}}
|
||||
newNamespaceActivity := &activity.MonthlyNamespaceRecord{NamespaceID: nsID, Counts: &activity.CountsRecord{}}
|
||||
mountsActivity := make([]*activity.MountRecord, 0)
|
||||
newMountsActivity := make([]*activity.MountRecord, 0)
|
||||
|
||||
for mountAccessor, mount := range namespace.Mounts {
|
||||
mounts := namespace.Mounts.sort()
|
||||
for _, m := range mounts {
|
||||
mountAccessor := m.accessor
|
||||
mount := m.processMount
|
||||
mountPath := a.mountAccessorToMountPath(mountAccessor)
|
||||
|
||||
mountCounts := &activity.CountsRecord{}
|
||||
newMountCounts := &activity.CountsRecord{}
|
||||
|
||||
for _, typ := range ActivityClientTypes {
|
||||
for clientID := range mount.Counts.clientsByType(typ) {
|
||||
clients := mount.Counts.clientsByType(typ)
|
||||
clientIDs := clients.sort()
|
||||
|
||||
// sort the client IDs before inserting
|
||||
for _, clientID := range clientIDs {
|
||||
hllByType[typ].Insert([]byte(clientID))
|
||||
|
||||
// increment the per mount, per namespace, and total counts
|
||||
@@ -241,6 +252,47 @@ func (a *ActivityLog) incrementCount(c *activity.CountsRecord, num int, typ stri
|
||||
}
|
||||
}
|
||||
|
||||
type processByNamespaceID struct {
|
||||
id string
|
||||
*processByNamespace
|
||||
}
|
||||
|
||||
func (s summaryByNamespace) sort() []*processByNamespaceID {
|
||||
namespaces := make([]*processByNamespaceID, 0, len(s))
|
||||
for nsID, namespace := range s {
|
||||
namespaces = append(namespaces, &processByNamespaceID{id: nsID, processByNamespace: namespace})
|
||||
}
|
||||
slices.SortStableFunc(namespaces, func(a, b *processByNamespaceID) int {
|
||||
return strings.Compare(a.id, b.id)
|
||||
})
|
||||
return namespaces
|
||||
}
|
||||
|
||||
type processMountAccessor struct {
|
||||
accessor string
|
||||
*processMount
|
||||
}
|
||||
|
||||
func (s summaryByMount) sort() []*processMountAccessor {
|
||||
mounts := make([]*processMountAccessor, 0, len(s))
|
||||
for mountAccessor, mount := range s {
|
||||
mounts = append(mounts, &processMountAccessor{accessor: mountAccessor, processMount: mount})
|
||||
}
|
||||
slices.SortStableFunc(mounts, func(a, b *processMountAccessor) int {
|
||||
return strings.Compare(a.accessor, b.accessor)
|
||||
})
|
||||
return mounts
|
||||
}
|
||||
|
||||
func (c clientIDSet) sort() []string {
|
||||
clientIDs := make([]string, 0, len(c))
|
||||
for clientID := range c {
|
||||
clientIDs = append(clientIDs, clientID)
|
||||
}
|
||||
sort.Strings(clientIDs)
|
||||
return clientIDs
|
||||
}
|
||||
|
||||
// sortALResponseNamespaces sorts the namespaces for activity log responses.
|
||||
func (a *ActivityLog) sortALResponseNamespaces(byNamespaceResponse []*ResponseNamespace) {
|
||||
sort.Slice(byNamespaceResponse, func(i, j int) bool {
|
||||
|
||||
Reference in New Issue
Block a user