[lxc-devel] [lxd/master] Adapt to new dqlite api
freeekanayaka on Github
lxc-bot at linuxcontainers.org
Fri Mar 23 14:29:34 UTC 2018
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 770 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20180323/50c3e046/attachment.bin>
-------------- next part --------------
From 386acf80d78d78a1896dd3bf222ee9b82f1e4ffa Mon Sep 17 00:00:00 2001
From: Free Ekanayaka <free.ekanayaka at canonical.com>
Date: Wed, 21 Mar 2018 18:05:57 +0000
Subject: [PATCH] new dqlite api
Signed-off-by: Free Ekanayaka <free.ekanayaka at canonical.com>
---
Makefile | 2 +-
lxd/cluster/gateway.go | 9 +--------
lxd/cluster/raft.go | 12 ++++++++++--
lxd/db/db.go | 1 +
lxd/main_activateifneeded.go | 10 +++++++---
5 files changed, 20 insertions(+), 14 deletions(-)
diff --git a/Makefile b/Makefile
index 337e8db3e..ecabec3cd 100644
--- a/Makefile
+++ b/Makefile
@@ -9,7 +9,7 @@ POTFILE=po/$(DOMAIN).pot
# TODO: use git describe for versioning
VERSION=$(shell grep "var Version" shared/version/flex.go | cut -d'"' -f2)
ARCHIVE=lxd-$(VERSION).tar
-TAGS=$(shell printf "\#include <sqlite3.h>\nvoid main(){int n = SQLITE_REPLICATION;}" | $(CC) -o /dev/null -xc - >/dev/null 2>&1 && echo "-tags libsqlite3")
+TAGS=$(shell printf "\#include <sqlite3.h>\nvoid main(){int n = SQLITE_CONFIG_REPLICATION;}" | $(CC) -o /dev/null -xc - >/dev/null 2>&1 && echo "-tags libsqlite3")
.PHONY: default
default:
diff --git a/lxd/cluster/gateway.go b/lxd/cluster/gateway.go
index 76119aa29..268183e22 100644
--- a/lxd/cluster/gateway.go
+++ b/lxd/cluster/gateway.go
@@ -405,14 +405,7 @@ func (g *Gateway) init() error {
// exposed it over gRPC.
if raft != nil {
config := dqlite.DriverConfig{}
- if raft.HandlerFunc() == nil {
- // FIXME enable auto-checkpoint to avoid WAL growing
- // indefinitely. This should be disabled when proper
- // checkpoint support is added for multi-node
- // deployments.
- config.AutoCheckpoint = 1000
- }
- driver, err := dqlite.NewDriver(raft.FSM(), raft.Raft(), config)
+ driver, err := dqlite.NewDriver(raft.Registry(), raft.Raft(), config)
if err != nil {
return errors.Wrap(err, "failed to create dqlite driver")
}
diff --git a/lxd/cluster/raft.go b/lxd/cluster/raft.go
index 48058ecc3..97483553f 100644
--- a/lxd/cluster/raft.go
+++ b/lxd/cluster/raft.go
@@ -84,6 +84,7 @@ type raftInstance struct {
handler http.HandlerFunc // Handles join/leave/connect requests
membershipChanger func(*raft.Raft) // Forwards to raft membership requests from handler
logs *raftboltdb.BoltStore // Raft logs store, needs to be closed upon shutdown
+ registry *dqlite.Registry // The dqlite Registry linked to the FSM and the Driver
fsm raft.FSM // The dqlite FSM linked to the raft instance
raft *raft.Raft // The actual raft instance
}
@@ -169,8 +170,9 @@ func raftInstanceInit(
}
}
- // The dqlite FSM.
- fsm := dqlite.NewFSM(dir)
+ // The dqlite registry and FSM.
+ registry := dqlite.NewRegistry(dir)
+ fsm := dqlite.NewFSM(registry)
// The actual raft instance.
raft, err := raft.NewRaft(config, fsm, logs, logs, snaps, transport)
@@ -192,6 +194,7 @@ func raftInstanceInit(
handler: raftHandler(cert, handler),
membershipChanger: membershipChanger,
logs: logs,
+ registry: registry,
fsm: fsm,
raft: raft,
}
@@ -199,6 +202,11 @@ func raftInstanceInit(
return instance, nil
}
+// Registry returns the dqlite Registry associated with the raft instance.
+func (i *raftInstance) Registry() *dqlite.Registry {
+ return i.registry
+}
+
// FSM returns the dqlite FSM associated with the raft instance.
func (i *raftInstance) FSM() raft.FSM {
return i.fsm
diff --git a/lxd/db/db.go b/lxd/db/db.go
index bf550d8bb..76b69b27b 100644
--- a/lxd/db/db.go
+++ b/lxd/db/db.go
@@ -193,6 +193,7 @@ func OpenCluster(name string, dialer grpcsql.Dialer, address string) (*Cluster,
db: db,
}
db.SetMaxOpenConns(1)
+ db.SetMaxIdleConns(1)
// Figure out the ID of this node.
err = cluster.Transaction(func(tx *ClusterTx) error {
diff --git a/lxd/main_activateifneeded.go b/lxd/main_activateifneeded.go
index 7f646903b..1356a4167 100644
--- a/lxd/main_activateifneeded.go
+++ b/lxd/main_activateifneeded.go
@@ -140,7 +140,7 @@ func (c *cmdActivateifneeded) Run(cmd *cobra.Command, args []string) error {
func sqliteDirectAccess(conn *sqlite3.SQLiteConn) error {
// Ensure journal mode is set to WAL, as this is a requirement for
// replication.
- err := sqlite3.JournalModePragma(conn, sqlite3.JournalWal)
+ _, err := conn.Exec("PRAGMA journal_mode=wal", nil)
if err != nil {
return err
}
@@ -148,13 +148,17 @@ func sqliteDirectAccess(conn *sqlite3.SQLiteConn) error {
// Ensure we don't truncate or checkpoint the WAL on exit, as this
// would bork replication which must be in full control of the WAL
// file.
- err = sqlite3.JournalSizeLimitPragma(conn, -1)
+ _, err = conn.Exec("PRAGMA journal_size_limit=-1", nil)
if err != nil {
return err
}
- err = sqlite3.DatabaseNoCheckpointOnClose(conn)
+
+ // Ensure WAL autocheckpoint is disabled, since checkpoints are
+ // triggered explicitly by dqlite.
+ _, err = conn.Exec("PRAGMA wal_autocheckpoint=0", nil)
if err != nil {
return err
}
+
return nil
}
More information about the lxc-devel
mailing list