Skip to content

Commit 310e154

Browse files
authored
storage: fix reader error when seeking to end (#65262)
close #65261
1 parent c4d8025 commit 310e154

File tree

2 files changed

+56
-0
lines changed

2 files changed

+56
-0
lines changed

br/pkg/storage/azblob.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -822,6 +822,11 @@ func (r *azblobObjectReader) reopenReader() error {
822822
}
823823
}
824824

825+
if r.pos == r.totalSize {
826+
r.reader = io.NopCloser(bytes.NewReader(nil))
827+
return nil
828+
}
829+
825830
resp, err := r.blobClient.DownloadStream(r.ctx, &blob.DownloadStreamOptions{
826831
Range: blob.HTTPRange{
827832
Offset: r.pos,

br/pkg/storage/azblob_test.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,57 @@ func TestDownloadRetry(t *testing.T) {
400400
require.Less(t, azblobRetryTimes, count)
401401
}
402402

403+
func TestAzblobSeekToEndShouldNotError(t *testing.T) {
404+
const fileSize int32 = 16
405+
406+
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
407+
t.Log(r.URL)
408+
switch r.Method {
409+
case http.MethodHead:
410+
// Open file request, return file size
411+
header := w.Header()
412+
header.Add("Content-Length", fmt.Sprintf("%d", fileSize))
413+
w.WriteHeader(200)
414+
case http.MethodGet:
415+
if r.Header.Get("Range") != "" || r.Header.Get("x-ms-range") != "" {
416+
// Seek request, return an error
417+
w.WriteHeader(http.StatusRequestedRangeNotSatisfiable)
418+
} else {
419+
w.WriteHeader(200)
420+
}
421+
}
422+
}))
423+
424+
defer server.Close()
425+
t.Log(server.URL)
426+
427+
options := &backuppb.AzureBlobStorage{
428+
Bucket: "test",
429+
Prefix: "a/b/",
430+
}
431+
432+
ctx := context.Background()
433+
builder := &fakeClientBuilder{Endpoint: server.URL}
434+
s, err := newAzureBlobStorageWithClientBuilder(ctx, options, builder)
435+
require.NoError(t, err)
436+
437+
r, err := s.Open(ctx, "c", nil)
438+
require.NoError(t, err)
439+
440+
// Seek to end
441+
offset, err := r.Seek(0, io.SeekEnd)
442+
require.NoError(t, err)
443+
require.EqualValues(t, fileSize, offset)
444+
445+
// Read after seek to end
446+
buf := make([]byte, 1)
447+
n, err := r.Read(buf)
448+
require.Equal(t, 0, n)
449+
require.Equal(t, io.EOF, err)
450+
451+
require.NoError(t, r.Close())
452+
}
453+
403454
type wr struct {
404455
w ExternalFileWriter
405456
ctx context.Context

0 commit comments

Comments
 (0)