mirror of
https://github.com/minio/minio.git
synced 2025-04-06 12:50:34 -04:00
xl-meta: Add header titles (#13880)
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 } } ] } ``` After: ``` { "Versions": [ { "Header": { "Flags": 6, "ModTime": "2021-12-10T16:34:31.6301004+01:00", "Signature": "acb0f547", "Type": 1, "VersionID": "f0cd386d389844398431019e02c935ca" }, "Idx": 0, "Metadata": { "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 } } } ] } ```
This commit is contained in:
parent
81e43b87c2
commit
518612492c
@ -20,6 +20,7 @@ package main
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
|
"encoding/hex"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
@ -28,6 +29,7 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/klauspost/compress/zip"
|
"github.com/klauspost/compress/zip"
|
||||||
"github.com/minio/cli"
|
"github.com/minio/cli"
|
||||||
@ -76,10 +78,6 @@ FLAGS:
|
|||||||
}
|
}
|
||||||
|
|
||||||
app.Action = func(c *cli.Context) error {
|
app.Action = func(c *cli.Context) error {
|
||||||
if !c.Args().Present() {
|
|
||||||
cli.ShowAppHelpAndExit(c, 1) // last argument is exit code
|
|
||||||
}
|
|
||||||
|
|
||||||
ndjson := c.Bool("ndjson")
|
ndjson := c.Bool("ndjson")
|
||||||
decode := func(r io.Reader, file string) ([]byte, error) {
|
decode := func(r io.Reader, file string) ([]byte, error) {
|
||||||
b, err := ioutil.ReadAll(r)
|
b, err := ioutil.ReadAll(r)
|
||||||
@ -128,31 +126,39 @@ FLAGS:
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
var versions = struct {
|
type version struct {
|
||||||
Versions []json.RawMessage
|
Idx int
|
||||||
Headers []json.RawMessage
|
Header json.RawMessage
|
||||||
}{
|
Metadata json.RawMessage
|
||||||
Versions: make([]json.RawMessage, nVers),
|
|
||||||
Headers: make([]json.RawMessage, nVers),
|
|
||||||
}
|
}
|
||||||
|
var versions = make([]version, nVers)
|
||||||
err = decodeVersions(v, nVers, func(idx int, hdr, meta []byte) error {
|
err = decodeVersions(v, nVers, func(idx int, hdr, meta []byte) error {
|
||||||
var buf bytes.Buffer
|
var header xlMetaV2VersionHeaderV2
|
||||||
if _, err := msgp.UnmarshalAsJSON(&buf, hdr); err != nil {
|
if _, err := header.UnmarshalMsg(hdr); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
versions.Headers[idx] = buf.Bytes()
|
b, err := header.MarshalJSON()
|
||||||
buf = bytes.Buffer{}
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var buf bytes.Buffer
|
||||||
if _, err := msgp.UnmarshalAsJSON(&buf, meta); err != nil {
|
if _, err := msgp.UnmarshalAsJSON(&buf, meta); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
versions.Versions[idx] = buf.Bytes()
|
versions[idx] = version{
|
||||||
|
Idx: idx,
|
||||||
|
Header: b,
|
||||||
|
Metadata: buf.Bytes(),
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
enc := json.NewEncoder(buf)
|
enc := json.NewEncoder(buf)
|
||||||
if err := enc.Encode(versions); err != nil {
|
if err := enc.Encode(struct {
|
||||||
|
Versions []version
|
||||||
|
}{Versions: versions}); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
data = b
|
data = b
|
||||||
@ -509,3 +515,77 @@ func decodeVersions(buf []byte, versions int, fn func(idx int, hdr, meta []byte)
|
|||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type xlMetaV2VersionHeaderV2 struct {
|
||||||
|
VersionID [16]byte
|
||||||
|
ModTime int64
|
||||||
|
Signature [4]byte
|
||||||
|
Type uint8
|
||||||
|
Flags uint8
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalMsg implements msgp.Unmarshaler
|
||||||
|
func (z *xlMetaV2VersionHeaderV2) UnmarshalMsg(bts []byte) (o []byte, err error) {
|
||||||
|
var zb0001 uint32
|
||||||
|
zb0001, bts, err = msgp.ReadArrayHeaderBytes(bts)
|
||||||
|
if err != nil {
|
||||||
|
err = msgp.WrapError(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if zb0001 != 5 {
|
||||||
|
err = msgp.ArrayError{Wanted: 5, Got: zb0001}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
bts, err = msgp.ReadExactBytes(bts, (z.VersionID)[:])
|
||||||
|
if err != nil {
|
||||||
|
err = msgp.WrapError(err, "VersionID")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
z.ModTime, bts, err = msgp.ReadInt64Bytes(bts)
|
||||||
|
if err != nil {
|
||||||
|
err = msgp.WrapError(err, "ModTime")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
bts, err = msgp.ReadExactBytes(bts, (z.Signature)[:])
|
||||||
|
if err != nil {
|
||||||
|
err = msgp.WrapError(err, "Signature")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
{
|
||||||
|
var zb0002 uint8
|
||||||
|
zb0002, bts, err = msgp.ReadUint8Bytes(bts)
|
||||||
|
if err != nil {
|
||||||
|
err = msgp.WrapError(err, "Type")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
z.Type = zb0002
|
||||||
|
}
|
||||||
|
{
|
||||||
|
var zb0003 uint8
|
||||||
|
zb0003, bts, err = msgp.ReadUint8Bytes(bts)
|
||||||
|
if err != nil {
|
||||||
|
err = msgp.WrapError(err, "Flags")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
z.Flags = zb0003
|
||||||
|
}
|
||||||
|
o = bts
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (z xlMetaV2VersionHeaderV2) MarshalJSON() (o []byte, err error) {
|
||||||
|
tmp := struct {
|
||||||
|
VersionID string
|
||||||
|
ModTime time.Time
|
||||||
|
Signature string
|
||||||
|
Type uint8
|
||||||
|
Flags uint8
|
||||||
|
}{
|
||||||
|
VersionID: hex.EncodeToString(z.VersionID[:]),
|
||||||
|
ModTime: time.Unix(0, z.ModTime),
|
||||||
|
Signature: hex.EncodeToString(z.Signature[:]),
|
||||||
|
Type: z.Type,
|
||||||
|
Flags: z.Flags,
|
||||||
|
}
|
||||||
|
return json.Marshal(tmp)
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user