mirror of https://github.com/minio/minio.git
				
				
				
			fs: use new atomic package - use FileCreateWithPrefix() API
This commit is contained in:
		
							parent
							
								
									26f83f108a
								
							
						
					
					
						commit
						35b9f965f1
					
				|  | @ -276,7 +276,7 @@ func (fs Filesystem) CreateObjectPart(bucket, object, uploadID, expectedMD5Sum s | ||||||
| 
 | 
 | ||||||
| 	objectPath := filepath.Join(bucketPath, object) | 	objectPath := filepath.Join(bucketPath, object) | ||||||
| 	partPath := objectPath + fmt.Sprintf("$%d", partID) | 	partPath := objectPath + fmt.Sprintf("$%d", partID) | ||||||
| 	partFile, err := atomic.FileCreate(partPath) | 	partFile, err := atomic.FileCreateWithPrefix(partPath, "") | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return "", probe.NewError(err) | 		return "", probe.NewError(err) | ||||||
| 	} | 	} | ||||||
|  | @ -307,7 +307,6 @@ func (fs Filesystem) CreateObjectPart(bucket, object, uploadID, expectedMD5Sum s | ||||||
| 			return "", probe.NewError(SignatureDoesNotMatch{}) | 			return "", probe.NewError(SignatureDoesNotMatch{}) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	partFile.File.Sync() |  | ||||||
| 	partFile.Close() | 	partFile.Close() | ||||||
| 
 | 
 | ||||||
| 	fi, err := os.Stat(partPath) | 	fi, err := os.Stat(partPath) | ||||||
|  | @ -374,7 +373,7 @@ func (fs Filesystem) CompleteMultipartUpload(bucket, object, uploadID string, da | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	objectPath := filepath.Join(bucketPath, object) | 	objectPath := filepath.Join(bucketPath, object) | ||||||
| 	file, err := atomic.FileCreate(objectPath) | 	file, err := atomic.FileCreateWithPrefix(objectPath, "") | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return ObjectMetadata{}, probe.NewError(err) | 		return ObjectMetadata{}, probe.NewError(err) | ||||||
| 	} | 	} | ||||||
|  | @ -430,7 +429,6 @@ func (fs Filesystem) CompleteMultipartUpload(bucket, object, uploadID string, da | ||||||
| 		file.CloseAndPurge() | 		file.CloseAndPurge() | ||||||
| 		return ObjectMetadata{}, err.Trace() | 		return ObjectMetadata{}, err.Trace() | ||||||
| 	} | 	} | ||||||
| 	file.File.Sync() |  | ||||||
| 	file.Close() | 	file.Close() | ||||||
| 
 | 
 | ||||||
