Skip to content

Commit 97ddd09

Browse files
chore: avoid doing some unnecessary work while listing or merging sharded delete requests (backport k240) (#16127)
Co-authored-by: Sandeep Sukhani <sandeep.d.sukhani@gmail.com>
1 parent 9b35660 commit 97ddd09

File tree

5 files changed

+58
-28
lines changed

5 files changed

+58
-28
lines changed

‎pkg/compactor/deletion/delete_requests_manager.go

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ package deletion
33
import (
44
"context"
55
"fmt"
6+
"slices"
67
"sort"
8+
"strings"
79
"sync"
810
"time"
911

@@ -94,8 +96,10 @@ func (d *DeleteRequestsManager) mergeShardedRequests(ctx context.Context) error
9496
return err
9597
}
9698

97-
deletesPerRequest := partitionByRequestID(deleteGroups)
98-
deleteRequests := mergeDeletes(deletesPerRequest)
99+
slices.SortFunc(deleteGroups, func(a, b DeleteRequest) int {
100+
return strings.Compare(a.RequestID, b.RequestID)
101+
})
102+
deleteRequests := mergeDeletes(deleteGroups)
99103
for _, req := range deleteRequests {
100104
// do not consider requests which do not have an id. Request ID won't be set in some tests or there is a bug in our code for loading requests.
101105
if req.RequestID == "" {
@@ -108,17 +112,38 @@ func (d *DeleteRequestsManager) mergeShardedRequests(ctx context.Context) error
108112
continue
109113
}
110114
// do not do anything if we are not done with processing all the shards or the number of shards is 1
111-
if req.Status != StatusProcessed || len(deletesPerRequest[req.RequestID]) == 1 {
115+
if req.Status != StatusProcessed {
116+
continue
117+
}
118+
119+
var idxStart, idxEnd int
120+
for i := range deleteGroups {
121+
if req.RequestID == deleteGroups[i].RequestID {
122+
idxStart = i
123+
break
124+
}
125+
}
126+
127+
for i := len(deleteGroups) - 1; i > 0; i-- {
128+
if req.RequestID == deleteGroups[i].RequestID {
129+
idxEnd = i
130+
break
131+
}
132+
}
133+
134+
// do not do anything if the number of shards is 1
135+
if idxStart == idxEnd {
112136
continue
113137
}
138+
reqShards := deleteGroups[idxStart : idxEnd+1]
114139

115140
level.Info(util_log.Logger).Log("msg", "merging sharded request",
116141
"request_id", req.RequestID,
117-
"num_shards", len(deletesPerRequest),
142+
"num_shards", len(reqShards),
118143
"start_time", req.StartTime.Unix(),
119144
"end_time", req.EndTime.Unix(),
120145
)
121-
if err := d.deleteRequestsStore.MergeShardedRequests(ctx, req, deletesPerRequest[req.RequestID]); err != nil {
146+
if err := d.deleteRequestsStore.MergeShardedRequests(ctx, req, reqShards); err != nil {
122147
return err
123148
}
124149
}

‎pkg/compactor/deletion/delete_requests_store.go

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -292,15 +292,14 @@ func (ds *deleteRequestsStore) queryDeleteRequests(ctx context.Context, deleteQu
292292

293293
func (ds *deleteRequestsStore) deleteRequestsWithDetails(ctx context.Context, partialDeleteRequests []DeleteRequest) ([]DeleteRequest, error) {
294294
deleteRequests := make([]DeleteRequest, 0, len(partialDeleteRequests))
295-
for _, group := range partitionByRequestID(partialDeleteRequests) {
296-
for _, deleteRequest := range group {
297-
requestWithDetails, err := ds.queryDeleteRequestDetails(ctx, deleteRequest)
298-
if err != nil {
299-
return nil, err
300-
}
301-
deleteRequests = append(deleteRequests, requestWithDetails)
295+
for _, deleteRequest := range partialDeleteRequests {
296+
requestWithDetails, err := ds.queryDeleteRequestDetails(ctx, deleteRequest)
297+
if err != nil {
298+
return nil, err
302299
}
300+
deleteRequests = append(deleteRequests, requestWithDetails)
303301
}
302+
304303
return deleteRequests, nil
305304
}
306305

‎pkg/compactor/deletion/grpc_request_handler.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,7 @@ func (g *GRPCRequestHandler) GetDeleteRequests(ctx context.Context, _ *grpc.GetD
4545
return nil, err
4646
}
4747

48-
deletesPerRequest := partitionByRequestID(deleteGroups)
49-
deleteRequests := mergeDeletes(deletesPerRequest)
48+
deleteRequests := mergeDeletes(deleteGroups)
5049

5150
sort.Slice(deleteRequests, func(i, j int) bool {
5251
return deleteRequests[i].CreatedAt < deleteRequests[j].CreatedAt

‎pkg/compactor/deletion/request_handler.go

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ import (
77
"math"
88
"net/http"
99
"net/url"
10+
"slices"
1011
"sort"
12+
"strings"
1113
"time"
1214

1315
"github.com/go-kit/log/level"
@@ -141,8 +143,7 @@ func (dm *DeleteRequestHandler) GetAllDeleteRequestsHandler(w http.ResponseWrite
141143
return
142144
}
143145

144-
deletesPerRequest := partitionByRequestID(deleteGroups)
145-
deleteRequests := mergeDeletes(deletesPerRequest)
146+
deleteRequests := mergeDeletes(deleteGroups)
146147

147148
sort.Slice(deleteRequests, func(i, j int) bool {
148149
return deleteRequests[i].CreatedAt < deleteRequests[j].CreatedAt
@@ -155,17 +156,31 @@ func (dm *DeleteRequestHandler) GetAllDeleteRequestsHandler(w http.ResponseWrite
155156
}
156157
}
157158

158-
func mergeDeletes(groups map[string][]DeleteRequest) []DeleteRequest {
159+
func mergeDeletes(reqs []DeleteRequest) []DeleteRequest {
160+
if len(reqs) <= 1 {
161+
return reqs
162+
}
163+
slices.SortFunc(reqs, func(a, b DeleteRequest) int {
164+
return strings.Compare(a.RequestID, b.RequestID)
165+
})
159166
mergedRequests := []DeleteRequest{} // Declare this way so the return value is [] rather than null
160-
for _, deletes := range groups {
161-
startTime, endTime, status := mergeData(deletes)
162-
newDelete := deletes[0]
167+
// find the start and end of shards of same request and merge them
168+
i := 0
169+
for j := 0; j < len(reqs); j++ {
170+
// if this is not the last request in the list and the next request belongs to same shard then keep looking further
171+
if j < len(reqs)-1 && reqs[i].RequestID == reqs[j+1].RequestID {
172+
continue
173+
}
174+
startTime, endTime, status := mergeData(reqs[i : j+1])
175+
newDelete := reqs[i]
163176
newDelete.StartTime = startTime
164177
newDelete.EndTime = endTime
165178
newDelete.Status = status
166179

167180
mergedRequests = append(mergedRequests, newDelete)
181+
i = j + 1
168182
}
183+
169184
return mergedRequests
170185
}
171186

‎pkg/compactor/deletion/util.go

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,3 @@ func deleteModeFromLimits(l Limits, userID string) (deletionmode.Mode, error) {
3434
mode := l.DeletionMode(userID)
3535
return deletionmode.ParseMode(mode)
3636
}
37-
38-
func partitionByRequestID(reqs []DeleteRequest) map[string][]DeleteRequest {
39-
groups := make(map[string][]DeleteRequest)
40-
for _, req := range reqs {
41-
groups[req.RequestID] = append(groups[req.RequestID], req)
42-
}
43-
return groups
44-
}

0 commit comments

Comments
 (0)