Fix state deserialization

The pin objects now include an Origin field which was set to
multiaddr.Multiaddr.

This type is an interface and has no idea how to deserialize itself. As a
result, an state json export cannot be deseralized.

We had already added a wrapper Multiaddr type to handle these issues. I
believe this fix does not affect anything else other than fixing
UnmarshalJSON. PB types are deserialized by hand and it should not make a
difference.
This commit is contained in:
Hector Sanjuan 2021-12-13 17:31:18 +01:00
parent 5a1d835d90
commit 93e2cca49b
3 changed files with 21 additions and 21 deletions

View File

@ -566,16 +566,16 @@ func (pm PinMode) ToPinDepth() PinDepth {
// PinOptions wraps user-defined options for Pins // PinOptions wraps user-defined options for Pins
type PinOptions struct { type PinOptions struct {
ReplicationFactorMin int `json:"replication_factor_min" codec:"rn,omitempty"` ReplicationFactorMin int `json:"replication_factor_min" codec:"rn,omitempty"`
ReplicationFactorMax int `json:"replication_factor_max" codec:"rx,omitempty"` ReplicationFactorMax int `json:"replication_factor_max" codec:"rx,omitempty"`
Name string `json:"name" codec:"n,omitempty"` Name string `json:"name" codec:"n,omitempty"`
Mode PinMode `json:"mode" codec:"o,omitempty"` Mode PinMode `json:"mode" codec:"o,omitempty"`
ShardSize uint64 `json:"shard_size" codec:"s,omitempty"` ShardSize uint64 `json:"shard_size" codec:"s,omitempty"`
UserAllocations []peer.ID `json:"user_allocations" codec:"ua,omitempty"` UserAllocations []peer.ID `json:"user_allocations" codec:"ua,omitempty"`
ExpireAt time.Time `json:"expire_at" codec:"e,omitempty"` ExpireAt time.Time `json:"expire_at" codec:"e,omitempty"`
Metadata map[string]string `json:"metadata" codec:"m,omitempty"` Metadata map[string]string `json:"metadata" codec:"m,omitempty"`
PinUpdate cid.Cid `json:"pin_update,omitempty" codec:"pu,omitempty"` PinUpdate cid.Cid `json:"pin_update,omitempty" codec:"pu,omitempty"`
Origins []multiaddr.Multiaddr `json:"origins" codec:"g,omitempty"` Origins []Multiaddr `json:"origins" codec:"g,omitempty"`
} }
// Equals returns true if two PinOption objects are equivalent. po and po2 may // Equals returns true if two PinOption objects are equivalent. po and po2 may
@ -646,7 +646,7 @@ func (po *PinOptions) Equals(po2 *PinOptions) bool {
for _, o1 := range po.Origins { for _, o1 := range po.Origins {
found := false found := false
for _, o2 := range po2.Origins { for _, o2 := range po2.Origins {
if o1.Equal(o2) { if o1.Value().Equal(o2.Value()) {
found = true found = true
} }
} }
@ -771,9 +771,9 @@ func (po *PinOptions) FromQuery(q url.Values) error {
originsStr := q.Get("origins") originsStr := q.Get("origins")
if originsStr != "" { if originsStr != "" {
origins := strings.Split(originsStr, ",") origins := strings.Split(originsStr, ",")
maOrigins := make([]multiaddr.Multiaddr, len(origins)) maOrigins := make([]Multiaddr, len(origins))
for i, ostr := range origins { for i, ostr := range origins {
maOrig, err := multiaddr.NewMultiaddr(ostr) maOrig, err := NewMultiaddr(ostr)
if err != nil { if err != nil {
return fmt.Errorf("error decoding multiaddress: %w", err) return fmt.Errorf("error decoding multiaddress: %w", err)
} }
@ -1015,13 +1015,13 @@ func (pin *Pin) ProtoUnmarshal(data []byte) error {
pin.Mode = pin.MaxDepth.ToPinMode() pin.Mode = pin.MaxDepth.ToPinMode()
pbOrigins := opts.GetOrigins() pbOrigins := opts.GetOrigins()
origins := make([]multiaddr.Multiaddr, len(pbOrigins)) origins := make([]Multiaddr, len(pbOrigins))
for i, orig := range pbOrigins { for i, orig := range pbOrigins {
maOrig, err := multiaddr.NewMultiaddrBytes(orig) maOrig, err := multiaddr.NewMultiaddrBytes(orig)
if err != nil { if err != nil {
return err return err
} }
origins[i] = maOrig origins[i] = NewMultiaddrWithValue(maOrig)
} }
pin.Origins = origins pin.Origins = origins

View File

@ -174,9 +174,9 @@ func TestPinOptionsQuery(t *testing.T) {
"hello": "bye", "hello": "bye",
"hello2": "bye2", "hello2": "bye2",
}, },
Origins: []multiaddr.Multiaddr{ Origins: []Multiaddr{
multiaddr.StringCast("/ip4/1.2.3.4/tcp/1234/p2p/12D3KooWKewdAMAU3WjYHm8qkAJc5eW6KHbHWNigWraXXtE1UCng"), NewMultiaddrWithValue(multiaddr.StringCast("/ip4/1.2.3.4/tcp/1234/p2p/12D3KooWKewdAMAU3WjYHm8qkAJc5eW6KHbHWNigWraXXtE1UCng")),
multiaddr.StringCast("/ip4/2.3.3.4/tcp/1234/p2p/12D3KooWF6BgwX966ge5AVFs9Gd2wVTBmypxZVvaBR12eYnUmXkR"), NewMultiaddrWithValue(multiaddr.StringCast("/ip4/2.3.3.4/tcp/1234/p2p/12D3KooWF6BgwX966ge5AVFs9Gd2wVTBmypxZVvaBR12eYnUmXkR")),
}, },
}, },
{ {

View File

@ -75,9 +75,9 @@ func TestPin(t *testing.T) {
defer ipfs.Shutdown(ctx) defer ipfs.Shutdown(ctx)
pin := api.PinCid(test.Cid1) pin := api.PinCid(test.Cid1)
pin.Origins = []ma.Multiaddr{ pin.Origins = []api.Multiaddr{
ma.StringCast("/ip4/1.2.3.4/tcp/1234/p2p/12D3KooWKewdAMAU3WjYHm8qkAJc5eW6KHbHWNigWraXXtE1UCng"), api.NewMultiaddrWithValue(ma.StringCast("/ip4/1.2.3.4/tcp/1234/p2p/12D3KooWKewdAMAU3WjYHm8qkAJc5eW6KHbHWNigWraXXtE1UCng")),
ma.StringCast("/ip4/2.3.3.4/tcp/1234/p2p/12D3KooWF6BgwX966ge5AVFs9Gd2wVTBmypxZVvaBR12eYnUmXkR"), api.NewMultiaddrWithValue(ma.StringCast("/ip4/2.3.3.4/tcp/1234/p2p/12D3KooWF6BgwX966ge5AVFs9Gd2wVTBmypxZVvaBR12eYnUmXkR")),
} }
err := ipfs.Pin(ctx, pin) err := ipfs.Pin(ctx, pin)
if err != nil { if err != nil {