Backport of Fix snapshot creation issue. into release/1.15.x (#18788)

backport of commit fe581326aa

Co-authored-by: Derek Menteer <derek.menteer@hashicorp.com>
backport/16955-transfer-leader/safely-positive-bobcat
hc-github-team-consul-core 2023-09-13 15:51:51 -05:00 committed by GitHub
parent e0fa7742f6
commit d69b9c6286
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 13 additions and 12 deletions

View File

@ -13,6 +13,8 @@ import (
"github.com/hashicorp/raft"
)
var cePersister, entPersister persister
var SnapshotSummaries = []prometheus.SummaryDefinition{
{
Name: []string{"fsm", "persist"},
@ -38,15 +40,6 @@ type SnapshotHeader struct {
// persister is a function used to help snapshot the FSM state.
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.
type restorer func(header *SnapshotHeader, restore *state.Restore, decoder *codec.Decoder) error
@ -80,7 +73,16 @@ func (s *snapshot) Persist(sink raft.SnapshotSink) error {
}
// 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 {
sink.Cancel()
return err

View File

@ -14,8 +14,7 @@ import (
)
func init() {
registerPersister(persistCE)
cePersister = persistCE
registerRestorer(structs.RegisterRequestType, restoreRegistration)
registerRestorer(structs.KVSRequestType, restoreKV)
registerRestorer(structs.TombstoneRequestType, restoreTombstone)