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(&params)
    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  }