1
0
Fork 0

Add system-level test for compressed backups

master
Philip O'Toole 9 months ago
parent 494e21a047
commit 565b792e0c

@ -1258,7 +1258,7 @@ func Test_MultiNodeCluster_Backup(t *testing.T) {
backupFile := mustTempFile() backupFile := mustTempFile()
defer os.Remove(backupFile) defer os.Remove(backupFile)
if err := followers[0].Backup(backupFile); err != nil { if err := followers[0].Backup(backupFile, false); err != nil {
t.Fatalf("failed to get backup from follower: %s", err.Error()) t.Fatalf("failed to get backup from follower: %s", err.Error())
} }

@ -198,8 +198,13 @@ func (n *Node) Load(filename string) (string, error) {
} }
// Backup backs up the node's database to the given file. // Backup backs up the node's database to the given file.
func (n *Node) Backup(filename string) error { func (n *Node) Backup(filename string, compress bool) error {
v, _ := url.Parse("http://" + n.APIAddr + "/db/backup") v, _ := url.Parse("http://" + n.APIAddr + "/db/backup")
if compress {
q := v.Query()
q.Set("compress", "true")
v.RawQuery = q.Encode()
}
resp, err := http.Get(v.String()) resp, err := http.Get(v.String())
if err != nil { if err != nil {
return err return err

@ -4,7 +4,9 @@ Package system runs system-level testing of rqlite. This includes testing of sin
package system package system
import ( import (
"compress/gzip"
"fmt" "fmt"
"io"
"os" "os"
"path/filepath" "path/filepath"
"regexp" "regexp"
@ -981,19 +983,17 @@ func Test_SingleNodeBackup(t *testing.T) {
backup := mustTempFile() backup := mustTempFile()
defer os.Remove(backup) defer os.Remove(backup)
if err := node.Backup(backup); err != nil { if err := node.Backup(backup, false); err != nil {
t.Fatalf(`backup failed: %s`, err.Error()) t.Fatalf(`backup failed: %s`, err.Error())
} }
// Create new node, and restore from backup.
newNode := mustNewLeaderNode("leader2") newNode := mustNewLeaderNode("leader2")
defer newNode.Deprovision() defer newNode.Deprovision()
_, err = newNode.Boot(backup) _, err = newNode.Boot(backup)
if err != nil { if err != nil {
t.Fatalf(`boot failed: %s`, err.Error()) t.Fatalf(`boot failed: %s`, err.Error())
} }
// check that the row is present in the new node
r, err := newNode.Query(`SELECT * FROM foo`) r, err := newNode.Query(`SELECT * FROM foo`)
if err != nil { if err != nil {
t.Fatalf(`query failed: %s`, err.Error()) t.Fatalf(`query failed: %s`, err.Error())
@ -1001,6 +1001,49 @@ func Test_SingleNodeBackup(t *testing.T) {
if r != `{"results":[{"columns":["id","name"],"types":["integer","text"],"values":[[1,"fiona"]]}]}` { if r != `{"results":[{"columns":["id","name"],"types":["integer","text"],"values":[[1,"fiona"]]}]}` {
t.Fatalf("test received wrong result got %s", r) t.Fatalf("test received wrong result got %s", r)
} }
// Get a compressed backup, test it again.
if err := node.Backup(backup, true); err != nil {
t.Fatalf(`backup failed: %s`, err.Error())
}
// decompress backup and check it.
decompressedBackup := mustTempFile()
defer os.Remove(decompressedBackup)
f, err := os.Open(backup)
if err != nil {
t.Fatalf(`failed to open backup: %s`, err.Error())
}
defer f.Close()
gzr, err := gzip.NewReader(f)
if err != nil {
t.Fatalf(`failed to create gzip reader: %s`, err.Error())
}
defer gzr.Close()
w, err := os.Create(decompressedBackup)
if err != nil {
t.Fatalf(`failed to create decompressed backup: %s`, err.Error())
}
defer w.Close()
if _, err := io.Copy(w, gzr); err != nil {
t.Fatalf(`failed to decompress backup: %s`, err.Error())
}
// Create new node, and restore from backup.
newNode2 := mustNewLeaderNode("leader3")
defer newNode2.Deprovision()
_, err = newNode2.Boot(decompressedBackup)
if err != nil {
t.Fatalf(`boot failed: %s`, err.Error())
}
r, err = newNode2.Query(`SELECT * FROM foo`)
if err != nil {
t.Fatalf(`query failed: %s`, err.Error())
}
if r != `{"results":[{"columns":["id","name"],"types":["integer","text"],"values":[[1,"fiona"]]}]}` {
t.Fatalf("test received wrong result got %s", r)
}
} }
func Test_SingleNodeNodes(t *testing.T) { func Test_SingleNodeNodes(t *testing.T) {

Loading…
Cancel
Save