chore(db): use pseudo random naming for folder databases
This commit is contained in:
@@ -199,11 +199,9 @@ nextScript:
|
|||||||
for _, scr := range scripts {
|
for _, scr := range scripts {
|
||||||
for _, fn := range filter {
|
for _, fn := range filter {
|
||||||
if !fn(scr) {
|
if !fn(scr) {
|
||||||
l.Debugln(s.baseName, "skipping script", scr)
|
|
||||||
continue nextScript
|
continue nextScript
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
l.Debugln(s.baseName, "executing script", scr)
|
|
||||||
bs, err := fs.ReadFile(embedded, scr)
|
bs, err := fs.ReadFile(embedded, scr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return wrap(err, scr)
|
return wrap(err, scr)
|
||||||
|
|||||||
@@ -12,12 +12,14 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"iter"
|
"iter"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/syncthing/syncthing/internal/db"
|
"github.com/syncthing/syncthing/internal/db"
|
||||||
"github.com/syncthing/syncthing/internal/itererr"
|
"github.com/syncthing/syncthing/internal/itererr"
|
||||||
"github.com/syncthing/syncthing/lib/config"
|
"github.com/syncthing/syncthing/lib/config"
|
||||||
"github.com/syncthing/syncthing/lib/protocol"
|
"github.com/syncthing/syncthing/lib/protocol"
|
||||||
|
"github.com/syncthing/syncthing/lib/rand"
|
||||||
)
|
)
|
||||||
|
|
||||||
var errNoSuchFolder = errors.New("no such folder")
|
var errNoSuchFolder = errors.New("no such folder")
|
||||||
@@ -31,16 +33,16 @@ func (s *DB) getFolderDB(folder string, create bool) (*folderDB, error) {
|
|||||||
return fdb, nil
|
return fdb, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for an existing folder. If we're not supposed to create the
|
// Check for an existing database. If we're not supposed to create the
|
||||||
// folder, we don't move on if it doesn't already have an ID.
|
// folder, we don't move on if it doesn't already have a database name.
|
||||||
var idx int64
|
var dbName string
|
||||||
if err := s.stmt(`
|
if err := s.stmt(`
|
||||||
SELECT idx FROM folders
|
SELECT database_name FROM folders
|
||||||
WHERE folder_id = ?
|
WHERE folder_id = ?
|
||||||
`).Get(&idx, folder); err != nil && !errors.Is(err, sql.ErrNoRows) {
|
`).Get(&dbName, folder); err != nil && !errors.Is(err, sql.ErrNoRows) {
|
||||||
return nil, wrap(err)
|
return nil, wrap(err)
|
||||||
}
|
}
|
||||||
if idx == 0 && !create {
|
if dbName == "" && !create {
|
||||||
return nil, errNoSuchFolder
|
return nil, errNoSuchFolder
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -51,21 +53,30 @@ func (s *DB) getFolderDB(folder string, create bool) (*folderDB, error) {
|
|||||||
return fdb, nil
|
return fdb, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var err error
|
if dbName == "" {
|
||||||
if idx == 0 {
|
|
||||||
// First time we want to access this folder, need to create a new
|
// First time we want to access this folder, need to create a new
|
||||||
// folder ID
|
// folder ID
|
||||||
idx, err = s.folderIdxLocked(folder)
|
idx, err := s.folderIdxLocked(folder)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, wrap(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// The database name is the folder index ID and a random slug.
|
||||||
|
slug := strings.ToLower(rand.String(8))
|
||||||
|
dbName = fmt.Sprintf("folder.%04x-%s.db", idx, slug)
|
||||||
|
if _, err := s.stmt(`UPDATE folders SET database_name = ? WHERE idx = ?`).Exec(dbName, idx); err != nil {
|
||||||
|
return nil, wrap(err, "set name")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
name := fmt.Sprintf("folder.%04x.db", idx)
|
l.Debugf("Folder %s in database %s", folder, dbName)
|
||||||
path := filepath.Join(s.pathBase, name)
|
path := dbName
|
||||||
fdb, err = s.folderDBOpener(folder, path, s.deleteRetention)
|
if !filepath.IsAbs(path) {
|
||||||
|
path = filepath.Join(s.pathBase, dbName)
|
||||||
|
}
|
||||||
|
fdb, err := s.folderDBOpener(folder, path, s.deleteRetention)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, wrap(err)
|
||||||
}
|
}
|
||||||
s.folderDBs[folder] = fdb
|
s.folderDBs[folder] = fdb
|
||||||
return fdb, nil
|
return fdb, nil
|
||||||
|
|||||||
+5
-1
@@ -7,6 +7,10 @@
|
|||||||
-- folders map folder IDs as used by Syncthing to database folder indexes
|
-- folders map folder IDs as used by Syncthing to database folder indexes
|
||||||
CREATE TABLE IF NOT EXISTS folders (
|
CREATE TABLE IF NOT EXISTS folders (
|
||||||
idx INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
idx INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
||||||
folder_id TEXT NOT NULL UNIQUE COLLATE BINARY
|
folder_id TEXT NOT NULL UNIQUE COLLATE BINARY,
|
||||||
|
database_name TEXT COLLATE BINARY -- initially null
|
||||||
) STRICT
|
) STRICT
|
||||||
;
|
;
|
||||||
|
-- The database_name is unique, when set
|
||||||
|
CREATE INDEX IF NOT EXISTS folders_database_name ON folders (database_name) WHERE database_name IS NOT NULL
|
||||||
|
;
|
||||||
Reference in New Issue
Block a user