Browse Source

weed export: print out [start,stop) content range

pull/1475/head
Chris Lu 4 years ago
parent
commit
103fafe00b
  1. 14
      weed/command/export.go
  2. 2
      weed/storage/needle/file_id.go
  3. 5
      weed/storage/volume_read_write.go

14
weed/command/export.go

@ -70,13 +70,13 @@ var (
localLocation, _ = time.LoadLocation("Local") localLocation, _ = time.LoadLocation("Local")
) )
func printNeedle(vid needle.VolumeId, n *needle.Needle, version needle.Version, deleted bool) {
func printNeedle(vid needle.VolumeId, n *needle.Needle, version needle.Version, deleted bool, offset int64, onDiskSize int64) {
key := needle.NewFileIdFromNeedle(vid, n).String() key := needle.NewFileIdFromNeedle(vid, n).String()
size := int32(n.DataSize) size := int32(n.DataSize)
if version == needle.Version1 { if version == needle.Version1 {
size = int32(n.Size) size = int32(n.Size)
} }
fmt.Printf("%s\t%s\t%d\t%t\t%s\t%s\t%s\t%t\n",
fmt.Printf("%s\t%s\t%d\t%t\t%s\t%s\t%s\t%t\t%d\t%d\n",
key, key,
n.Name, n.Name,
size, size,
@ -85,6 +85,8 @@ func printNeedle(vid needle.VolumeId, n *needle.Needle, version needle.Version,
n.LastModifiedString(), n.LastModifiedString(),
n.Ttl.String(), n.Ttl.String(),
deleted, deleted,
offset,
offset+onDiskSize,
) )
} }
@ -124,17 +126,17 @@ func (scanner *VolumeFileScanner4Export) VisitNeedle(n *needle.Needle, offset in
if tarOutputFile != nil { if tarOutputFile != nil {
return writeFile(vid, n) return writeFile(vid, n)
} else { } else {
printNeedle(vid, n, scanner.version, false)
printNeedle(vid, n, scanner.version, false, offset, n.DiskSize(scanner.version))
return nil return nil
} }
} }
if !ok { if !ok {
if *showDeleted && tarOutputFile == nil { if *showDeleted && tarOutputFile == nil {
if n.DataSize > 0 { if n.DataSize > 0 {
printNeedle(vid, n, scanner.version, true)
printNeedle(vid, n, scanner.version, true, offset, n.DiskSize(scanner.version))
} else { } else {
n.Name = []byte("*tombstone") n.Name = []byte("*tombstone")
printNeedle(vid, n, scanner.version, true)
printNeedle(vid, n, scanner.version, true, offset, n.DiskSize(scanner.version))
} }
} }
glog.V(2).Infof("This seems deleted %d size %d", n.Id, n.Size) glog.V(2).Infof("This seems deleted %d size %d", n.Id, n.Size)
@ -208,7 +210,7 @@ func runExport(cmd *Command, args []string) bool {
} }
if tarOutputFile == nil { if tarOutputFile == nil {
fmt.Printf("key\tname\tsize\tgzip\tmime\tmodified\tttl\tdeleted\n")
fmt.Printf("key\tname\tsize\tgzip\tmime\tmodified\tttl\tdeleted\tstart\tstop\n")
} }
err = storage.ScanVolumeFile(util.ResolvePath(*export.dir), *export.collection, vid, storage.NeedleMapInMemory, volumeFileScanner) err = storage.ScanVolumeFile(util.ResolvePath(*export.dir), *export.collection, vid, storage.NeedleMapInMemory, volumeFileScanner)

2
weed/storage/needle/file_id.go

@ -66,7 +66,7 @@ func formatNeedleIdCookie(key NeedleId, cookie Cookie) string {
NeedleIdToBytes(bytes[0:NeedleIdSize], key) NeedleIdToBytes(bytes[0:NeedleIdSize], key)
CookieToBytes(bytes[NeedleIdSize:NeedleIdSize+CookieSize], cookie) CookieToBytes(bytes[NeedleIdSize:NeedleIdSize+CookieSize], cookie)
nonzero_index := 0 nonzero_index := 0
for ; bytes[nonzero_index] == 0; nonzero_index++ {
for ; bytes[nonzero_index] == 0 && nonzero_index < NeedleIdSize; nonzero_index++ {
} }
return hex.EncodeToString(bytes[nonzero_index:]) return hex.EncodeToString(bytes[nonzero_index:])
} }

5
weed/storage/volume_read_write.go

@ -381,11 +381,9 @@ func ScanVolumeFile(dirname string, collection string, id needle.VolumeId,
if v, err = loadVolumeWithoutIndex(dirname, collection, id, needleMapKind); err != nil { if v, err = loadVolumeWithoutIndex(dirname, collection, id, needleMapKind); err != nil {
return fmt.Errorf("failed to load volume %d: %v", id, err) return fmt.Errorf("failed to load volume %d: %v", id, err)
} }
if v.volumeInfo.Version == 0 {
if err = volumeFileScanner.VisitSuperBlock(v.SuperBlock); err != nil { if err = volumeFileScanner.VisitSuperBlock(v.SuperBlock); err != nil {
return fmt.Errorf("failed to process volume %d super block: %v", id, err) return fmt.Errorf("failed to process volume %d super block: %v", id, err)
} }
}
defer v.Close() defer v.Close()
version := v.Version() version := v.Version()
@ -406,8 +404,9 @@ func ScanVolumeFileFrom(version needle.Version, datBackend backend.BackendStorag
for n != nil { for n != nil {
var needleBody []byte var needleBody []byte
if volumeFileScanner.ReadNeedleBody() { if volumeFileScanner.ReadNeedleBody() {
// println("needle", n.Id.String(), "offset", offset, "size", n.Size, "rest", rest)
if needleBody, err = n.ReadNeedleBody(datBackend, version, offset+NeedleHeaderSize, rest); err != nil { if needleBody, err = n.ReadNeedleBody(datBackend, version, offset+NeedleHeaderSize, rest); err != nil {
glog.V(0).Infof("cannot read needle body: %v", err)
glog.V(0).Infof("cannot read needle head [%d, %d) body [%d, %d) body length %d: %v", offset, offset+NeedleHeaderSize, offset+NeedleHeaderSize, offset+NeedleHeaderSize+rest, rest, err)
// err = fmt.Errorf("cannot read needle body: %v", err) // err = fmt.Errorf("cannot read needle body: %v", err)
// return // return
} }

Loading…
Cancel
Save