@@ -154,29 +154,6 @@ var pruneRequestKeyScript = redis.NewScript(`
154154 return 0
155155` )
156156
157- // clearPodEntriesScript removes one batch of reverse-index members, deletes
158- // matching request-key hash fields, and prunes request-key hashes that become
159- // empty. Malformed members are only removed from the reverse-index set.
160- var clearPodEntriesScript = redis .NewScript (`
161- local removed = 0
162- for i = 1, #ARGV do
163- local member = ARGV[i]
164- redis.call('SREM', KEYS[1], member)
165- local sep = string.find(member, string.char(0), 1, true)
166- if sep ~= nil then
167- local requestKey = string.sub(member, 1, sep - 1)
168- local field = string.sub(member, sep + 1)
169- if requestKey ~= '' and field ~= '' then
170- removed = removed + redis.call('HDEL', requestKey, field)
171- if redis.call('HLEN', requestKey) == 0 then
172- redis.call('DEL', requestKey)
173- end
174- end
175- end
176- end
177- return removed
178- ` )
179-
180157// pruneEngineKeyScript atomically deletes an engine key mapping only if all
181158// associated request key hashes are empty. This prevents a TOCTOU race where a
182159// concurrent Add could insert into a request key between checking and deleting.
@@ -441,6 +418,19 @@ func redisPodEntryMember(requestKey, field string) string {
441418 return requestKey + "\x00 " + field
442419}
443420
421+ type redisPodEntryRef struct {
422+ requestKey string
423+ field string
424+ }
425+
426+ func parseRedisPodEntryMember (member string ) (redisPodEntryRef , bool ) {
427+ requestKey , field , ok := strings .Cut (member , "\x00 " )
428+ if ! ok || requestKey == "" || field == "" {
429+ return redisPodEntryRef {}, false
430+ }
431+ return redisPodEntryRef {requestKey : requestKey , field : field }, true
432+ }
433+
444434// Clear removes every reverse-indexed field for the pod across all request-key
445435// hashes and device tiers. Add maintains an exact per-pod set of
446436// "<requestKey>\x00<encodedPodField>" entries, so Clear only touches keys this
@@ -450,18 +440,17 @@ func (r *RedisIndex) Clear(ctx context.Context, podIdentifier string) error {
450440 podEntriesKey := redisPodEntriesKey (podIdentifier )
451441
452442 const scanBatch int64 = 1024
453- removed := 0
443+ processed := 0
454444 var cursor uint64
455445 for {
456446 members , next , err := r .RedisClient .SScan (ctx , podEntriesKey , cursor , "" , scanBatch ).Result ()
457447 if err != nil {
458448 return fmt .Errorf ("clear reverse-index scan failed: %w" , err )
459449 }
460- count , err := r .clearRedisPodEntryMembers (ctx , podEntriesKey , members )
461- if err != nil {
450+ if err := r .clearRedisPodEntryMembers (ctx , podEntriesKey , members ); err != nil {
462451 return err
463452 }
464- removed += count
453+ processed += len ( members )
465454
466455 if cursor = next ; cursor != 0 {
467456 continue
@@ -475,22 +464,25 @@ func (r *RedisIndex) Clear(ctx context.Context, podIdentifier string) error {
475464 }
476465 }
477466
478- logger .Info ("cleared pod from index" , "pod" , podIdentifier , "removed " , removed )
467+ logger .Info ("cleared pod from index" , "pod" , podIdentifier , "members " , processed )
479468 return nil
480469}
481470
482- func (r * RedisIndex ) clearRedisPodEntryMembers (ctx context.Context , podEntriesKey string , members []string ) ( int , error ) {
471+ func (r * RedisIndex ) clearRedisPodEntryMembers (ctx context.Context , podEntriesKey string , members []string ) error {
483472 if len (members ) == 0 {
484- return 0 , nil
473+ return nil
485474 }
486475
487- args := make ([]interface {}, len (members ))
488- for i , member := range members {
489- args [i ] = member
476+ pipe := r .RedisClient .Pipeline ()
477+ for _ , member := range members {
478+ ref , ok := parseRedisPodEntryMember (member )
479+ if ok {
480+ pipe .HDel (ctx , ref .requestKey , ref .field )
481+ }
482+ pipe .SRem (ctx , podEntriesKey , member )
490483 }
491- removed , err := clearPodEntriesScript .Run (ctx , r .RedisClient , []string {podEntriesKey }, args ... ).Int ()
492- if err != nil && ! errors .Is (err , redis .Nil ) {
493- return 0 , fmt .Errorf ("clear reverse-index batch failed: %w" , err )
484+ if _ , err := pipe .Exec (ctx ); err != nil {
485+ return fmt .Errorf ("clear reverse-index pipeline failed: %w" , err )
494486 }
495- return removed , nil
487+ return nil
496488}
0 commit comments