github.com/onflow/flow-go@v0.33.17/storage/badger/operation/epoch.go (about)

     1  package operation
     2  
     3  import (
     4  	"errors"
     5  
     6  	"github.com/dgraph-io/badger/v2"
     7  
     8  	"github.com/onflow/flow-go/model/flow"
     9  	"github.com/onflow/flow-go/storage"
    10  )
    11  
    12  func InsertEpochSetup(eventID flow.Identifier, event *flow.EpochSetup) func(*badger.Txn) error {
    13  	return insert(makePrefix(codeEpochSetup, eventID), event)
    14  }
    15  
    16  func RetrieveEpochSetup(eventID flow.Identifier, event *flow.EpochSetup) func(*badger.Txn) error {
    17  	return retrieve(makePrefix(codeEpochSetup, eventID), event)
    18  }
    19  
    20  func InsertEpochCommit(eventID flow.Identifier, event *flow.EpochCommit) func(*badger.Txn) error {
    21  	return insert(makePrefix(codeEpochCommit, eventID), event)
    22  }
    23  
    24  func RetrieveEpochCommit(eventID flow.Identifier, event *flow.EpochCommit) func(*badger.Txn) error {
    25  	return retrieve(makePrefix(codeEpochCommit, eventID), event)
    26  }
    27  
    28  func InsertEpochStatus(blockID flow.Identifier, status *flow.EpochStatus) func(*badger.Txn) error {
    29  	return insert(makePrefix(codeBlockEpochStatus, blockID), status)
    30  }
    31  
    32  func RetrieveEpochStatus(blockID flow.Identifier, status *flow.EpochStatus) func(*badger.Txn) error {
    33  	return retrieve(makePrefix(codeBlockEpochStatus, blockID), status)
    34  }
    35  
    36  // SetEpochEmergencyFallbackTriggered sets a flag in the DB indicating that
    37  // epoch emergency fallback has been triggered, and the block where it was triggered.
    38  //
    39  // EECC can be triggered in two ways:
    40  //  1. Finalizing the first block past the epoch commitment deadline, when the
    41  //     next epoch has not yet been committed (see protocol.Params for more detail)
    42  //  2. Finalizing a fork in which an invalid service event was incorporated.
    43  //
    44  // Calling this function multiple times is a no-op and returns no expected errors.
    45  func SetEpochEmergencyFallbackTriggered(blockID flow.Identifier) func(txn *badger.Txn) error {
    46  	return SkipDuplicates(insert(makePrefix(codeEpochEmergencyFallbackTriggered), blockID))
    47  }
    48  
    49  // RetrieveEpochEmergencyFallbackTriggeredBlockID gets the block ID where epoch
    50  // emergency was triggered.
    51  func RetrieveEpochEmergencyFallbackTriggeredBlockID(blockID *flow.Identifier) func(*badger.Txn) error {
    52  	return retrieve(makePrefix(codeEpochEmergencyFallbackTriggered), blockID)
    53  }
    54  
    55  // CheckEpochEmergencyFallbackTriggered retrieves the value of the flag
    56  // indicating whether epoch emergency fallback has been triggered. If the key
    57  // is not set, this results in triggered being set to false.
    58  func CheckEpochEmergencyFallbackTriggered(triggered *bool) func(*badger.Txn) error {
    59  	return func(tx *badger.Txn) error {
    60  		var blockID flow.Identifier
    61  		err := RetrieveEpochEmergencyFallbackTriggeredBlockID(&blockID)(tx)
    62  		if errors.Is(err, storage.ErrNotFound) {
    63  			// flag unset, EECC not triggered
    64  			*triggered = false
    65  			return nil
    66  		} else if err != nil {
    67  			// storage error, set triggered to zero value
    68  			*triggered = false
    69  			return err
    70  		}
    71  		// flag is set, EECC triggered
    72  		*triggered = true
    73  		return err
    74  	}
    75  }