Add type for headers and create custom marshal to make it easier to read. Group headers and metadata. Restore functionality that will read `xl.meta` in the current dir with no params. Before: ``` { "Headers": [ [ "8M04bTiYRDmEMQGeAsk1yg==", 1639150471630100400, "rLD1Rw==", 1, 6 ], ], "Versions": [ { "Type": 1, "V2Obj": { "CSumAlgo": 1, "DDir": "oC1Xpg4tRfW03g8o8w7Bzg==", "EcAlgo": 1, "EcBSize": 1048576, "EcDist": [ 7, 8, 1, 2, 3, 4, 5, 6 ], "EcIndex": 1, "EcM": 4, "EcN": 4, "ID": "8M04bTiYRDmEMQGeAsk1yg==", "MTime": 1639150471630100400, "MetaSys": { "x-minio-internal-inline-data": "dHJ1ZQ==" }, "MetaUsr": { "content-type": "application/octet-stream", "etag": "b8252c86fad2d8937300aa92b467a3aa" }, "PartASizes": [ 1000 ], "PartETags": null, "PartNums": [ 1 ], "PartSizes": [ 1000 ], "Size": 1000 } } ] } ```
Showing the changes to docs/debugging (1 of 1 file). Show all
Unified · Split
| @@ -20,6 +20,7 @@ package main · 19 unmodified lines | ||
| 20 | 20 | import ( |
| 21 | 21 | "bytes" |
| 22 | 22 | "encoding/binary" |
| 23 | + "encoding/hex" | |
| 23 | 24 | "encoding/json" |
| 24 | 25 | "errors" |
| 25 | 26 | "fmt" |
| @@ -28,6 +29,7 @@ import ( · 2 unmodified lines | ||
| 28 | 29 | "log" |
| 29 | 30 | "os" |
| 30 | 31 | "strings" |
| 32 | + "time" | |
| 31 | 33 | |
| 32 | 34 | "github.com/klauspost/compress/zip" |
| 33 | 35 | "github.com/minio/cli" |
| @@ -76,10 +78,6 @@ FLAGS: · 42 unmodified lines | ||
| 76 | 78 | } |
| 77 | 79 | |
| 78 | 80 | app.Action = func(c *cli.Context) error { |
| 79 | − if !c.Args().Present() { | |
| 80 | − cli.ShowAppHelpAndExit(c, 1) // last argument is exit code | |
| 81 | − } | |
| 82 | − | |
| 83 | 81 | ndjson := c.Bool("ndjson") |
| 84 | 82 | decode := func(r io.Reader, file string) ([]byte, error) { |
| 85 | 83 | b, err := ioutil.ReadAll(r) |
| @@ -128,31 +126,39 @@ FLAGS: · 42 unmodified lines | ||
| 128 | 126 | if err != nil { |
| 129 | 127 | return nil, err |
| 130 | 128 | } |
| 131 | − var versions = struct { | |
| 132 | − Versions []json.RawMessage | |
| 133 | − Headers []json.RawMessage | |
| 134 | − }{ | |
| 135 | − Versions: make([]json.RawMessage, nVers), | |
| 136 | − Headers: make([]json.RawMessage, nVers), | |
| 129 | + type version struct { | |
| 130 | + Idx int | |
| 131 | + Header json.RawMessage | |
| 132 | + Metadata json.RawMessage | |
| 137 | 133 | } |
| 134 | + var versions = make([]version, nVers) | |
| 138 | 135 | err = decodeVersions(v, nVers, func(idx int, hdr, meta []byte) error { |
| 139 | − var buf bytes.Buffer | |
| 140 | − if _, err := msgp.UnmarshalAsJSON(&buf, hdr); err != nil { | |
| 136 | + var header xlMetaV2VersionHeaderV2 | |
| 137 | + if _, err := header.UnmarshalMsg(hdr); err != nil { | |
| 138 | + return err | |
| 139 | + } | |
| 140 | + b, err := header.MarshalJSON() | |
| 141 | + if err != nil { | |
| 141 | 142 | return err |
| 142 | 143 | } |
| 143 | − versions.Headers[idx] = buf.Bytes() | |
| 144 | − buf = bytes.Buffer{} | |
| 144 | + var buf bytes.Buffer | |
| 145 | 145 | if _, err := msgp.UnmarshalAsJSON(&buf, meta); err != nil { |
| 146 | 146 | return err |
| 147 | 147 | } |
| 148 | − versions.Versions[idx] = buf.Bytes() | |
| 148 | + versions[idx] = version{ | |
| 149 | + Idx: idx, | |
| 150 | + Header: b, | |
| 151 | + Metadata: buf.Bytes(), | |
| 152 | + } | |
| 149 | 153 | return nil |
| 150 | 154 | }) |
| 151 | 155 | if err != nil { |
| 152 | 156 | return nil, err |
| 153 | 157 | } |
| 154 | 158 | enc := json.NewEncoder(buf) |
| 155 | − if err := enc.Encode(versions); err != nil { | |
| 159 | + if err := enc.Encode(struct { | |
| 160 | + Versions []version | |
| 161 | + }{Versions: versions}); err != nil { | |
| 156 | 162 | return nil, err |
| 157 | 163 | } |
| 158 | 164 | data = b |
| @@ -509,3 +515,77 @@ func decodeVersions(buf []byte, versions int, fn func(idx int, hdr, meta []byte) · 350 unmodified lines | ||
| 509 | 515 | } |
| 510 | 516 | return nil |
| 511 | 517 | } |
| 518 | + | |
| 519 | +type xlMetaV2VersionHeaderV2 struct { | |
| 520 | + VersionID [16]byte | |
| 521 | + ModTime int64 | |
| 522 | + Signature [4]byte | |
| 523 | + Type uint8 | |
| 524 | + Flags uint8 | |
| 525 | +} | |
| 526 | + | |
| 527 | +// UnmarshalMsg implements msgp.Unmarshaler | |
| 528 | +func (z *xlMetaV2VersionHeaderV2) UnmarshalMsg(bts []byte) (o []byte, err error) { | |
| 529 | + var zb0001 uint32 | |
| 530 | + zb0001, bts, err = msgp.ReadArrayHeaderBytes(bts) | |
| 531 | + if err != nil { | |
| 532 | + err = msgp.WrapError(err) | |
| 533 | + return | |
| 534 | + } | |
| 535 | + if zb0001 != 5 { | |
| 536 | + err = msgp.ArrayError{Wanted: 5, Got: zb0001} | |
| 537 | + return | |
| 538 | + } | |
| 539 | + bts, err = msgp.ReadExactBytes(bts, (z.VersionID)[:]) | |
| 540 | + if err != nil { | |
| 541 | + err = msgp.WrapError(err, "VersionID") | |
| 542 | + return | |
| 543 | + } | |
| 544 | + z.ModTime, bts, err = msgp.ReadInt64Bytes(bts) | |
| 545 | + if err != nil { | |
| 546 | + err = msgp.WrapError(err, "ModTime") | |
| 547 | + return | |
| 548 | + } | |
| 549 | + bts, err = msgp.ReadExactBytes(bts, (z.Signature)[:]) | |
| 550 | + if err != nil { | |
| 551 | + err = msgp.WrapError(err, "Signature") | |
| 552 | + return | |
| 553 | + } | |
| 554 | + { | |
| 555 | + var zb0002 uint8 | |
| 556 | + zb0002, bts, err = msgp.ReadUint8Bytes(bts) | |
| 557 | + if err != nil { | |
| 558 | + err = msgp.WrapError(err, "Type") | |
| 559 | + return | |
| 560 | + } | |
| 561 | + z.Type = zb0002 | |
| 562 | + } | |
| 563 | + { | |
| 564 | + var zb0003 uint8 | |
| 565 | + zb0003, bts, err = msgp.ReadUint8Bytes(bts) | |
| 566 | + if err != nil { | |
| 567 | + err = msgp.WrapError(err, "Flags") | |
| 568 | + return | |
| 569 | + } | |
| 570 | + z.Flags = zb0003 | |
| 571 | + } | |
| 572 | + o = bts | |
| 573 | + return | |
| 574 | +} | |
| 575 | + | |
| 576 | +func (z xlMetaV2VersionHeaderV2) MarshalJSON() (o []byte, err error) { | |
| 577 | + tmp := struct { | |
| 578 | + VersionID string | |
| 579 | + ModTime time.Time | |
| 580 | + Signature string | |
| 581 | + Type uint8 | |
| 582 | + Flags uint8 | |
| 583 | + }{ | |
| 584 | + VersionID: hex.EncodeToString(z.VersionID[:]), | |
| 585 | + ModTime: time.Unix(0, z.ModTime), | |
| 586 | + Signature: hex.EncodeToString(z.Signature[:]), | |
| 587 | + Type: z.Type, | |
| 588 | + Flags: z.Flags, | |
| 589 | + } | |
| 590 | + return json.Marshal(tmp) | |
| 591 | +} | |