mirror of
https://github.com/dolthub/dolt.git
synced 2026-01-08 16:16:45 -06:00
go: filesys: Take a FileMode on WriteFile. Fix sql-server.lock file handling to not leak file handles and keep correct perms when creating the file.
This commit is contained in:
@@ -113,7 +113,7 @@ listener:
|
||||
serverController := NewServerController()
|
||||
go func() {
|
||||
|
||||
dEnv.FS.WriteFile("config.yaml", []byte(yamlConfig))
|
||||
dEnv.FS.WriteFile("config.yaml", []byte(yamlConfig), os.ModePerm)
|
||||
startServer(context.Background(), "0.0.0", "dolt sql-server", []string{
|
||||
"--config", "config.yaml",
|
||||
}, dEnv, serverController)
|
||||
|
||||
@@ -210,7 +210,7 @@ func (controller *Controller) SaveData(ctx context.Context, fs filesys.Filesys)
|
||||
b.FinishWithFileIdentifier(root, []byte(serial.BranchControlFileID))
|
||||
data := b.Bytes[b.Head()-serial.MessagePrefixSz:]
|
||||
|
||||
err := fs.WriteFile(controller.branchControlFilePath, data)
|
||||
err := fs.WriteFile(controller.branchControlFilePath, data, 0660)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
14
go/libraries/doltcore/env/environment.go
vendored
14
go/libraries/doltcore/env/environment.go
vendored
@@ -20,7 +20,6 @@ import (
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"reflect"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
@@ -1291,18 +1290,7 @@ func WriteLockfile(fs filesys.Filesys, lock *DBLock) error {
|
||||
portStr = "-"
|
||||
}
|
||||
|
||||
if reflect.TypeOf(fs) == reflect.TypeOf(filesys.LocalFS) {
|
||||
_, err := os.Create(lockFile)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = os.Chmod(lockFile, 0600)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
err = fs.WriteFile(lockFile, []byte(fmt.Sprintf("%d:%s:%s", lock.Pid, portStr, lock.Secret)))
|
||||
err = fs.WriteFile(lockFile, []byte(fmt.Sprintf("%d:%s:%s", lock.Pid, portStr, lock.Secret)), 0600)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
5
go/libraries/doltcore/env/repo_state.go
vendored
5
go/libraries/doltcore/env/repo_state.go
vendored
@@ -17,6 +17,7 @@ package env
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"os"
|
||||
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/ref"
|
||||
@@ -127,7 +128,7 @@ func (rs *repoStateLegacy) save(fs filesys.ReadWriteFS) error {
|
||||
return err
|
||||
}
|
||||
|
||||
return fs.WriteFile(getRepoStateFile(), data)
|
||||
return fs.WriteFile(getRepoStateFile(), data, os.ModePerm)
|
||||
}
|
||||
|
||||
// LoadRepoState parses the repo state file from the file system given
|
||||
@@ -199,7 +200,7 @@ func (rs RepoState) Save(fs filesys.ReadWriteFS) error {
|
||||
return err
|
||||
}
|
||||
|
||||
return fs.WriteFile(getRepoStateFile(), data)
|
||||
return fs.WriteFile(getRepoStateFile(), data, os.ModePerm)
|
||||
}
|
||||
|
||||
func (rs *RepoState) CWBHeadRef() ref.DoltRef {
|
||||
|
||||
@@ -59,7 +59,7 @@ func createRootAndFS() (*doltdb.DoltDB, *doltdb.RootValue, filesys.Filesys) {
|
||||
workingDir := "/user/bheni/datasets/states"
|
||||
initialDirs := []string{testHomeDir, workingDir}
|
||||
fs := filesys.NewInMemFS(initialDirs, nil, workingDir)
|
||||
fs.WriteFile(testSchemaFileName, []byte(testSchema))
|
||||
fs.WriteFile(testSchemaFileName, []byte(testSchema), os.ModePerm)
|
||||
ddb, _ := doltdb.LoadDoltDB(context.Background(), types.Format_Default, doltdb.InMemDoltDB, filesys.LocalFS)
|
||||
ddb.WriteEmptyRepo(context.Background(), "master", "billy bob", "bigbillieb@fake.horse")
|
||||
|
||||
@@ -146,7 +146,7 @@ func TestExists(t *testing.T) {
|
||||
}
|
||||
|
||||
if fileVal, isFile := loc.(FileDataLocation); isFile {
|
||||
err := fs.WriteFile(fileVal.Path, []byte("test"))
|
||||
err := fs.WriteFile(fileVal.Path, []byte("test"), os.ModePerm)
|
||||
assert.NoError(t, err)
|
||||
}
|
||||
|
||||
@@ -197,7 +197,7 @@ func TestCreateRdWr(t *testing.T) {
|
||||
defer dEnv.DoltDB.Close()
|
||||
root, err := dEnv.WorkingRoot(context.Background())
|
||||
require.NoError(t, err)
|
||||
dEnv.FS.WriteFile(testSchemaFileName, []byte(testSchema))
|
||||
dEnv.FS.WriteFile(testSchemaFileName, []byte(testSchema), os.ModePerm)
|
||||
|
||||
mvOpts := &testDataMoverOptions{}
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
package rowconv
|
||||
|
||||
import (
|
||||
"os"
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
@@ -78,7 +79,7 @@ func TestFieldMapping(t *testing.T) {
|
||||
mappingFile := ""
|
||||
if test.mappingJSON != "" {
|
||||
mappingFile = "mapping.json"
|
||||
fs.WriteFile(mappingFile, []byte(test.mappingJSON))
|
||||
fs.WriteFile(mappingFile, []byte(test.mappingJSON), os.ModePerm)
|
||||
}
|
||||
|
||||
var mapping *FieldMapping
|
||||
|
||||
@@ -17,6 +17,7 @@ package json
|
||||
import (
|
||||
"context"
|
||||
"io"
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"github.com/dolthub/go-mysql-server/enginetest"
|
||||
@@ -49,7 +50,7 @@ func TestReader(t *testing.T) {
|
||||
}`
|
||||
|
||||
fs := filesys.EmptyInMemFS("/")
|
||||
require.NoError(t, fs.WriteFile("file.json", []byte(testJSON)))
|
||||
require.NoError(t, fs.WriteFile("file.json", []byte(testJSON), os.ModePerm))
|
||||
|
||||
colColl := schema.NewColCollection(
|
||||
schema.Column{
|
||||
@@ -132,7 +133,7 @@ func TestReaderBadJson(t *testing.T) {
|
||||
}`
|
||||
|
||||
fs := filesys.EmptyInMemFS("/")
|
||||
require.NoError(t, fs.WriteFile("file.json", []byte(testJSON)))
|
||||
require.NoError(t, fs.WriteFile("file.json", []byte(testJSON), os.ModePerm))
|
||||
|
||||
colColl := schema.NewColCollection(
|
||||
schema.Column{
|
||||
|
||||
@@ -134,7 +134,7 @@ func NewFileBackedProc(fs filesys.Filesys, userHomeDir string, doltDir string, n
|
||||
exists, _ := fs.Exists(lp)
|
||||
|
||||
if !exists {
|
||||
if err := fs.WriteFile(lp, []byte("lockfile for dolt \n")); err != nil {
|
||||
if err := fs.WriteFile(lp, []byte("lockfile for dolt \n"), os.ModePerm); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ package config
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/dolthub/dolt/go/libraries/utils/filesys"
|
||||
@@ -128,7 +129,7 @@ func (fc *FileConfig) write() error {
|
||||
return err
|
||||
}
|
||||
|
||||
return fc.fs.WriteFile(fc.Path, data)
|
||||
return fc.fs.WriteFile(fc.Path, data, os.ModePerm)
|
||||
}
|
||||
|
||||
// Unset removes a configuration parameter from the config
|
||||
|
||||
@@ -55,9 +55,9 @@ type WritableFS interface {
|
||||
// append only to that new file. If file exists, it will append to existing file.
|
||||
OpenForWriteAppend(fp string, perm os.FileMode) (io.WriteCloser, error)
|
||||
|
||||
// WriteFile writes the entire data buffer to a given file. The file will be created if it does not exist,
|
||||
// WriteFileWithPerms writes the entire data buffer to a given file. The file will be created if it does not exist,
|
||||
// and if it does exist it will be overwritten. WriteFile attempts to write the file atomically and durably.
|
||||
WriteFile(fp string, data []byte) error
|
||||
WriteFile(fp string, data []byte, perm os.FileMode) error
|
||||
|
||||
// MkDirs creates a folder and all the parent folders that are necessary to create it.
|
||||
MkDirs(path string) error
|
||||
|
||||
@@ -87,7 +87,7 @@ func TestFilesystems(t *testing.T) {
|
||||
data := test.RandomData(256 * 1024)
|
||||
|
||||
// Test writing file with random data
|
||||
err = fs.WriteFile(fp, data)
|
||||
err = fs.WriteFile(fp, data, os.ModePerm)
|
||||
require.NoError(t, err)
|
||||
|
||||
// Test that the data can be read back and hasn't changed
|
||||
@@ -121,7 +121,7 @@ func TestFilesystems(t *testing.T) {
|
||||
require.NoError(t, wrc.Close())
|
||||
|
||||
// Test moving a directory
|
||||
err = fs.WriteFile(subdirFile, []byte("helloworld"))
|
||||
err = fs.WriteFile(subdirFile, []byte("helloworld"), os.ModePerm)
|
||||
require.NoError(t, err)
|
||||
err = fs.MkDirs(newLocation)
|
||||
require.NoError(t, err)
|
||||
@@ -147,7 +147,7 @@ func TestFilesystems(t *testing.T) {
|
||||
require.False(t, isDir)
|
||||
|
||||
// Test writing/reading random data to tmp file
|
||||
err = fs.WriteFile(fp2, data)
|
||||
err = fs.WriteFile(fp2, data, os.ModePerm)
|
||||
require.NoError(t, err)
|
||||
dataRead, err = fs.ReadFile(fp2)
|
||||
require.NoError(t, err)
|
||||
@@ -318,7 +318,7 @@ func writeFileAddToExp(expected []string, fs Filesys, root string, pathFromRoot
|
||||
pathElements := append([]string{root}, pathFromRoot...)
|
||||
|
||||
fp := filepath.Join(pathElements...)
|
||||
fs.WriteFile(fp, []byte(testString))
|
||||
fs.WriteFile(fp, []byte(testString), os.ModePerm)
|
||||
return append(expected, fp)
|
||||
}
|
||||
|
||||
|
||||
@@ -360,8 +360,8 @@ func (fs *InMemFS) OpenForWriteAppend(fp string, perm os.FileMode) (io.WriteClos
|
||||
|
||||
// WriteFile writes the entire data buffer to a given file. The file will be created if it does not exist,
|
||||
// and if it does exist it will be overwritten.
|
||||
func (fs *InMemFS) WriteFile(fp string, data []byte) error {
|
||||
w, err := fs.OpenForWrite(fp, os.ModePerm)
|
||||
func (fs *InMemFS) WriteFile(fp string, data []byte, perm os.FileMode) error {
|
||||
w, err := fs.OpenForWrite(fp, perm)
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
|
||||
@@ -204,7 +204,7 @@ func (fs *localFS) OpenForWriteAppend(fp string, perm os.FileMode) (io.WriteClos
|
||||
|
||||
// WriteFile writes the entire data buffer to a given file. The file will be created if it does not exist,
|
||||
// and if it does exist it will be overwritten.
|
||||
func (fs *localFS) WriteFile(fp string, data []byte) error {
|
||||
func (fs *localFS) WriteFile(fp string, data []byte, perms os.FileMode) error {
|
||||
fullpath, err := fs.Abs(fp)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -236,7 +236,7 @@ func (fs *localFS) WriteFile(fp string, data []byte) error {
|
||||
return err
|
||||
}
|
||||
|
||||
err = os.Chmod(f.Name(), os.ModePerm)
|
||||
err = os.Chmod(f.Name(), perms)
|
||||
if err != nil {
|
||||
os.Remove(f.Name())
|
||||
return err
|
||||
|
||||
Reference in New Issue
Block a user