code.vegaprotocol.io/vega@v0.79.0/core/netparams/checkpoint.go (about) 1 // Copyright (C) 2023 Gobalsky Labs Limited 2 // 3 // This program is free software: you can redistribute it and/or modify 4 // it under the terms of the GNU Affero General Public License as 5 // published by the Free Software Foundation, either version 3 of the 6 // License, or (at your option) any later version. 7 // 8 // This program is distributed in the hope that it will be useful, 9 // but WITHOUT ANY WARRANTY; without even the implied warranty of 10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 // GNU Affero General Public License for more details. 12 // 13 // You should have received a copy of the GNU Affero General Public License 14 // along with this program. If not, see <http://www.gnu.org/licenses/>. 15 16 package netparams 17 18 import ( 19 "context" 20 "sort" 21 "time" 22 23 "code.vegaprotocol.io/vega/core/types" 24 "code.vegaprotocol.io/vega/libs/proto" 25 "code.vegaprotocol.io/vega/protos/vega" 26 snapshot "code.vegaprotocol.io/vega/protos/vega/snapshot/v1" 27 ) 28 29 func (s *Store) Name() types.CheckpointName { 30 return types.NetParamsCheckpoint 31 } 32 33 func (s *Store) Checkpoint() ([]byte, error) { 34 s.mu.RLock() 35 params := snapshot.NetParams{ 36 Params: make([]*vega.NetworkParameter, 0, len(s.store)), 37 } 38 for k, v := range s.store { 39 params.Params = append(params.Params, &vega.NetworkParameter{ 40 Key: k, 41 Value: v.String(), 42 }) 43 } 44 s.mu.RUnlock() 45 // no net params, we can stop here 46 if len(params.Params) == 0 { 47 return nil, nil 48 } 49 // sort the keys 50 sort.Slice(params.Params, func(i, j int) bool { 51 return params.Params[i].Key < params.Params[j].Key 52 }) 53 return proto.Marshal(¶ms) 54 } 55 56 func (s *Store) Load(ctx context.Context, data []byte) error { 57 params := &snapshot.NetParams{} 58 if err := proto.Unmarshal(data, params); err != nil { 59 return err 60 } 61 np := make(map[string]string, len(params.Params)) 62 for _, param := range params.Params { 63 if _, ok := s.checkpointOverwrites[param.Key]; ok { 64 continue // skip all overwrites 65 } 66 np[param.Key] = param.Value 67 } 68 if err := s.updateBatch(ctx, np); err != nil { 69 return err 70 } 71 // force the updates dispatch 72 s.OnTick(ctx, time.Time{}) 73 return nil 74 }