default log store backend to WAL and allow disabling verification

zalimeni/dhiaayachi/raft-wal-backend-as-default--suggestions
Dhia Ayachi 3 months ago
parent 188af1ccb0
commit e2f327c989
No known key found for this signature in database

@ -2857,7 +2857,7 @@ func (b *builder) raftLogStoreConfigVal(raw *RaftLogStoreRaw) consul.RaftLogStor
cfg.Backend = stringValWithDefault(raw.Backend, consul.LogStoreBackendDefault) cfg.Backend = stringValWithDefault(raw.Backend, consul.LogStoreBackendDefault)
cfg.DisableLogCache = boolVal(raw.DisableLogCache) cfg.DisableLogCache = boolVal(raw.DisableLogCache)
cfg.Verification.Enabled = boolVal(raw.Verification.Enabled) cfg.Verification.Enabled = boolValWithDefault(raw.Verification.Enabled, true)
cfg.Verification.Interval = b.durationVal("raft_logstore.verification.interval", raw.Verification.Interval) cfg.Verification.Interval = b.durationVal("raft_logstore.verification.interval", raw.Verification.Interval)
cfg.BoltDB.NoFreelistSync = boolVal(raw.BoltDBConfig.NoFreelistSync) cfg.BoltDB.NoFreelistSync = boolVal(raw.BoltDBConfig.NoFreelistSync)

