|
@@ -80,11 +80,23 @@ func StreamContent(masterClient wdclient.HasLookupFileIdFunction, writer io.Writ
|
|
|
fileId2Url[chunkView.FileId] = urlStrings
|
|
|
}
|
|
|
|
|
|
+ remaining := size
|
|
|
for _, chunkView := range chunkViews {
|
|
|
-
|
|
|
+ if offset < chunkView.LogicOffset {
|
|
|
+ gap := chunkView.LogicOffset - offset
|
|
|
+ remaining -= gap
|
|
|
+ glog.V(4).Infof("zero [%d,%d)", offset, chunkView.LogicOffset)
|
|
|
+ err := writeZero(writer, gap)
|
|
|
+ if err != nil {
|
|
|
+ return fmt.Errorf("write zero [%d,%d)", offset, chunkView.LogicOffset)
|
|
|
+ }
|
|
|
+ offset = chunkView.LogicOffset
|
|
|
+ }
|
|
|
urlStrings := fileId2Url[chunkView.FileId]
|
|
|
start := time.Now()
|
|
|
err := retriedStreamFetchChunkData(writer, urlStrings, chunkView.CipherKey, chunkView.IsGzipped, chunkView.IsFullChunk(), chunkView.Offset, int(chunkView.Size))
|
|
|
+ offset += int64(chunkView.Size)
|
|
|
+ remaining -= int64(chunkView.Size)
|
|
|
stats.FilerRequestHistogram.WithLabelValues("chunkDownload").Observe(time.Since(start).Seconds())
|
|
|
if err != nil {
|
|
|
stats.FilerRequestCounter.WithLabelValues("chunkDownloadError").Inc()
|
|
@@ -92,6 +104,11 @@ func StreamContent(masterClient wdclient.HasLookupFileIdFunction, writer io.Writ
|
|
|
}
|
|
|
stats.FilerRequestCounter.WithLabelValues("chunkDownload").Inc()
|
|
|
}
|
|
|
+ glog.V(4).Infof("zero [%d,%d)", offset, offset+remaining)
|
|
|
+ err := writeZero(writer, remaining)
|
|
|
+ if err != nil {
|
|
|
+ return fmt.Errorf("write zero [%d,%d)", offset, offset+remaining)
|
|
|
+ }
|
|
|
|
|
|
return nil
|
|
|
|
|
@@ -99,6 +116,23 @@ func StreamContent(masterClient wdclient.HasLookupFileIdFunction, writer io.Writ
|
|
|
|
|
|
// ---------------- ReadAllReader ----------------------------------
|
|
|
|
|
|
+func writeZero(w io.Writer, size int64) (err error) {
|
|
|
+ zeroPadding := make([]byte, 1024)
|
|
|
+ var written int
|
|
|
+ for size > 0 {
|
|
|
+ if size > 1024 {
|
|
|
+ written, err = w.Write(zeroPadding)
|
|
|
+ } else {
|
|
|
+ written, err = w.Write(zeroPadding[:size])
|
|
|
+ }
|
|
|
+ size -= int64(written)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
func ReadAll(masterClient *wdclient.MasterClient, chunks []*filer_pb.FileChunk) ([]byte, error) {
|
|
|
|
|
|
buffer := bytes.Buffer{}
|