@ -18,6 +18,8 @@ import (
raftstorage "github.com/hashicorp/consul/internal/storage/raft"
raftstorage "github.com/hashicorp/consul/internal/storage/raft"
)
)
var cePersister , entPersister persister
var SnapshotSummaries = [ ] prometheus . SummaryDefinition {
var SnapshotSummaries = [ ] prometheus . SummaryDefinition {
{
{
Name : [ ] string { "fsm" , "persist" } ,
Name : [ ] string { "fsm" , "persist" } ,
@ -44,15 +46,6 @@ type SnapshotHeader struct {
// persister is a function used to help snapshot the FSM state.
// persister is a function used to help snapshot the FSM state.
type persister func ( s * snapshot , sink raft . SnapshotSink , encoder * codec . Encoder ) error
type persister func ( s * snapshot , sink raft . SnapshotSink , encoder * codec . Encoder ) error
// persisters is a list of snapshot functions.
var persisters [ ] persister
// registerPersister adds a new helper. This should be called at package
// init() time.
func registerPersister ( fn persister ) {
persisters = append ( persisters , fn )
}
// restorer is a function used to load back a snapshot of the FSM state.
// restorer is a function used to load back a snapshot of the FSM state.
type restorer func ( header * SnapshotHeader , restore * state . Restore , decoder * codec . Decoder ) error
type restorer func ( header * SnapshotHeader , restore * state . Restore , decoder * codec . Decoder ) error
@ -86,7 +79,16 @@ func (s *snapshot) Persist(sink raft.SnapshotSink) error {
}
}
// Run all the persisters to write the FSM state.
// Run all the persisters to write the FSM state.
for _ , fn := range persisters {
for _ , fn := range [ ] persister {
// The enterprise version MUST be executed first, otherwise the snapshot will
// not properly function during restore due to missing tenancy objects.
entPersister ,
cePersister ,
} {
// Check for nil, since the enterprise version may not exist in CE.
if fn == nil {
continue
}
if err := fn ( s , sink , encoder ) ; err != nil {
if err := fn ( s , sink , encoder ) ; err != nil {
sink . Cancel ( )
sink . Cancel ( )
return err
return err