Przeglądaj źródła

fix(sqlite): explicitly set temporary directory location (fixes #10368) (#10376)

On Unixes, avoid the /tmp which is likely to become the chosen default.

Signed-off-by: Jakob Borg <[email protected]>
Jakob Borg 3 miesięcy temu
rodzic
commit
4b8d07d91c
1 zmienionych plików z 26 dodań i 0 usunięć
  1. 26 0
      internal/db/sqlite/db_open.go

+ 26 - 0
internal/db/sqlite/db_open.go

@@ -16,6 +16,7 @@ import (
 
 	"github.com/syncthing/syncthing/internal/db"
 	"github.com/syncthing/syncthing/internal/slogutil"
+	"github.com/syncthing/syncthing/lib/build"
 )
 
 const (
@@ -65,6 +66,8 @@ func Open(path string, opts ...Option) (*DB, error) {
 	}
 
 	_ = os.MkdirAll(path, 0o700)
+	initTmpDir(path)
+
 	mainPath := filepath.Join(path, "main.db")
 	mainBase, err := openBase(mainPath, maxDBConns, pragmas, schemas, migrations)
 	if err != nil {
@@ -114,6 +117,8 @@ func OpenForMigration(path string) (*DB, error) {
 	}
 
 	_ = os.MkdirAll(path, 0o700)
+	initTmpDir(path)
+
 	mainPath := filepath.Join(path, "main.db")
 	mainBase, err := openBase(mainPath, 1, pragmas, schemas, migrations)
 	if err != nil {
@@ -143,3 +148,24 @@ func (s *DB) Close() error {
 	}
 	return wrap(s.baseDB.Close())
 }
+
+func initTmpDir(path string) {
+	if build.IsWindows || build.IsDarwin || os.Getenv("SQLITE_TMPDIR") != "" {
+		// Doesn't use SQLITE_TMPDIR, isn't likely to have a tiny
+		// ram-backed temp directory, or already set to something.
+		return
+	}
+
+	// Attempt to override the SQLite temporary directory by setting the
+	// env var prior to the (first) database being opened and hence
+	// SQLite becoming initialized. We set the temp dir to the same
+	// place we store the database, in the hope that there will be
+	// enough space there for the operations it needs to perform, as
+	// opposed to /tmp and similar, on some systems.
+	dbTmpDir := filepath.Join(path, ".tmp")
+	if err := os.MkdirAll(dbTmpDir, 0o700); err == nil {
+		os.Setenv("SQLITE_TMPDIR", dbTmpDir)
+	} else {
+		slog.Warn("Failed to create temp directory for SQLite", slogutil.FilePath(dbTmpDir), slogutil.Error(err))
+	}
+}