Check more error codes when writing microdescriptors.

Possible partial fix, or diagnosis tool, for bug 8031.
This commit is contained in:
Nick Mathewson 2013-03-11 14:50:41 -04:00
parent d54ccbe9fd
commit 6905c1f60d
2 changed files with 21 additions and 4 deletions

7
changes/bug8031 Normal file
View File

@ -0,0 +1,7 @@
o Minor bugfixes:
- Use direct writes rather than stdio when building microdescriptor
caches, in an attempt to mitigate bug 8031, or at least make it
less common.
- Warn more aggressively when flushing microdescriptors to a
microdescriptor cache fails, in an attempt to mitegate bug 8031,
or at least make it more diagnosable.

View File

@ -251,8 +251,14 @@ microdescs_add_list_to_cache(microdesc_cache_t *cache,
cache->total_len_seen += md->bodylen;
} SMARTLIST_FOREACH_END(md);
if (fd >= 0)
finish_writing_to_file(open_file); /*XXX Check me.*/
if (fd >= 0) {
if (finish_writing_to_file(open_file) < 0) {
log_warn(LD_DIR, "Error appending to microdescriptor file: %s",
strerror(errno));
smartlist_clear(added);
return added;
}
}
{
networkstatus_t *ns = networkstatus_get_latest_consensus();
@ -459,11 +465,15 @@ microdesc_cache_rebuild(microdesc_cache_t *cache, int force)
smartlist_add(wrote, md);
}
if (finish_writing_to_file(open_file) < 0) {
log_warn(LD_DIR, "Error rebuilding microdescriptor cache: %s",
strerror(errno));
return -1;
}
if (cache->cache_content)
tor_munmap_file(cache->cache_content);
finish_writing_to_file(open_file); /*XXX Check me.*/
cache->cache_content = tor_mmap_file(cache->cache_fname);
if (!cache->cache_content && smartlist_len(wrote)) {