aboutsummaryrefslogtreecommitdiff
path: root/weed/filer2/filechunks.go
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2018-05-21 00:00:28 -0700
committerChris Lu <chris.lu@gmail.com>2018-05-21 00:00:28 -0700
commitf07482382b067b84e917e4d1c3581fe1373957de (patch)
tree00de1463aa367b288fb4a329ea413d1d0e52bfdc /weed/filer2/filechunks.go
parentcd47528a757dd38d68c9137bd4eb97f4b9f4e305 (diff)
downloadseaweedfs-f07482382b067b84e917e4d1c3581fe1373957de.tar.xz
seaweedfs-f07482382b067b84e917e4d1c3581fe1373957de.zip
able to update file content
having some issue when vi reports file changed.
Diffstat (limited to 'weed/filer2/filechunks.go')
-rw-r--r--weed/filer2/filechunks.go52
1 files changed, 28 insertions, 24 deletions
diff --git a/weed/filer2/filechunks.go b/weed/filer2/filechunks.go
index 88a2660cb..714bdab9c 100644
--- a/weed/filer2/filechunks.go
+++ b/weed/filer2/filechunks.go
@@ -19,12 +19,27 @@ func TotalSize(chunks []*filer_pb.FileChunk) (size uint64) {
}
func CompactFileChunks(chunks []*filer_pb.FileChunk) (compacted, garbage []*filer_pb.FileChunk) {
+
+ visibles := nonOverlappingVisibleIntervals(chunks)
+
+ fileIds := make(map[string]bool)
+ for _, interval := range visibles {
+ fileIds[interval.fileId] = true
+ }
+ for _, chunk := range chunks {
+ if found := fileIds[chunk.FileId]; found {
+ compacted = append(compacted, chunk)
+ } else {
+ garbage = append(garbage, chunk)
+ }
+ }
+
return
}
func logPrintf(name string, visibles []*visibleInterval) {
- return
+ // return
log.Printf("%s len %d", name, len(visibles))
for _, v := range visibles {
@@ -52,7 +67,7 @@ func nonOverlappingVisibleIntervals(chunks []*filer_pb.FileChunk) (visibles []*v
var minStopInterval, upToDateInterval *visibleInterval
watermarkStart := chunks[0].Offset
for _, chunk := range chunks {
- // log.Printf("checking chunk: [%d,%d)", chunk.Offset, chunk.Offset+int64(chunk.Size))
+ log.Printf("checking chunk: [%d,%d)", chunk.Offset, chunk.Offset+int64(chunk.Size))
logPrintf("parallelIntervals", parallelIntervals)
for len(parallelIntervals) > 0 && watermarkStart < chunk.Offset {
logPrintf("parallelIntervals loop 1", parallelIntervals)
@@ -72,12 +87,7 @@ func nonOverlappingVisibleIntervals(chunks []*filer_pb.FileChunk) (visibles []*v
var remaining []*visibleInterval
for _, interval := range parallelIntervals {
if interval.stop != watermarkStart {
- remaining = append(remaining, newVisibleInterval(
- interval.start,
- interval.stop,
- interval.fileId,
- interval.modifiedTime,
- ))
+ remaining = append(remaining, interval)
}
}
parallelIntervals = remaining
@@ -108,12 +118,7 @@ func nonOverlappingVisibleIntervals(chunks []*filer_pb.FileChunk) (visibles []*v
var remaining []*visibleInterval
for _, interval := range parallelIntervals {
if interval.stop != watermarkStart {
- remaining = append(remaining, newVisibleInterval(
- interval.start,
- interval.stop,
- interval.fileId,
- interval.modifiedTime,
- ))
+ remaining = append(remaining, interval)
}
}
parallelIntervals = remaining
@@ -122,11 +127,12 @@ func nonOverlappingVisibleIntervals(chunks []*filer_pb.FileChunk) (visibles []*v
logPrintf("intervals", intervals)
// merge connected intervals, now the intervals are non-intersecting
- var lastInterval *visibleInterval
+ var lastIntervalIndex int
var prevIntervalIndex int
for i, interval := range intervals {
if i == 0 {
prevIntervalIndex = i
+ lastIntervalIndex = i
continue
}
if intervals[i-1].fileId != interval.fileId ||
@@ -139,18 +145,16 @@ func nonOverlappingVisibleIntervals(chunks []*filer_pb.FileChunk) (visibles []*v
))
prevIntervalIndex = i
}
- lastInterval = intervals[i]
+ lastIntervalIndex = i
logPrintf("intervals loop 1 visibles", visibles)
}
- if lastInterval != nil {
- visibles = append(visibles, newVisibleInterval(
- intervals[prevIntervalIndex].start,
- lastInterval.stop,
- intervals[prevIntervalIndex].fileId,
- intervals[prevIntervalIndex].modifiedTime,
- ))
- }
+ visibles = append(visibles, newVisibleInterval(
+ intervals[prevIntervalIndex].start,
+ intervals[lastIntervalIndex].stop,
+ intervals[prevIntervalIndex].fileId,
+ intervals[prevIntervalIndex].modifiedTime,
+ ))
logPrintf("visibles", visibles)