forked from gcash/neutrino
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
headerfs: on Windows, close/truncate/reopen to avoid access denied
- Loading branch information
Showing
3 changed files
with
89 additions
and
33 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
// +build !windows | ||
|
||
package headerfs | ||
|
||
// singleTruncate truncates a single header from the end of the header file. | ||
// This can be used in the case of a re-org to remove the last header from the | ||
// end of the main chain. | ||
// | ||
// TODO(roasbeef): define this and the two methods above on a headerFile | ||
// struct? | ||
func (h *headerStore) singleTruncate() error { | ||
// In order to truncate the file, we'll need to grab the absolute size | ||
// of the file as it stands currently. | ||
fileInfo, err := h.file.Stat() | ||
if err != nil { | ||
return err | ||
} | ||
fileSize := fileInfo.Size() | ||
|
||
// Next, we'll determine the number of bytes we need to truncate from | ||
// the end of the file. | ||
var truncateLength int64 | ||
switch h.indexType { | ||
case Block: | ||
truncateLength = 80 | ||
case RegularFilter: | ||
fallthrough | ||
case ExtendedFilter: | ||
truncateLength = 32 | ||
} | ||
|
||
// Finally, we'll use both of these values to calculate the new size of | ||
// the file and truncate it accordingly. | ||
newSize := fileSize - truncateLength | ||
return h.file.Truncate(newSize) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
// +build windows | ||
|
||
package headerfs | ||
|
||
import "os" | ||
|
||
// singleTruncate truncates a single header from the end of the header file. | ||
// This can be used in the case of a re-org to remove the last header from the | ||
// end of the main chain. | ||
// | ||
// TODO(roasbeef): define this and the two methods above on a headerFile | ||
// struct? | ||
func (h *headerStore) singleTruncate() error { | ||
// In order to truncate the file, we'll need to grab the absolute size | ||
// of the file as it stands currently. | ||
fileInfo, err := h.file.Stat() | ||
if err != nil { | ||
return err | ||
} | ||
fileSize := fileInfo.Size() | ||
|
||
// Next, we'll determine the number of bytes we need to truncate from | ||
// the end of the file. | ||
var truncateLength int64 | ||
switch h.indexType { | ||
case Block: | ||
truncateLength = 80 | ||
case RegularFilter: | ||
fallthrough | ||
case ExtendedFilter: | ||
truncateLength = 32 | ||
} | ||
|
||
// Finally, we'll use both of these values to calculate the new size of | ||
// the file. | ||
newSize := fileSize - truncateLength | ||
|
||
// On Windows, a file can't be truncated while open, even if using a | ||
// file handle to truncate it. This means we have to close, truncate, | ||
// and reopen it. | ||
fileName := h.file.Name() | ||
if err = h.file.Close(); err != nil { | ||
return err | ||
} | ||
|
||
if err = os.Truncate(fileName, newSize); err != nil { | ||
return err | ||
} | ||
|
||
fileFlags := os.O_RDWR | os.O_APPEND | os.O_CREATE | ||
h.file, err = os.OpenFile(fileName, fileFlags, 0644) | ||
return err | ||
} |