| 	st, err := os.Stat(objectPath) | 	st, err := os.Stat(objectPath) | ||||||
|  |  | ||||||
|  | @ -207,7 +207,7 @@ func (fs Filesystem) CreateObject(bucket, object, expectedMD5Sum string, size in | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// write object
 | 	// write object
 | ||||||
| 	file, err := atomic.FileCreate(objectPath) | 	file, err := atomic.FileCreateWithPrefix(objectPath, "") | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return ObjectMetadata{}, probe.NewError(err) | 		return ObjectMetadata{}, probe.NewError(err) | ||||||
| 	} | 	} | ||||||
|  | @ -250,7 +250,6 @@ func (fs Filesystem) CreateObject(bucket, object, expectedMD5Sum string, size in | ||||||
| 			return ObjectMetadata{}, probe.NewError(SignatureDoesNotMatch{}) | 			return ObjectMetadata{}, probe.NewError(SignatureDoesNotMatch{}) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	file.File.Sync() |  | ||||||
| 	file.Close() | 	file.Close() | ||||||
| 
 | 
 | ||||||
| 	st, err := os.Stat(objectPath) | 	st, err := os.Stat(objectPath) | ||||||
|  |  | ||||||
|  | @ -33,6 +33,11 @@ type File struct { | ||||||
| 
 | 
 | ||||||
| // Close the file replacing, returns an error if any
 | // Close the file replacing, returns an error if any
 | ||||||
| func (f *File) Close() error { | func (f *File) Close() error { | ||||||
|  | 	// sync to the disk
 | ||||||
|  | 	err := f.Sync() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
| 	// close the embedded fd
 | 	// close the embedded fd
 | ||||||
| 	if err := f.File.Close(); err != nil { | 	if err := f.File.Close(); err != nil { | ||||||
| 		return err | 		return err | ||||||
|  | @ -58,12 +63,18 @@ func (f *File) CloseAndPurge() error { | ||||||
| 
 | 
 | ||||||
| // FileCreate creates a new file at filePath for atomic writes, it also creates parent directories if they don't exist
 | // FileCreate creates a new file at filePath for atomic writes, it also creates parent directories if they don't exist
 | ||||||
| func FileCreate(filePath string) (*File, error) { | func FileCreate(filePath string) (*File, error) { | ||||||
|  | 	return FileCreateWithPrefix(filePath, "$deleteme.") | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // FileCreateWithPrefix creates a new file at filePath for atomic writes, it also creates parent directories if they don't exist
 | ||||||
|  | // prefix specifies the prefix of the temporary files so that cleaning stale temp files is easy
 | ||||||
|  | func FileCreateWithPrefix(filePath string, prefix string) (*File, error) { | ||||||
| 	// if parent directories do not exist, ioutil.TempFile doesn't create them
 | 	// if parent directories do not exist, ioutil.TempFile doesn't create them
 | ||||||
| 	// handle such a case with os.MkdirAll()
 | 	// handle such a case with os.MkdirAll()
 | ||||||
| 	if err := os.MkdirAll(filepath.Dir(filePath), 0700); err != nil { | 	if err := os.MkdirAll(filepath.Dir(filePath), 0700); err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	f, err := ioutil.TempFile(filepath.Dir(filePath), filepath.Base(filePath)) | 	f, err := ioutil.TempFile(filepath.Dir(filePath), prefix+filepath.Base(filePath)) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -30,6 +30,7 @@ import ( | ||||||
| 	"sync" | 	"sync" | ||||||
| 
 | 
 | ||||||
| 	"github.com/fatih/structs" | 	"github.com/fatih/structs" | ||||||
|  | 	"github.com/minio/minio-xl/pkg/atomic" | ||||||
| 	"github.com/minio/minio-xl/pkg/probe" | 	"github.com/minio/minio-xl/pkg/probe" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | @ -193,7 +194,15 @@ func (d config) Save(filename string) *probe.Error { | ||||||
| 		jsonData = []byte(strings.Replace(string(jsonData), "\n", "\r\n", -1)) | 		jsonData = []byte(strings.Replace(string(jsonData), "\n", "\r\n", -1)) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	err = ioutil.WriteFile(filename, jsonData, 0600) | 	atomicFile, err := atomic.FileCreate(filename) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return probe.NewError(err) | ||||||
|  | 	} | ||||||
|  | 	_, err = atomicFile.Write(jsonData) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return probe.NewError(err) | ||||||
|  | 	} | ||||||
|  | 	err = atomicFile.Close() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return probe.NewError(err) | 		return probe.NewError(err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -39,8 +39,8 @@ | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			"path": "github.com/minio/minio-xl/pkg/atomic", | 			"path": "github.com/minio/minio-xl/pkg/atomic", | ||||||
| 			"revision": "a5fc6d2430ba2ebcab31b938ab02a42bac85dc2e", | 			"revision": "008404af67dcf66bdde580245cd43951b425ed39", | ||||||
| 			"revisionTime": "2015-10-20T11:16:42-07:00" | 			"revisionTime": "2015-11-17T16:21:42-08:00" | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			"path": "github.com/minio/minio-xl/pkg/cpu", | 			"path": "github.com/minio/minio-xl/pkg/cpu", | ||||||
|  | @ -69,8 +69,8 @@ | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			"path": "github.com/minio/minio-xl/pkg/quick", | 			"path": "github.com/minio/minio-xl/pkg/quick", | ||||||
| 			"revision": "a5fc6d2430ba2ebcab31b938ab02a42bac85dc2e", | 			"revision": "008404af67dcf66bdde580245cd43951b425ed39", | ||||||
| 			"revisionTime": "2015-10-20T11:16:42-07:00" | 			"revisionTime": "2015-11-17T16:21:42-08:00" | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			"path": "github.com/rs/cors", | 			"path": "github.com/rs/cors", | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue