add '.healing.bin' for tracking currently healing disk (#10573)
add a hint on the disk to allow for tracking fresh disk being healed, to allow for restartable heals, and also use this as a way to track and remove disks. There are more pending changes where we should move all the disk formatting logic to backend drives, this PR doesn't deal with this refactor instead makes it easier to track healing in the future.master
parent
849fcf0127
commit
66174692a2
@ -0,0 +1,110 @@ |
||||
package cmd |
||||
|
||||
// Code generated by github.com/tinylib/msgp DO NOT EDIT.
|
||||
|
||||
import ( |
||||
"github.com/tinylib/msgp/msgp" |
||||
) |
||||
|
||||
// DecodeMsg implements msgp.Decodable
|
||||
func (z *healingTracker) DecodeMsg(dc *msgp.Reader) (err error) { |
||||
var field []byte |
||||
_ = field |
||||
var zb0001 uint32 |
||||
zb0001, err = dc.ReadMapHeader() |
||||
if err != nil { |
||||
err = msgp.WrapError(err) |
||||
return |
||||
} |
||||
for zb0001 > 0 { |
||||
zb0001-- |
||||
field, err = dc.ReadMapKeyPtr() |
||||
if err != nil { |
||||
err = msgp.WrapError(err) |
||||
return |
||||
} |
||||
switch msgp.UnsafeString(field) { |
||||
case "ID": |
||||
z.ID, err = dc.ReadString() |
||||
if err != nil { |
||||
err = msgp.WrapError(err, "ID") |
||||
return |
||||
} |
||||
default: |
||||
err = dc.Skip() |
||||
if err != nil { |
||||
err = msgp.WrapError(err) |
||||
return |
||||
} |
||||
} |
||||
} |
||||
return |
||||
} |
||||
|
||||
// EncodeMsg implements msgp.Encodable
|
||||
func (z healingTracker) EncodeMsg(en *msgp.Writer) (err error) { |
||||
// map header, size 1
|
||||
// write "ID"
|
||||
err = en.Append(0x81, 0xa2, 0x49, 0x44) |
||||
if err != nil { |
||||
return |
||||
} |
||||
err = en.WriteString(z.ID) |
||||
if err != nil { |
||||
err = msgp.WrapError(err, "ID") |
||||
return |
||||
} |
||||
return |
||||
} |
||||
|
||||
// MarshalMsg implements msgp.Marshaler
|
||||
func (z healingTracker) MarshalMsg(b []byte) (o []byte, err error) { |
||||
o = msgp.Require(b, z.Msgsize()) |
||||
// map header, size 1
|
||||
// string "ID"
|
||||
o = append(o, 0x81, 0xa2, 0x49, 0x44) |
||||
o = msgp.AppendString(o, z.ID) |
||||
return |
||||
} |
||||
|
||||
// UnmarshalMsg implements msgp.Unmarshaler
|
||||
func (z *healingTracker) UnmarshalMsg(bts []byte) (o []byte, err error) { |
||||
var field []byte |
||||
_ = field |
||||
var zb0001 uint32 |
||||
zb0001, bts, err = msgp.ReadMapHeaderBytes(bts) |
||||
if err != nil { |
||||
err = msgp.WrapError(err) |
||||
return |
||||
} |
||||
for zb0001 > 0 { |
||||
zb0001-- |
||||
field, bts, err = msgp.ReadMapKeyZC(bts) |
||||
if err != nil { |
||||
err = msgp.WrapError(err) |
||||
return |
||||
} |
||||
switch msgp.UnsafeString(field) { |
||||
case "ID": |
||||
z.ID, bts, err = msgp.ReadStringBytes(bts) |
||||
if err != nil { |
||||
err = msgp.WrapError(err, "ID") |
||||
return |
||||
} |
||||
default: |
||||
bts, err = msgp.Skip(bts) |
||||
if err != nil { |
||||
err = msgp.WrapError(err) |
||||
return |
||||
} |
||||
} |
||||
} |
||||
o = bts |
||||
return |
||||
} |
||||
|
||||
// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message
|
||||
func (z healingTracker) Msgsize() (s int) { |
||||
s = 1 + 3 + msgp.StringPrefixSize + len(z.ID) |
||||
return |
||||
} |
@ -0,0 +1,123 @@ |
||||
package cmd |
||||
|
||||
// Code generated by github.com/tinylib/msgp DO NOT EDIT.
|
||||
|
||||
import ( |
||||
"bytes" |
||||
"testing" |
||||
|
||||
"github.com/tinylib/msgp/msgp" |
||||
) |
||||
|
||||
func TestMarshalUnmarshalhealingTracker(t *testing.T) { |
||||
v := healingTracker{} |
||||
bts, err := v.MarshalMsg(nil) |
||||
if err != nil { |
||||
t.Fatal(err) |
||||
} |
||||
left, err := v.UnmarshalMsg(bts) |
||||
if err != nil { |
||||
t.Fatal(err) |
||||
} |
||||
if len(left) > 0 { |
||||
t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) |
||||
} |
||||
|
||||
left, err = msgp.Skip(bts) |
||||
if err != nil { |
||||
t.Fatal(err) |
||||
} |
||||
if len(left) > 0 { |
||||
t.Errorf("%d bytes left over after Skip(): %q", len(left), left) |
||||
} |
||||
} |
||||
|
||||
func BenchmarkMarshalMsghealingTracker(b *testing.B) { |
||||
v := healingTracker{} |
||||
b.ReportAllocs() |
||||
b.ResetTimer() |
||||
for i := 0; i < b.N; i++ { |
||||
v.MarshalMsg(nil) |
||||
} |
||||
} |
||||
|
||||
func BenchmarkAppendMsghealingTracker(b *testing.B) { |
||||
v := healingTracker{} |
||||
bts := make([]byte, 0, v.Msgsize()) |
||||
bts, _ = v.MarshalMsg(bts[0:0]) |
||||
b.SetBytes(int64(len(bts))) |
||||
b.ReportAllocs() |
||||
b.ResetTimer() |
||||
for i := 0; i < b.N; i++ { |
||||
bts, _ = v.MarshalMsg(bts[0:0]) |
||||
} |
||||
} |
||||
|
||||
func BenchmarkUnmarshalhealingTracker(b *testing.B) { |
||||
v := healingTracker{} |
||||
bts, _ := v.MarshalMsg(nil) |
||||
b.ReportAllocs() |
||||
b.SetBytes(int64(len(bts))) |
||||
b.ResetTimer() |
||||
for i := 0; i < b.N; i++ { |
||||
_, err := v.UnmarshalMsg(bts) |
||||
if err != nil { |
||||
b.Fatal(err) |
||||
} |
||||
} |
||||
} |
||||
|
||||
func TestEncodeDecodehealingTracker(t *testing.T) { |
||||
v := healingTracker{} |
||||
var buf bytes.Buffer |
||||
msgp.Encode(&buf, &v) |
||||
|
||||
m := v.Msgsize() |
||||
if buf.Len() > m { |
||||
t.Log("WARNING: TestEncodeDecodehealingTracker Msgsize() is inaccurate") |
||||
} |
||||
|
||||
vn := healingTracker{} |
||||
err := msgp.Decode(&buf, &vn) |
||||
if err != nil { |
||||
t.Error(err) |
||||
} |
||||
|
||||
buf.Reset() |
||||
msgp.Encode(&buf, &v) |
||||
err = msgp.NewReader(&buf).Skip() |
||||
if err != nil { |
||||
t.Error(err) |
||||
} |
||||
} |
||||
|
||||
func BenchmarkEncodehealingTracker(b *testing.B) { |
||||
v := healingTracker{} |
||||
var buf bytes.Buffer |
||||
msgp.Encode(&buf, &v) |
||||
b.SetBytes(int64(buf.Len())) |
||||
en := msgp.NewWriter(msgp.Nowhere) |
||||
b.ReportAllocs() |
||||
b.ResetTimer() |
||||
for i := 0; i < b.N; i++ { |
||||
v.EncodeMsg(en) |
||||
} |
||||
en.Flush() |
||||
} |
||||
|
||||
func BenchmarkDecodehealingTracker(b *testing.B) { |
||||
v := healingTracker{} |
||||
var buf bytes.Buffer |
||||
msgp.Encode(&buf, &v) |
||||
b.SetBytes(int64(buf.Len())) |
||||
rd := msgp.NewEndlessReader(buf.Bytes(), b) |
||||
dc := msgp.NewReader(rd) |
||||
b.ReportAllocs() |
||||
b.ResetTimer() |
||||
for i := 0; i < b.N; i++ { |
||||
err := v.DecodeMsg(dc) |
||||
if err != nil { |
||||
b.Fatal(err) |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue