Skip to content

Commit

Permalink
Fix amount of files read in UnionFile.Readdir
Browse files Browse the repository at this point in the history
To match behavior of os.File.Readdir, argument c in UnionFile.Readdir
should control amount of files read, not the upper bound of buffered
files.

Fixes #259
  • Loading branch information
std0 committed Aug 22, 2020
1 parent 6400260 commit 066c8b0
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 14 deletions.
20 changes: 16 additions & 4 deletions composite_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -477,7 +477,8 @@ func TestUnionFileReaddirAskForTooMany(t *testing.T) {
base := &MemMapFs{}
overlay := &MemMapFs{}

for i := 0; i < 5; i++ {
const testFiles = 5
for i := 0; i < testFiles; i++ {
WriteFile(base, fmt.Sprintf("file%d.txt", i), []byte("afero"), 0777)
}

Expand All @@ -490,13 +491,24 @@ func TestUnionFileReaddirAskForTooMany(t *testing.T) {

defer f.Close()

names, err := f.Readdirnames(6)
// Read part of all files
wantNames := 3
names, err := f.Readdirnames(wantNames)
if err != nil {
t.Fatal(err)
}
if len(names) != wantNames {
t.Fatalf("got %d names %v, want %d", len(names), names, wantNames)
}

if len(names) != 5 {
t.Fatal(names)
// Try to read more files than remaining
wantNames = testFiles - len(names)
names, err = f.Readdirnames(wantNames + 1)
if err != nil {
t.Fatal(err)
}
if len(names) != wantNames {
t.Fatalf("got %d names %v, want %d", len(names), names, wantNames)
}

// End of directory
Expand Down
17 changes: 7 additions & 10 deletions unionFile.go
Original file line number Diff line number Diff line change
Expand Up @@ -186,25 +186,22 @@ func (f *UnionFile) Readdir(c int) (ofi []os.FileInfo, err error) {
}
f.files = append(f.files, merged...)
}
files := f.files[f.off:]

if c <= 0 && len(f.files) == 0 {
return f.files, nil
if c <= 0 {
return files, nil
}

if f.off >= len(f.files) {
if len(files) == 0 {
return nil, io.EOF
}

if c <= 0 {
return f.files[f.off:], nil
}

if c > len(f.files) {
c = len(f.files)
if c > len(files) {
c = len(files)
}

defer func() { f.off += c }()
return f.files[f.off:c], nil
return files[:c], nil
}

func (f *UnionFile) Readdirnames(c int) ([]string, error) {
Expand Down

0 comments on commit 066c8b0

Please sign in to comment.