From 0e2198fa15683289efbf514b96d55ab61c68d1d6 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 27 Sep 2016 11:38:42 -0400 Subject: [PATCH] os/bluestore: precondition rocksdb on mkfs Write N bytes of garbage to the kv store on startup. With rocksdb, this ensures that our log files are preallocated. This option needs to match up with the rocksdb tunables so that it is enough data to start recycling log files. For now, start with 128MB. Signed-off-by: Sage Weil --- src/common/config_opts.h | 2 ++ src/os/bluestore/BlueStore.cc | 30 ++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/src/common/config_opts.h b/src/common/config_opts.h index 5f55e00602fd..5175334c5538 100644 --- a/src/common/config_opts.h +++ b/src/common/config_opts.h @@ -960,6 +960,8 @@ OPTION(bluestore_block_wal_path, OPT_STR, "") OPTION(bluestore_block_wal_size, OPT_U64, 96 * 1024*1024) // rocksdb wal OPTION(bluestore_block_wal_create, OPT_BOOL, false) OPTION(bluestore_block_preallocate_file, OPT_BOOL, false) //whether preallocate space if block/db_path/wal_path is file rather that block device. +OPTION(bluestore_precondition_bluefs, OPT_U64, 128*1024*1024) // write this much data at mkfs +OPTION(bluestore_precondition_bluefs_block, OPT_U64, 1048576) OPTION(bluestore_csum_type, OPT_STR, "crc32c") // none|xxhash32|xxhash64|crc32c|crc32c_16|crc32c_8 OPTION(bluestore_min_csum_block, OPT_U32, 4096) OPTION(bluestore_max_csum_block, OPT_U32, 64*1024) diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 2ede4e191aa3..923bda285c26 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -3588,6 +3588,36 @@ int BlueStore::mkfs() goto out_close_alloc; dout(10) << __func__ << " success" << dendl; + if (bluefs && + g_conf->bluestore_precondition_bluefs > 0) { + dout(10) << __func__ << " preconditioning with " + << pretty_si_t(g_conf->bluestore_precondition_bluefs) + << " in blocks of " + << pretty_si_t(g_conf->bluestore_precondition_bluefs_block) + << dendl; + unsigned n = g_conf->bluestore_precondition_bluefs / + g_conf->bluestore_precondition_bluefs_block; + bufferlist bl; + bufferptr bp(g_conf->bluestore_precondition_bluefs_block); + for (unsigned i=0; i < g_conf->bluestore_precondition_bluefs_block; ++i) { + bp[i] = rand(); + } + bl.append(bp); + string key1("a"); + string key2("b"); + for (unsigned i=0; i < n; ++i) { + KeyValueDB::Transaction t = db->get_transaction(); + t->set(PREFIX_SUPER, (i & 1) ? key1 : key2, bl); + t->rmkey(PREFIX_SUPER, (i & 1) ? key2 : key1); + db->submit_transaction_sync(t); + } + KeyValueDB::Transaction t = db->get_transaction(); + t->rmkey(PREFIX_SUPER, key1); + t->rmkey(PREFIX_SUPER, key2); + db->submit_transaction_sync(t); + dout(10) << __func__ << " done preconditioning" << dendl; + } + out_close_alloc: _close_alloc(); out_close_fm: -- 2.47.3