From 8119e512af27d5ee4bf8d929bae15cb2353e4b07 Mon Sep 17 00:00:00 2001 From: "Richard T. Carback III" <rick.carback@gmail.com> Date: Mon, 25 Jul 2022 23:22:04 +0000 Subject: [PATCH] Clean up previous negotiations --- auth/store/previousNegotiations.go | 73 ++++++++++++++++-------------- 1 file changed, 38 insertions(+), 35 deletions(-) diff --git a/auth/store/previousNegotiations.go b/auth/store/previousNegotiations.go index 186d3af73..be8d701f0 100644 --- a/auth/store/previousNegotiations.go +++ b/auth/store/previousNegotiations.go @@ -12,6 +12,7 @@ import ( "encoding/binary" "encoding/json" + "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/storage/versioned" "gitlab.com/elixxir/crypto/e2e/auth" @@ -119,42 +120,22 @@ func (s *Store) savePreviousNegotiations() error { func (s *Store) newOrLoadPreviousNegotiations() (map[id.ID]bool, error) { obj, err := s.kv.Get(negotiationPartnersKey, negotiationPartnersVersion) - if err != nil { - // Version 0 Upgrade Path - obj, err2 := s.kv.Get(negotiationPartnersKey, 0) - if err2 == nil && obj.Version == 0 { - old := unmarshalPreviousNegotiationsV0(obj.Data) - newPrevNegotiations := make(map[id.ID]bool) - for id := range old { - newPrevNegotiations[id] = true - } - obj = &versioned.Object{ - Version: negotiationPartnersVersion, - Timestamp: netTime.Now(), - Data: marshalPreviousNegotiations( - newPrevNegotiations), - } - err = s.kv.Set(negotiationPartnersKey, - negotiationPartnersVersion, obj) - if err != nil { - return nil, err - } - } - if !ekv.Exists(err) { - newPreviousNegotiations := make(map[id.ID]bool) - obj := &versioned.Object{ - Version: negotiationPartnersVersion, - Timestamp: netTime.Now(), - Data: marshalPreviousNegotiations( - newPreviousNegotiations), - } - err = s.kv.Set(negotiationPartnersKey, - negotiationPartnersVersion, obj) - if err != nil { - return nil, err - } - return newPreviousNegotiations, nil + + // V0 Upgrade Path + if !ekv.Exists(err) { + upgradeErr := upgradePreviousNegotiationsV0(s.kv) + if upgradeErr != nil { + return nil, errors.Wrapf(err, "%+v", upgradeErr) } + obj, err = s.kv.Get(negotiationPartnersKey, + negotiationPartnersVersion) + } + + // Note: if it still doesn't exist, return an empty one. + if err != nil && !ekv.Exists(err) { + newPreviousNegotiations := make(map[id.ID]bool) + return newPreviousNegotiations, nil + } else if err != nil { return nil, err } @@ -286,3 +267,25 @@ func unmarshalPreviousNegotiationsV0(buf []byte) map[id.ID]struct{} { return partners } + +// upgradePreviousNegotiationsV0 upgrades the negotiations Partners key from V0 +// to V1 +func upgradePreviousNegotiationsV0(kv *versioned.KV) error { + obj, err := kv.Get(negotiationPartnersKey, 0) + if !ekv.Exists(err) { + return nil + } + + old := unmarshalPreviousNegotiationsV0(obj.Data) + newPrevNegotiations := make(map[id.ID]bool) + for id := range old { + newPrevNegotiations[id] = true + } + obj = &versioned.Object{ + Version: negotiationPartnersVersion, + Timestamp: netTime.Now(), + Data: marshalPreviousNegotiations( + newPrevNegotiations), + } + return kv.Set(negotiationPartnersKey, negotiationPartnersVersion, obj) +} -- GitLab