- Notifications
You must be signed in to change notification settings - Fork0
Safely write and update important files on the disk
License
robojones/safe-write
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
safe-write provides methods to manage critical files where it is important that they are either completelywritten to the disk or not at all. If the process is unexpectedly interrupted while updating the contents of a file, the original version of the file remains untouched.
package mainimport ("fmt""github.com/robojones/safe-write")funcmain() {data:= []byte("{\"data\":\"some important data\" }")safe.WriteFile("config.json",data)got,_:=safe.ReadFile("config.json")fmt.Printf("The data is: %s",string(got))safe.RemoveFile("config.json")}
TL;DR: When overwriting files, theWriteFile
method uses hard links and temporary files to ensure that there is always a consistent version of your file on the disk.
Lets assume we are using theWriteFile
method to create a file calledconfig.json
. The write procedure is as follows.
- Write the contents of the file to a temporary file (e.g.
config.json.2020-01-02T15-04-05.000000
) - Create a hard link from
config.json.1
to the temporary file - Create a hard link from
config.json
to the temporary file - Remove the temporary file. Because we are using hard links, the contents of the file are still available using the file names
config.json
andconfig.json.1
The reason why the intermediate linkconfig.json.1
is created becomes clear when we overwrite the contents of the file. Again, we are using theWriteFile
method.
- Write the updated contents of the file to a new temporary file (e.g.
config.json.2020-02-01T10-03-08.004001
) - Remove the previous hard link
config.json.1
- Create a new hard link from
config.json.1
to our new temporary file - Remove the previous hard link
config.json
- Create a new hard link from
config.json
to the new temporary file - Remove the temporary file
The intermediate linkconfig.json.1
is created so there is always one of our linksconfig.json
orconfig.json.1
pointing to a complete version of our config file.Even if our process is interrupted by a server crash, at any point of the overwrite process,there is always eitherconfig.json
orconfig.json.1
safely written on the disk.
TheReadFile
method of this module always checks for both links, so even if theconfig.json
link is missing,there is a valid file available viaconfig.json.1
.
About
Safely write and update important files on the disk