We need to reset prevSeq so that we force a full check when someone reconnects - the sequence number may not have changed due to the reconnect. (This is a regression; we did this before f6ea2a7.) Also add an optimization: we schedule a pull after scanning, but there is no need to do so if no changes were detected. This matters now because the scheduled pull actually traverses the database which is expensive. This, however, makes the pull not happen on initial scan if there were no changes during the initial scan. Compensate by always scheduling a pull after initial scan in the rwfolder itself. GitHub-Pull-Request: https://github.com/syncthing/syncthing/pull/4508 LGTM: imsodin, AudriusButkevicius
145 lines
3.2 KiB
Go
145 lines
3.2 KiB
Go
// Copyright (C) 2014 The Syncthing Authors.
|
|
//
|
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
// You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
|
|
// +build integration
|
|
|
|
package integration
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"io"
|
|
"io/ioutil"
|
|
"log"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
)
|
|
|
|
func TestReset(t *testing.T) {
|
|
// Clean and start a syncthing instance
|
|
|
|
log.Println("Cleaning...")
|
|
err := removeAll("s1", "h1/index*")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := os.Mkdir("s1", 0755); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
log.Println("Creating files...")
|
|
size := createFiles(t)
|
|
|
|
p := startInstance(t, 1)
|
|
defer p.Stop() // Not checkedStop, because Syncthing will exit on its own
|
|
|
|
m, err := p.Model("default")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
expected := size
|
|
if m.LocalFiles != expected {
|
|
t.Fatalf("Incorrect number of files after initial scan, %d != %d", m.LocalFiles, expected)
|
|
}
|
|
|
|
// Clear all files but restore the folder marker
|
|
log.Println("Cleaning...")
|
|
err = removeAll("s1")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := os.Mkdir("s1", 0755); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if fd, err := os.Create("s1/.stfolder"); err != nil {
|
|
t.Fatal(err)
|
|
} else {
|
|
fd.Close()
|
|
}
|
|
|
|
// Reset indexes of an invalid folder
|
|
log.Println("Reset invalid folder")
|
|
_, err = p.Post("/rest/system/reset?folder=invalid", nil)
|
|
if err == nil {
|
|
t.Fatalf("Cannot reset indexes of an invalid folder")
|
|
}
|
|
|
|
// Reset indexes of the default folder
|
|
log.Println("Reset indexes of default folder")
|
|
bs, err := p.Post("/rest/system/reset?folder=default", nil)
|
|
if err != nil && err != io.ErrUnexpectedEOF {
|
|
t.Fatalf("Failed to reset indexes (default): %v (%s)", err, bytes.TrimSpace(bs))
|
|
}
|
|
|
|
// ---- Syncthing exits here ----
|
|
|
|
p = startInstance(t, 1)
|
|
defer p.Stop() // Not checkedStop, because Syncthing will exit on its own
|
|
|
|
m, err = p.Model("default")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
expected = 0
|
|
if m.LocalFiles != expected {
|
|
t.Fatalf("Incorrect number of files after initial scan, %d != %d", m.LocalFiles, expected)
|
|
}
|
|
|
|
// Recreate the files and scan
|
|
log.Println("Creating files...")
|
|
size = createFiles(t)
|
|
|
|
if err := p.Rescan("default"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// Verify that we see them
|
|
m, err = p.Model("default")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
expected = size
|
|
if m.LocalFiles != expected {
|
|
t.Fatalf("Incorrect number of files after second creation phase, %d != %d", m.LocalFiles, expected)
|
|
}
|
|
|
|
// Reset all indexes
|
|
log.Println("Reset DB...")
|
|
bs, err = p.Post("/rest/system/reset", nil)
|
|
if err != nil && err != io.ErrUnexpectedEOF {
|
|
t.Fatalf("Failed to reset indexes (all): %v (%s)", err, bytes.TrimSpace(bs))
|
|
}
|
|
|
|
// ---- Syncthing exits here ----
|
|
|
|
p = startInstance(t, 1)
|
|
defer checkedStop(t, p)
|
|
|
|
m, err = p.Model("default")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
expected = size
|
|
if m.LocalFiles != expected {
|
|
t.Fatalf("Incorrect number of files after initial scan, %d != %d", m.LocalFiles, expected)
|
|
}
|
|
}
|
|
|
|
func createFiles(t *testing.T) int {
|
|
// Create a few files
|
|
|
|
const n = 8
|
|
for i := 0; i < n; i++ {
|
|
file := fmt.Sprintf("f%d", i)
|
|
if err := ioutil.WriteFile(filepath.Join("s1", file), []byte("data"), 0644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
return n
|
|
}
|