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 | import ( | 20 | import ( |
| 21 | "bytes" | 21 | "bytes" |
| 22 | "encoding/binary" | 22 | "encoding/binary" |
| 23 | "encoding/hex" | ||
| 23 | "encoding/json" | 24 | "encoding/json" |
| 24 | "errors" | 25 | "errors" |
| 25 | "fmt" | 26 | "fmt" |
| @@ -28,6 +29,7 @@ import ( · 2 unmodified lines | |||
| 28 | "log" | 29 | "log" |
| 29 | "os" | 30 | "os" |
| 30 | "strings" | 31 | "strings" |
| 32 | "time" | ||
| 31 | 33 | ||
| 32 | "github.com/klauspost/compress/zip" | 34 | "github.com/klauspost/compress/zip" |
| 33 | "github.com/minio/cli" | 35 | "github.com/minio/cli" |
| @@ -76,10 +78,6 @@ FLAGS: · 42 unmodified lines | |||
| 76 | } | 78 | } |
| 77 | 79 | ||
| 78 | app.Action = func(c *cli.Context) error { | 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 | ndjson := c.Bool("ndjson") | 81 | ndjson := c.Bool("ndjson") |
| 84 | decode := func(r io.Reader, file string) ([]byte, error) { | 82 | decode := func(r io.Reader, file string) ([]byte, error) { |
| 85 | b, err := ioutil.ReadAll(r) | 83 | b, err := ioutil.ReadAll(r) |
| @@ -128,31 +126,39 @@ FLAGS: · 42 unmodified lines | |||
| 128 | if err != nil { | 126 | if err != nil { |
| 129 | return nil, err | 127 | return nil, err |
| 130 | } | 128 | } |
| 131 | var versions = struct { | 129 | type version struct { |
| 132 | Versions []json.RawMessage | 130 | Idx int |
| 133 | Headers []json.RawMessage | 131 | Header json.RawMessage |
| 134 | }{ | 132 | Metadata json.RawMessage |
| 135 | Versions: make([]json.RawMessage, nVers), | ||
| 136 | Headers: make([]json.RawMessage, nVers), | ||
| 137 | } | 133 | } |
| 134 | var versions = make([]version, nVers) | ||
| 138 | err = decodeVersions(v, nVers, func(idx int, hdr, meta []byte) error { | 135 | err = decodeVersions(v, nVers, func(idx int, hdr, meta []byte) error { |
| 139 | var buf bytes.Buffer | 136 | var header xlMetaV2VersionHeaderV2 |
| 140 | if _, err := msgp.UnmarshalAsJSON(&buf, hdr); err != nil { | 137 | if _, err := header.UnmarshalMsg(hdr); err != nil { |
| 138 | return err | ||
| 139 | } | ||
| 140 | b, err := header.MarshalJSON() | ||
| 141 | if err != nil { | ||
| 141 | return err | 142 | return err |
| 142 | } | 143 | } |
| 143 | versions.Headers[idx] = buf.Bytes() | 144 | var buf bytes.Buffer |
| 144 | buf = bytes.Buffer{} | ||
| 145 | if _, err := msgp.UnmarshalAsJSON(&buf, meta); err != nil { | 145 | if _, err := msgp.UnmarshalAsJSON(&buf, meta); err != nil { |
| 146 | return err | 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 | return nil | 153 | return nil |
| 150 | }) | 154 | }) |
| 151 | if err != nil { | 155 | if err != nil { |
| 152 | return nil, err | 156 | return nil, err |
| 153 | } | 157 | } |
| 154 | enc := json.NewEncoder(buf) | 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 | return nil, err | 162 | return nil, err |
| 157 | } | 163 | } |
| 158 | data = b | 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 | return nil | 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 | } | ||