Refs #3929 When deleting a segment, IFF we have not yet filled up all reserves, instead of actually deleting the file, put it on a "recycle" list. Next segment allocation will instead of creating a new one simply rename the segment and reuse the file and its allocated space. We rename the file twice: Once on adding to recycle list, with special prefix so we don't mix up actual replayable segments and these. Second when we actually re-use the file (also to ensure consecutive names). Note that we limit the amount of recyclables, so a really stressed application which somehow fills up the replenish queue might cause us to still drop the segments. Could skip this but risk getting to many files on disk. Replay should be safe, since all entries are guarded by CRC based on the file ID (i.e. file name). Thus replaying a recycled segment will simply cause a CRC error in the main header and be ignored (see previous patch). Segments that are fully synced will have terminating zero-header (see previous patch) so we know when to stop processing a recycled file. If a file is the result of a mid-write crash, we will generate a CRC processing error as "normally" in this case, when hitting partially written block or coming to an old/new chunk boundary. v2: * Sync dir on rename * auto -> const sstring& * Allow recycling files as long as we're within disk space limits v3: * Use special names for files waiting for reuse
82 KiB
82 KiB