fix tikv listing due to expired entries (#7115)

* fix tikv listing due to expired entries

When there are many entries with empty fileName values (which can happen after TTL cleanup), the continue statements prevent the loop counter from incrementing, creating an infinite loop.

* address comments

* Update weed/filer/tikv/tikv_store.go

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* address comments

Update weed/filer/tikv/tikv_store.go

Co-Authored-By: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
Chris Lu
2025-08-08 12:38:55 -07:00
committed by GitHub
parent fae416586b
commit 3ac2a2e22d

View File

@@ -228,19 +228,31 @@ func (store *TikvStore) ListDirectoryPrefixedEntries(ctx context.Context, dirPat
return err return err
} }
defer iter.Close() defer iter.Close()
for i := int64(0); i < limit && iter.Valid(); i++ { i := int64(0)
for iter.Valid() {
key := iter.Key() key := iter.Key()
if !bytes.HasPrefix(key, directoryPrefix) { if !bytes.HasPrefix(key, directoryPrefix) {
break break
} }
fileName := getNameFromKey(key) fileName := getNameFromKey(key)
if fileName == "" || fileName == startFileName && !includeStartFile { if fileName == "" {
if err := iter.Next(); err != nil { if err := iter.Next(); err != nil {
break break
} else { }
continue continue
} }
if fileName == startFileName && !includeStartFile {
if err := iter.Next(); err != nil {
break
} }
continue
}
// Check limit only before processing valid entries
if limit > 0 && i >= limit {
break
}
lastFileName = fileName lastFileName = fileName
entry := &filer.Entry{ entry := &filer.Entry{
FullPath: util.NewFullPath(string(dirPath), fileName), FullPath: util.NewFullPath(string(dirPath), fileName),
@@ -252,11 +264,15 @@ func (store *TikvStore) ListDirectoryPrefixedEntries(ctx context.Context, dirPat
glog.V(0).InfofCtx(ctx, "list %s : %v", entry.FullPath, err) glog.V(0).InfofCtx(ctx, "list %s : %v", entry.FullPath, err)
break break
} }
// Only increment counter after successful processing
i++
if err := iter.Next(); !eachEntryFunc(entry) || err != nil { if err := iter.Next(); !eachEntryFunc(entry) || err != nil {
break break
} }
} }
return nil return err
}) })
if err != nil { if err != nil {
return lastFileName, fmt.Errorf("prefix list %s : %v", dirPath, err) return lastFileName, fmt.Errorf("prefix list %s : %v", dirPath, err)