From: Sage Weil Date: Tue, 27 Sep 2016 15:38:42 +0000 (-0400) Subject: os/bluestore: precondition rocksdb on mkfs X-Git-Tag: v11.0.1~83^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F10814%2Fhead;p=ceph.git 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 --- 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: