mirror of
https://blitiri.com.ar/repos/chasquid
synced 2025-12-19 14:57:04 +00:00
queue: Sync the files written on Put
When we put something in the queue and respond "250 ok" to the client, that is taken as accepting the email. As part of putting something in the queue, we write it to disk, but today we don't do an fsync on that file. That leaves a gap where a badly timed crash on some systems could lead to the file being empty, causing us to lose an email that we accepted. To elliminate (or drastically reduce on some filesystems) the chances of that situation, we call fsync on the file that gets written when we put something in the queue. Thanks to nolanl@github for reporting this in https://github.com/albertito/chasquid/issues/78.
This commit is contained in:
@@ -25,6 +25,7 @@ import (
|
||||
"blitiri.com.ar/go/chasquid/internal/expvarom"
|
||||
"blitiri.com.ar/go/chasquid/internal/maillog"
|
||||
"blitiri.com.ar/go/chasquid/internal/protoio"
|
||||
"blitiri.com.ar/go/chasquid/internal/safeio"
|
||||
"blitiri.com.ar/go/chasquid/internal/set"
|
||||
"blitiri.com.ar/go/chasquid/internal/trace"
|
||||
"blitiri.com.ar/go/log"
|
||||
@@ -306,7 +307,10 @@ func (item *Item) WriteTo(dir string) error {
|
||||
|
||||
path := fmt.Sprintf("%s/%s%s", dir, itemFilePrefix, item.ID)
|
||||
|
||||
return protoio.WriteTextMessage(path, &item.Message, 0600)
|
||||
// Write the file in text format for ease of debugging, and use fsync to
|
||||
// improve durability.
|
||||
return protoio.WriteTextMessage(
|
||||
path, &item.Message, 0600, safeio.FsyncFileOp)
|
||||
}
|
||||
|
||||
// SendLoop repeatedly attempts to send the item.
|
||||
|
||||
Reference in New Issue
Block a user