/* * __wt_block_checkpoint -- * Create a new checkpoint. */ int __wt_block_checkpoint(WT_SESSION_IMPL *session, WT_BLOCK *block, WT_ITEM *buf, WT_CKPT *ckptbase, bool data_checksum) { WT_BLOCK_CKPT *ci; WT_DECL_RET; ci = &block->live; /* Switch to first-fit allocation. */ __wt_block_configure_first_fit(block, true); /* * Write the root page: it's possible for there to be a checkpoint of * an empty tree, in which case, we store an illegal root offset. * * !!! * We happen to know that checkpoints are single-threaded above us in * the btree engine. That's probably something we want to guarantee * for any WiredTiger block manager. */ if (buf == NULL) { ci->root_offset = WT_BLOCK_INVALID_OFFSET; ci->root_size = ci->root_checksum = 0; } else WT_ERR(__wt_block_write_off(session, block, buf, &ci->root_offset, &ci->root_size, &ci->root_checksum, data_checksum, true, false)); /* * Checkpoints are potentially reading/writing/merging lots of blocks, * pre-allocate structures for this thread's use. */ WT_ERR(__wt_block_ext_prealloc(session, 250)); /* Process the checkpoint list, deleting and updating as required. */ ret = __ckpt_process(session, block, ckptbase); /* Discard any excessive memory we've allocated. */ WT_TRET(__wt_block_ext_discard(session, 250)); /* Restore the original allocation plan. */ err: __wt_block_configure_first_fit(block, false); return (ret); }
/* * __wt_block_checkpoint -- * Create a new checkpoint. */ int __wt_block_checkpoint(WT_SESSION_IMPL *session, WT_BLOCK *block, WT_ITEM *buf, WT_CKPT *ckptbase) { WT_BLOCK_CKPT *ci; ci = &block->live; ci->version = WT_BM_CHECKPOINT_VERSION; /* * Write the root page: it's possible for there to be a checkpoint of * an empty tree, in which case, we store an illegal root offset. * * XXX * We happen to know that checkpoints are single-threaded above us in * the btree engine. That's probably something we want to guarantee * for any WiredTiger block manager. */ if (buf == NULL) { ci->root_offset = WT_BLOCK_INVALID_OFFSET; ci->root_size = ci->root_cksum = 0; } else WT_RET(__wt_block_write_off(session, block, buf, &ci->root_offset, &ci->root_size, &ci->root_cksum, 0)); /* Process the checkpoint list, deleting and updating as required. */ WT_RET(__ckpt_process(session, block, ckptbase)); /* * Checkpoints have to hit disk (it would be reasonable to configure for * lazy checkpoints, but we don't support them yet). Regardless, we're * not holding any locks, other writers can proceed while we wait. */ if (F_ISSET(S2C(session), WT_CONN_SYNC)) WT_RET(__wt_fsync(session, block->fh)); return (0); }