[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