chore(db): use pseudo random naming for folder databases

This commit is contained in:
Jakob Borg
2025-04-07 11:35:31 +02:00
parent 05210d0325
commit d5aa991b73
4 changed files with 30 additions and 17 deletions
-2
View File
@@ -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)
+25 -14
View File
@@ -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
@@ -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
;