|
|
@ -282,15 +282,37 @@ func (file *File) maybeLoadEntry(ctx context.Context) (entry *filer_pb.Entry, er |
|
|
|
return entry, nil |
|
|
|
} |
|
|
|
|
|
|
|
func lessThan(a, b *filer_pb.FileChunk) bool { |
|
|
|
if a.Mtime == b.Mtime { |
|
|
|
return a.Fid.FileKey < b.Fid.FileKey |
|
|
|
} |
|
|
|
return a.Mtime < b.Mtime |
|
|
|
} |
|
|
|
|
|
|
|
func (file *File) addChunks(chunks []*filer_pb.FileChunk) { |
|
|
|
|
|
|
|
sort.Slice(chunks, func(i, j int) bool { |
|
|
|
if chunks[i].Mtime == chunks[j].Mtime { |
|
|
|
return chunks[i].Fid.FileKey < chunks[j].Fid.FileKey |
|
|
|
// find the earliest incoming chunk
|
|
|
|
newChunks := chunks |
|
|
|
earliestChunk := newChunks[0] |
|
|
|
for i:=1;i<len(newChunks);i++{ |
|
|
|
if lessThan(earliestChunk, newChunks[i]) { |
|
|
|
earliestChunk = newChunks[i] |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// pick out-of-order chunks from existing chunks
|
|
|
|
for _, chunk := range file.entry.Chunks { |
|
|
|
if lessThan(earliestChunk, chunk) { |
|
|
|
chunks = append(chunks, chunk) |
|
|
|
} |
|
|
|
return chunks[i].Mtime < chunks[j].Mtime |
|
|
|
} |
|
|
|
|
|
|
|
// sort incoming chunks
|
|
|
|
sort.Slice(chunks, func(i, j int) bool { |
|
|
|
return lessThan(chunks[i], chunks[j]) |
|
|
|
}) |
|
|
|
|
|
|
|
// add to entry view cache
|
|
|
|
for _, chunk := range chunks { |
|
|
|
file.entryViewCache = filer.MergeIntoVisibles(file.entryViewCache, chunk) |
|
|
|
} |
|
|
@ -299,7 +321,7 @@ func (file *File) addChunks(chunks []*filer_pb.FileChunk) { |
|
|
|
|
|
|
|
glog.V(4).Infof("%s existing %d chunks adds %d more", file.fullpath(), len(file.entry.Chunks), len(chunks)) |
|
|
|
|
|
|
|
file.entry.Chunks = append(file.entry.Chunks, chunks...) |
|
|
|
file.entry.Chunks = append(file.entry.Chunks, newChunks...) |
|
|
|
} |
|
|
|
|
|
|
|
func (file *File) setEntry(entry *filer_pb.Entry) { |
|
|
|