@ -79,7 +79,6 @@ import (
"github.com/hashicorp/consul/internal/tenancy" "github.com/hashicorp/consul/internal/tenancy"
"github.com/hashicorp/consul/lib" "github.com/hashicorp/consul/lib"
"github.com/hashicorp/consul/lib/routine" "github.com/hashicorp/consul/lib/routine"
"github.com/hashicorp/consul/lib/stringslice"
"github.com/hashicorp/consul/logging" "github.com/hashicorp/consul/logging"
"github.com/hashicorp/consul/proto-public/pbmesh/v2beta1/pbproxystate" "github.com/hashicorp/consul/proto-public/pbmesh/v2beta1/pbproxystate"
"github.com/hashicorp/consul/proto-public/pbresource" "github.com/hashicorp/consul/proto-public/pbresource"
@ -747,7 +746,7 @@ func NewServer(config *Config, flat Deps, externalGRPCServer *grpc.Server,
} }
// Initialize the Raft server. // Initialize the Raft server.
if err := s.setupRaft(stringslice.Contains(flat.Experiments, CatalogResourceExperimentName)); err != nil { if err := s.setupRaft(); err != nil {
s.Shutdown() s.Shutdown()
return nil, fmt.Errorf("Failed to start Raft: %v", err) return nil, fmt.Errorf("Failed to start Raft: %v", err)
} }
@ -1109,7 +1108,7 @@ func (s *Server) connectCARootsMonitor(ctx context.Context) {
} }
// setupRaft is used to setup and initialize Raft // setupRaft is used to setup and initialize Raft
func (s *Server) setupRaft(isCatalogResourceExperiment bool) error { func (s *Server) setupRaft() error {
// If we have an unclean exit then attempt to close the Raft store. // If we have an unclean exit then attempt to close the Raft store.
defer func() { defer func() {
if s.raft == nil && s.raftStore != nil { if s.raft == nil && s.raftStore != nil {
@ -1190,16 +1189,8 @@ func (s *Server) setupRaft(isCatalogResourceExperiment bool) error {
return nil return nil
} }
// Only use WAL if there is no existing raft.db, even if it's enabled. // Only use WAL if there is no existing raft.db, even if it's enabled.
if s.config.LogStoreConfig.Backend == LogStoreBackendDefault && !boltFileExists && isCatalogResourceExperiment { if s.config.LogStoreConfig.Backend == LogStoreBackendDefault && !boltFileExists {
s.config.LogStoreConfig.Backend = LogStoreBackendWAL s.config.LogStoreConfig.Backend = LogStoreBackendWAL
if !s.config.LogStoreConfig.Verification.Enabled {
s.config.LogStoreConfig.Verification.Enabled = true
s.config.LogStoreConfig.Verification.Interval = 1 * time.Minute
}
if err = initWAL(); err != nil {
return err
}
} else if s.config.LogStoreConfig.Backend == LogStoreBackendWAL && !boltFileExists {
if err = initWAL(); err != nil { if err = initWAL(); err != nil {
return err return err
} }
@ -1230,11 +1221,14 @@ func (s *Server) setupRaft(isCatalogResourceExperiment bool) error {
// See if log verification is enabled // See if log verification is enabled
if s.config.LogStoreConfig.Verification.Enabled { if s.config.LogStoreConfig.Verification.Enabled {
if s.config.LogStoreConfig.Verification.Interval == 0 {
s.config.LogStoreConfig.Verification.Interval = 1 * time.Minute
}
mc := walmetrics.NewGoMetricsCollector([]string{"raft", "logstore", "verifier"}, nil, nil) mc := walmetrics.NewGoMetricsCollector([]string{"raft", "logstore", "verifier"}, nil, nil)
reportFn := makeLogVerifyReportFn(s.logger.Named("raft.logstore.verifier")) reportFn := makeLogVerifyReportFn(s.logger.Named("raft.logstore.verifier"))
verifier := verifier.NewLogStore(log, isLogVerifyCheckpoint, reportFn, mc) v := verifier.NewLogStore(log, isLogVerifyCheckpoint, reportFn, mc)
s.raftStore = verifier s.raftStore = v
log = verifier log = v
} }
// Wrap the store in a LogCache to improve performance. // Wrap the store in a LogCache to improve performance.

@ -19,10 +19,6 @@ import (
"github.com/armon/go-metrics" "github.com/armon/go-metrics"
"github.com/google/tcpproxy" "github.com/google/tcpproxy"
"github.com/hashicorp/go-hclog"
"github.com/hashicorp/go-uuid"
"github.com/hashicorp/memberlist"
"github.com/hashicorp/raft"
"github.com/stretchr/testify/mock" "github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"golang.org/x/time/rate" "golang.org/x/time/rate"
@ -30,6 +26,13 @@ import (
"google.golang.org/grpc/keepalive" "google.golang.org/grpc/keepalive"
"github.com/hashicorp/consul-net-rpc/net/rpc" "github.com/hashicorp/consul-net-rpc/net/rpc"
"github.com/hashicorp/go-hclog"
"github.com/hashicorp/go-uuid"
"github.com/hashicorp/memberlist"
"github.com/hashicorp/raft"
raftboltdb "github.com/hashicorp/raft-boltdb/v2"
raftwal "github.com/hashicorp/raft-wal"
"github.com/hashicorp/raft-wal/verifier"
"github.com/hashicorp/consul/agent/connect" "github.com/hashicorp/consul/agent/connect"
"github.com/hashicorp/consul/agent/consul/multilimiter" "github.com/hashicorp/consul/agent/consul/multilimiter"
@ -390,6 +393,92 @@ func TestServer_StartStop(t *testing.T) {
} }
} }
func TestServer_RaftBackend_Default(t *testing.T) {
t.Parallel()
// Start up a server and then stop it.
_, s1 := testServerWithConfig(t, func(config *Config) {
config.LogStoreConfig.Backend = LogStoreBackendDefault
config.LogStoreConfig.Verification.Enabled = false
})
_, ok := s1.raftStore.(*raftwal.WAL)
defer func() {
if err := s1.Shutdown(); err != nil {
t.Fatalf("err: %v", err)
}
}()
require.True(t, ok)
}
func TestServer_RaftBackend_Verifier_WAL(t *testing.T) {
t.Parallel()
// Start up a server and then stop it.
_, s1 := testServerWithConfig(t, func(config *Config) {
config.LogStoreConfig.Backend = LogStoreBackendDefault
config.LogStoreConfig.Verification.Enabled = true
})
_, ok := s1.raftStore.(*verifier.LogStore)
defer func() {
if err := s1.Shutdown(); err != nil {
t.Fatalf("err: %v", err)
}
}()
require.True(t, ok)
}
func TestServer_RaftBackend_WAL(t *testing.T) {
t.Parallel()
// Start up a server and then stop it.
_, s1 := testServerWithConfig(t, func(config *Config) {
config.LogStoreConfig.Backend = LogStoreBackendWAL
config.LogStoreConfig.Verification.Enabled = false
})
_, ok := s1.raftStore.(*raftwal.WAL)
defer func() {
if err := s1.Shutdown(); err != nil {
t.Fatalf("err: %v", err)
}
}()
require.True(t, ok)
}
func TestServer_RaftBackend_Verifier_BoltDB(t *testing.T) {
t.Parallel()
// Start up a server and then stop it.
_, s1 := testServerWithConfig(t, func(config *Config) {
config.LogStoreConfig.Backend = LogStoreBackendBoltDB
config.LogStoreConfig.Verification.Enabled = true
})
_, ok := s1.raftStore.(*verifier.LogStore)
defer func() {
if err := s1.Shutdown(); err != nil {
t.Fatalf("err: %v", err)
}
}()
require.True(t, ok)
}
func TestServer_RaftBackend_BoltDB(t *testing.T) {
t.Parallel()
// Start up a server and then stop it.
_, s1 := testServerWithConfig(t, func(config *Config) {
config.LogStoreConfig.Backend = LogStoreBackendBoltDB
config.LogStoreConfig.Verification.Enabled = true
})
store, ok := s1.raftStore.(*raftboltdb.BoltStore)
defer func() {
if err := s1.Shutdown(); err != nil {
t.Fatalf("err: %v", err)
}
}()
fmt.Printf("%v\n", store)
require.True(t, ok)
}
func TestServer_fixupACLDatacenter(t *testing.T) { func TestServer_fixupACLDatacenter(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("too slow for testing.Short") t.Skip("too slow for testing.Short")

Loading…
Cancel
Save