Browse Source

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>
pull/7122/head
Chris Lu 2 months ago
committed by GitHub
parent
commit
3ac2a2e22d
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 26
      weed/filer/tikv/tikv_store.go

26
weed/filer/tikv/tikv_store.go

@ -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)

Loading…
Cancel
Save