/* * __wt_block_salvage_start -- * Start a file salvage. */ int __wt_block_salvage_start(WT_SESSION_IMPL *session, WT_BLOCK *block) { off_t len; uint32_t allocsize; /* Reset the description sector. */ WT_RET(__wt_desc_init(session, block->fh)); /* * Salvage creates a new snapshot when it's finished, set up for * rolling an empty file forward. */ WT_RET(__wt_block_snap_init(session, block, &block->live, "live", 1)); /* * Truncate the file to an initial sector plus N allocation size * units (bytes trailing the last multiple of an allocation size * unit must be garbage, by definition). */ if (block->fh->file_size > WT_BLOCK_DESC_SECTOR) { allocsize = block->allocsize; len = block->fh->file_size - WT_BLOCK_DESC_SECTOR; len = (len / allocsize) * allocsize; len += WT_BLOCK_DESC_SECTOR; if (len != block->fh->file_size) WT_RET(__wt_ftruncate(session, block->fh, len)); } else len = WT_BLOCK_DESC_SECTOR; /* * The first sector of the file is the description record, skip it as * we read the file. */ block->slvg_off = WT_BLOCK_DESC_SECTOR; /* * The only snapshot extent we care about is the allocation list. Start * with the entire file on the allocation list, we'll "free" any blocks * we don't want as we process the file. */ WT_RET(__wt_block_insert_ext(session, &block->live.alloc, WT_BLOCK_DESC_SECTOR, len - WT_BLOCK_DESC_SECTOR)); block->slvg = 1; return (0); }
/* * __wt_block_salvage_start -- * Start a file salvage. */ int __wt_block_salvage_start(WT_SESSION_IMPL *session, WT_BLOCK *block) { off_t len; uint32_t allocsize; allocsize = block->allocsize; /* Reset the description information in the first block. */ WT_RET(__wt_desc_init(session, block->fh, allocsize)); /* * Salvage creates a new checkpoint when it's finished, set up for * rolling an empty file forward. */ WT_RET(__wt_block_ckpt_init(session, &block->live, "live")); /* * Truncate the file to an allocation-size multiple of blocks (bytes * trailing the last block must be garbage, by definition). */ if (block->fh->size > allocsize) { len = (block->fh->size / allocsize) * allocsize; if (len != block->fh->size) WT_RET(__wt_ftruncate(session, block->fh, len)); } else len = allocsize; block->live.file_size = len; /* * The file's first allocation-sized block is description information, * skip it when reading through the file. */ block->slvg_off = allocsize; /* * The only checkpoint extent we care about is the allocation list. * Start with the entire file on the allocation list, we'll "free" * any blocks we don't want as we process the file. */ WT_RET(__wt_block_insert_ext( session, block, &block->live.alloc, allocsize, len - allocsize)); return (0); }
/* * __wt_block_manager_truncate -- * Truncate a file. */ int __wt_block_manager_truncate( WT_SESSION_IMPL *session, const char *filename, uint32_t allocsize) { WT_DECL_RET; WT_FH *fh; /* Open the underlying file handle. */ WT_RET(__wt_open(session, filename, 0, 0, WT_FILE_TYPE_DATA, &fh)); /* Truncate the file. */ WT_ERR(__wt_ftruncate(session, fh, (off_t)0)); /* Write out the file's meta-data. */ ret = __wt_desc_init(session, fh, allocsize); /* Close the file handle. */ err: WT_TRET(__wt_close(session, fh)); return (ret); }
/* * __wt_block_manager_create -- * Create a file. */ int __wt_block_manager_create( WT_SESSION_IMPL *session, const char *filename, uint32_t allocsize) { WT_DECL_RET; WT_FH *fh; /* Create the underlying file and open a handle. */ WT_RET(__wt_open(session, filename, 1, 1, WT_FILE_TYPE_DATA, &fh)); /* Write out the file's meta-data. */ ret = __wt_desc_init(session, fh, allocsize); /* Close the file handle. */ WT_TRET(__wt_close(session, fh)); /* Undo any create on error. */ if (ret != 0) WT_TRET(__wt_remove(session, filename)); return (ret); }