[identity] Improve error handling after fxr/282508
In the few minutes I'd spent this morning I'd checked whether &Write
implmented Write but not whether &mut Write did.
This lets us catch a failure during the flushing of a token database to
disk and avoid overwriting the previous valid copy with one thats
potentially corrupted.
Change-Id: I4ac59c3d3d22b4e053baf0bb43caa9f9320a368a
diff --git a/src/identity/lib/token_store/src/file.rs b/src/identity/lib/token_store/src/file.rs
index a56184c..de464009 100644
--- a/src/identity/lib/token_store/src/file.rs
+++ b/src/identity/lib/token_store/src/file.rs
@@ -9,7 +9,7 @@
use std::collections::BTreeMap;
use std::ffi::OsString;
use std::fs::{self, File};
-use std::io::{BufReader, BufWriter};
+use std::io::{BufReader, BufWriter, Write};
use std::path::{Path, PathBuf};
use std::result;
@@ -71,8 +71,12 @@
// Note that we first write into a temporary staging file then rename to provide atomicity.
// We use a fixed tempfile rather than dynamically generating filenames to ensure we
// never accumulate multiple tempfiles.
- let f = BufWriter::new(Self::truncate_file(&self.tmp_file_path)?);
- self.serializer.serialize(f, self.credentials.values())?;
+ let mut buffer = BufWriter::new(Self::truncate_file(&self.tmp_file_path)?);
+ self.serializer.serialize(&mut buffer, self.credentials.values())?;
+ buffer.flush().map_err(|err| {
+ warn!("AuthDbFile failed to flush serialized file: {:?}", err);
+ AuthDbError::IoError(err)
+ })?;
Self::rename_file(&self.tmp_file_path, &self.file_path)?;
Ok(())
}