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:
Aaron Son
2023-11-09 14:35:28 -08:00
parent 2c46fdc5f0
commit 41bcbb93f7
13 changed files with 27 additions and 35 deletions

View File

@@ -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)

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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 {

View File

@@ -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{}

View File

@@ -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

View File

@@ -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{

View File

@@ -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)
}
}

View File

@@ -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

View File

@@ -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

View File

@@ -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)
}

View File

@@ -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

View File

@@ -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