Skip to content

Commit 8f17968

Browse files
Merge pull request ipfs#4508 from ipfs/fix/add-small-files
Don't lock up 256KiB buffers when adding small files
2 parents 64ae934 + c29f628 commit 8f17968

File tree

6 files changed

+39
-13
lines changed

6 files changed

+39
-13
lines changed

core/coreunix/add.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ func (adder *Adder) SetMfsRoot(r *mfs.Root) {
131131
}
132132

133133
// Constructs a node from reader's data, and adds it. Doesn't pin.
134-
func (adder Adder) add(reader io.Reader) (node.Node, error) {
134+
func (adder *Adder) add(reader io.Reader) (node.Node, error) {
135135
chnk, err := chunk.FromString(reader, adder.Chunker)
136136
if err != nil {
137137
return nil, err

importer/chunk/parse.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111
func FromString(r io.Reader, chunker string) (Splitter, error) {
1212
switch {
1313
case chunker == "" || chunker == "default":
14-
return NewSizeSplitter(r, DefaultBlockSize), nil
14+
return DefaultSplitter(r), nil
1515

1616
case strings.HasPrefix(chunker, "size-"):
1717
sizeStr := strings.Split(chunker, "-")[1]

importer/chunk/splitting.go

+16-10
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"io"
66

77
logging "gx/ipfs/QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52/go-log"
8+
mpool "gx/ipfs/QmWBug6eBS7AxRdCDVuSY5CnSit7cS2XnPFYJWqWDumhCG/go-msgio/mpool"
89
)
910

1011
var log = logging.Logger("chunk")
@@ -51,32 +52,37 @@ func Chan(s Splitter) (<-chan []byte, <-chan error) {
5152

5253
type sizeSplitterv2 struct {
5354
r io.Reader
54-
size int64
55+
size uint32
5556
err error
5657
}
5758

5859
func NewSizeSplitter(r io.Reader, size int64) Splitter {
5960
return &sizeSplitterv2{
6061
r: r,
61-
size: size,
62+
size: uint32(size),
6263
}
6364
}
6465

6566
func (ss *sizeSplitterv2) NextBytes() ([]byte, error) {
6667
if ss.err != nil {
6768
return nil, ss.err
6869
}
69-
buf := make([]byte, ss.size)
70-
n, err := io.ReadFull(ss.r, buf)
71-
if err == io.ErrUnexpectedEOF {
70+
71+
full := mpool.ByteSlicePool.Get(ss.size).([]byte)[:ss.size]
72+
n, err := io.ReadFull(ss.r, full)
73+
switch err {
74+
case io.ErrUnexpectedEOF:
7275
ss.err = io.EOF
73-
err = nil
74-
}
75-
if err != nil {
76+
small := make([]byte, n)
77+
copy(small, full)
78+
mpool.ByteSlicePool.Put(ss.size, full)
79+
return small, nil
80+
case nil:
81+
return full, nil
82+
default:
83+
mpool.ByteSlicePool.Put(ss.size, full)
7684
return nil, err
7785
}
78-
79-
return buf[:n], nil
8086
}
8187

8288
func (ss *sizeSplitterv2) Reader() io.Reader {

importer/chunk/splitting_test.go

+14
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,20 @@ func copyBuf(buf []byte) []byte {
2222
return cpy
2323
}
2424

25+
func TestSizeSplitterOverAllocate(t *testing.T) {
26+
max := 1000
27+
r := bytes.NewReader(randBuf(t, max))
28+
chunksize := int64(1024 * 256)
29+
splitter := NewSizeSplitter(r, chunksize)
30+
chunk, err := splitter.NextBytes()
31+
if err != nil {
32+
t.Fatal(err)
33+
}
34+
if cap(chunk) > len(chunk) {
35+
t.Fatal("chunk capacity too large")
36+
}
37+
}
38+
2539
func TestSizeSplitterIsDeterministic(t *testing.T) {
2640
if testing.Short() {
2741
t.SkipNow()

importer/importer.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ func BuildDagFromFile(fpath string, ds dag.DAGService) (node.Node, error) {
3434
}
3535
defer f.Close()
3636

37-
return BuildDagFromReader(ds, chunk.NewSizeSplitter(f, chunk.DefaultBlockSize))
37+
return BuildDagFromReader(ds, chunk.DefaultSplitter(f))
3838
}
3939

4040
func BuildDagFromReader(ds dag.DAGService, spl chunk.Splitter) (node.Node, error) {

package.json

+6
Original file line numberDiff line numberDiff line change
@@ -509,6 +509,12 @@
509509
"hash": "QmYmhgAcvmDGXct1qBvc1kz9BxQSit1XBrTeiGZp2FvRyn",
510510
"name": "go-libp2p-blankhost",
511511
"version": "0.2.3"
512+
},
513+
{
514+
"author": "jbenet",
515+
"hash": "QmWBug6eBS7AxRdCDVuSY5CnSit7cS2XnPFYJWqWDumhCG",
516+
"name": "go-msgio",
517+
"version": "0.0.3"
512518
}
513519
],
514520
"gxVersion": "0.10.0",

0 commit comments

Comments
 (0)