@@ -17,18 +17,43 @@ import (
1717 "github.com/NVIDIA/aistore/core/meta"
1818)
1919
20- // (1) NBI xattr v1 (pre-manifest)
21- // (2) NBI discovery
20+ // In this source:
21+ // (1) NBI xattr v1 (pre-manifest)
22+ // (2) NBI discovery
23+
24+ //
25+ // nbiXattr: native bucket inventory (NBI) on-disk metadata
26+ //
27+ // Versioned binary layout (big-endian via cos.BytePack):
28+ //
29+ // | -- FIXED-SIZE FIELDS ----------------------------------------------- | -- VAR -- |
30+ // | ver | started | finished | ntotal | smapVer | chunks | nat | prefix |
31+ // | u8 | int64 | int64 | int64 | int64 | int32 | int32 | string |
32+ //
33+ // where:
34+ // - ver : metadata version (nbiMetaVersion)
35+ // - started : creation start time (UnixNano)
36+ // - finished : creation completion time (UnixNano)
37+ // - ntotal : total number of object names in the inventory
38+ // - smapVer : cluster Smap version at creation time
39+ // - chunks : total number of inventory chunks (manifest.Count())
40+ // - nat : number of active targets at creation time
41+ // - prefix : lsmsg.Prefix used to generate the inventory
42+ //
43+ // Notes:
44+ // - `prefix` is variable-length stored last.
45+ // - All fixed-size fields must be appended only; do not reorder existing fields.
46+ // - Any post-4.3 format change must bump `nbiMetaVersion` and preserve backward compatibility.
47+ // - Consumers must validate `ver` meta-version before interpreting the payload.
48+ //
2249
2350const (
2451 nbiMetaVersion = 1
2552)
2653
2754type nbiXattr struct {
28- prefix string
29- started int64
30- finished int64
31- version uint8
55+ apc.NBIMeta
56+ version uint8 // set internally; not exported
3257}
3358
3459type nbiJogger struct {
@@ -118,11 +143,11 @@ func (j *nbiJogger) run() {
118143 ObjName : filepath .Join (j .prefix , name ),
119144 Size : fi .Size (),
120145 }
146+
121147 if ok {
122- info .Started = meta .started
123- info .Finished = meta .finished
124- info .Prefix = meta .prefix
148+ info .NBIMeta = meta .NBIMeta
125149 } else {
150+ // TODO: indicate "likely in progress"
126151 info .Finished = _nbiMtime (fqn )
127152 }
128153
@@ -141,72 +166,80 @@ func _nbiMtime(fqn string) int64 {
141166 return t .UnixNano ()
142167}
143168
144- //
145- // nbiXattr: on-disk metadata format (versioned):
146- // - version (1 byte)
147- // - started (int64 unix-nano)
148- // - finished (int64 unix-nano)
149- // - prefix (length-prefixed string)
150- //
151-
152169// interface guard
153170var (
154171 _ cos.Packer = (* nbiXattr )(nil )
155172 _ cos.Unpacker = (* nbiXattr )(nil )
156173)
157174
158175func (x * nbiXattr ) PackedSize () int {
159- return 1 + cos .SizeofI64 + cos .SizeofI64 + cos .PackedStrLen (x .prefix )
176+ return 1 + 4 * cos .SizeofI64 + 2 * cos .SizeofI32 + cos .PackedStrLen (x .Prefix )
160177}
161178
162179func (x * nbiXattr ) Pack (packer * cos.BytePack ) {
163180 packer .WriteUint8 (x .version )
164- packer .WriteInt64 (x .started )
165- packer .WriteInt64 (x .finished )
166- packer .WriteString (x .prefix )
181+ packer .WriteInt64 (x .Started )
182+ packer .WriteInt64 (x .Finished )
183+ packer .WriteInt64 (x .Ntotal )
184+ packer .WriteInt64 (x .SmapVer )
185+ packer .WriteInt32 (x .Chunks )
186+ packer .WriteInt32 (x .Nat )
187+ packer .WriteString (x .Prefix )
167188}
168189
169190func (x * nbiXattr ) Unpack (unpacker * cos.ByteUnpack ) (err error ) {
170191 if x .version , err = unpacker .ReadByte (); err != nil {
171192 return
172193 }
173- if x .started , err = unpacker .ReadInt64 (); err != nil {
194+
195+ if x .Started , err = unpacker .ReadInt64 (); err != nil {
196+ return
197+ }
198+ if x .Finished , err = unpacker .ReadInt64 (); err != nil {
174199 return
175200 }
176- if x .finished , err = unpacker .ReadInt64 (); err != nil {
201+ if x .Ntotal , err = unpacker .ReadInt64 (); err != nil {
177202 return
178203 }
179- x .prefix , err = unpacker .ReadString ()
204+ if x .SmapVer , err = unpacker .ReadInt64 (); err != nil {
205+ return
206+ }
207+ if x .Chunks , err = unpacker .ReadInt32 (); err != nil {
208+ return
209+ }
210+ if x .Nat , err = unpacker .ReadInt32 (); err != nil {
211+ return
212+ }
213+
214+ x .Prefix , err = unpacker .ReadString ()
180215 return
181216}
182217
183- func getNBI (fqn string ) (meta nbiXattr , ok bool , err error ) {
218+ func getNBI (fqn string ) (x * nbiXattr , ok bool , err error ) {
184219 b , err := GetXattr (fqn , xattrNBI )
185220 if err != nil {
186221 if cos .IsErrXattrNotFound (err ) {
187- return meta , false , nil
222+ return nil , false , nil
188223 }
189- return meta , false , err
224+ return nil , false , err
190225 }
191226
227+ x = & nbiXattr {}
192228 u := cos .NewUnpacker (b )
193- if err = meta .Unpack (u ); err != nil {
194- return meta , false , err
229+ if err = x .Unpack (u ); err != nil {
230+ return nil , false , err
195231 }
196- if meta .version != nbiMetaVersion {
197- return meta , false , fmt .Errorf ("unsupported NBI metadata version %d" , meta .version )
232+ if x .version != nbiMetaVersion {
233+ return nil , false , fmt .Errorf ("unsupported NBI metadata version %d" , x .version )
198234 }
199- return meta , true , nil
235+ return x , true , nil
200236}
201237
202- func SetNBI (fqn string , started , finished int64 , prefix string , buf []byte ) error {
203- x := & nbiXattr {
204- version : nbiMetaVersion ,
205- started : started ,
206- finished : finished ,
207- prefix : prefix ,
238+ func SetNBI (fqn string , meta * apc.NBIMeta , buf []byte ) error {
239+ x := nbiXattr {
240+ NBIMeta : * meta ,
241+ version : nbiMetaVersion ,
208242 }
209-
210243 packer := cos .NewPacker (buf , x .PackedSize ())
211244 x .Pack (packer )
212245
0 commit comments