Update s3 library again

This commit is contained in:
Alexander Neumann 2016-01-02 14:09:06 +01:00
parent a73c4bd5a7
commit f319354174
3 changed files with 26 additions and 11 deletions

4
Godeps/Godeps.json generated
View File

@ -24,8 +24,8 @@
},
{
"ImportPath": "github.com/minio/minio-go",
"Comment": "v0.2.5-185-g654a97a",
"Rev": "654a97a4d165dabf422bec2ef6673bcd9d3daf00"
"Comment": "v0.2.5-187-gad1597d",
"Rev": "ad1597d864f56f608f8a1694ae9b5970fef57eb6"
},
{
"ImportPath": "github.com/pkg/sftp",

View File

@ -17,7 +17,6 @@
package minio
import (
"bytes"
"errors"
"fmt"
"io"
@ -186,7 +185,7 @@ func (c Client) GetObjectPartial(bucketName, objectName string) (ReadAtCloser, O
// Get shortest length.
// NOTE: Last remaining bytes are usually smaller than
// req.Buffer size. Use that as the final length.
length := math.Min(float64(req.Buffer.Len()), float64(objectStat.Size-req.Offset))
length := math.Min(float64(len(req.Buffer)), float64(objectStat.Size-req.Offset))
httpReader, _, err := c.getObject(bucketName, objectName, req.Offset, int64(length))
if err != nil {
resCh <- readAtResponse{
@ -194,7 +193,12 @@ func (c Client) GetObjectPartial(bucketName, objectName string) (ReadAtCloser, O
}
return
}
size, err := io.CopyN(req.Buffer, httpReader, int64(length))
size, err := io.ReadFull(httpReader, req.Buffer)
if err == io.ErrUnexpectedEOF {
// If an EOF happens after reading some but not all the bytes
// ReadFull returns ErrUnexpectedEOF
err = io.EOF
}
resCh <- readAtResponse{
Size: int(size),
Error: err,
@ -214,7 +218,7 @@ type readAtResponse struct {
// request message container to communicate with internal go-routine.
type readAtRequest struct {
Buffer *bytes.Buffer
Buffer []byte
Offset int64 // readAt offset.
}
@ -267,7 +271,7 @@ func (r *objectReadAtCloser) ReadAt(b []byte, offset int64) (int, error) {
reqMsg := readAtRequest{}
// Send the current offset and bytes requested.
reqMsg.Buffer = bytes.NewBuffer(b)
reqMsg.Buffer = b
reqMsg.Offset = offset
// Send read request over the control channel.

View File

@ -18,6 +18,7 @@ package minio_test
import (
"bytes"
crand "crypto/rand"
"io"
"io/ioutil"
"math/rand"
@ -83,8 +84,13 @@ func TestGetObjectPartialFunctional(t *testing.T) {
t.Fatal("Error:", err, bucketName)
}
// generate data
buf := make([]byte, rand.Intn(1<<20))
// generate data more than 32K
buf := make([]byte, rand.Intn(1<<20)+32*1024)
_, err = io.ReadFull(crand.Reader, buf)
if err != nil {
t.Fatal("Error:", err)
}
// save the data
objectName := randString(60, rand.NewSource(time.Now().UnixNano()))
@ -122,6 +128,10 @@ func TestGetObjectPartialFunctional(t *testing.T) {
if m != len(buf2) {
t.Fatalf("Error: ReadAt read shorter bytes before reaching EOF, want %v, got %v\n", m, len(buf2))
}
if !bytes.Equal(buf2, buf[offset:offset+512]) {
t.Fatal("Error: Incorrect read between two ReadAt from same offset.")
}
offset += 512
m, err = r.ReadAt(buf3, offset)
if err != nil {
t.Fatal("Error:", err, st.Size, len(buf3), offset)
@ -129,9 +139,10 @@ func TestGetObjectPartialFunctional(t *testing.T) {
if m != len(buf3) {
t.Fatalf("Error: ReadAt read shorter bytes before reaching EOF, want %v, got %v\n", m, len(buf3))
}
if !bytes.Equal(buf2, buf3) {
if !bytes.Equal(buf3, buf[offset:offset+512]) {
t.Fatal("Error: Incorrect read between two ReadAt from same offset.")
}
offset += 512
m, err = r.ReadAt(buf4, offset)
if err != nil {
t.Fatal("Error:", err, st.Size, len(buf4), offset)
@ -139,7 +150,7 @@ func TestGetObjectPartialFunctional(t *testing.T) {
if m != len(buf4) {
t.Fatalf("Error: ReadAt read shorter bytes before reaching EOF, want %v, got %v\n", m, len(buf4))
}
if !bytes.Equal(buf2, buf4) {
if !bytes.Equal(buf4, buf[offset:offset+512]) {
t.Fatal("Error: Incorrect read between two ReadAt from same offset.")
}