Kill flashcache code in RocksDB
Summary: Now that we have userspace persisted cache, we don't need flashcache anymore. Closes https://github.com/facebook/rocksdb/pull/1588 Differential Revision: D4245114 Pulled By: igorcanadi fbshipit-source-id: e2c1c72
This commit is contained in:
parent
b77007df8b
commit
3f407b065c
@ -400,7 +400,6 @@ set(SOURCES
|
|||||||
utilities/document/json_document_builder.cc
|
utilities/document/json_document_builder.cc
|
||||||
utilities/env_mirror.cc
|
utilities/env_mirror.cc
|
||||||
utilities/env_registry.cc
|
utilities/env_registry.cc
|
||||||
utilities/flashcache/flashcache.cc
|
|
||||||
utilities/geodb/geodb_impl.cc
|
utilities/geodb/geodb_impl.cc
|
||||||
utilities/leveldb_options/leveldb_options.cc
|
utilities/leveldb_options/leveldb_options.cc
|
||||||
utilities/lua/rocks_lua_compaction_filter.cc
|
utilities/lua/rocks_lua_compaction_filter.cc
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
### Public API Change
|
### Public API Change
|
||||||
* Options.level0_stop_writes_trigger default value changes from 24 to 32.
|
* Options.level0_stop_writes_trigger default value changes from 24 to 32.
|
||||||
* New compaction filter API: CompactionFilter::FilterV2(). Allows to drop ranges of keys.
|
* New compaction filter API: CompactionFilter::FilterV2(). Allows to drop ranges of keys.
|
||||||
|
* Removed flashcache support.
|
||||||
|
|
||||||
## 5.0.0 (11/17/2016)
|
## 5.0.0 (11/17/2016)
|
||||||
### Public API Change
|
### Public API Change
|
||||||
|
@ -1,25 +0,0 @@
|
|||||||
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
|
|
||||||
// This source code is licensed under the BSD-style license found in the
|
|
||||||
// LICENSE file in the root directory of this source tree. An additional grant
|
|
||||||
// of patent rights can be found in the PATENTS file in the same directory.
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include "rocksdb/env.h"
|
|
||||||
|
|
||||||
namespace rocksdb {
|
|
||||||
|
|
||||||
// This API is experimental. We will mark it stable once we run it in production
|
|
||||||
// for a while.
|
|
||||||
// NewFlashcacheAwareEnv() creates and Env that blacklists all background
|
|
||||||
// threads (used for flush and compaction) from using flashcache to cache their
|
|
||||||
// reads. Reads from compaction thread don't need to be cached because they are
|
|
||||||
// going to be soon made obsolete (due to nature of compaction)
|
|
||||||
// Usually you would pass Env::Default() as base.
|
|
||||||
// cachedev_fd is a file descriptor of the flashcache device. Caller has to
|
|
||||||
// open flashcache device before calling this API.
|
|
||||||
extern std::unique_ptr<Env> NewFlashcacheAwareEnv(
|
|
||||||
Env* base, const int cachedev_fd);
|
|
||||||
|
|
||||||
} // namespace rocksdb
|
|
1
src.mk
1
src.mk
@ -154,7 +154,6 @@ LIB_SOURCES = \
|
|||||||
utilities/document/json_document.cc \
|
utilities/document/json_document.cc \
|
||||||
utilities/env_mirror.cc \
|
utilities/env_mirror.cc \
|
||||||
utilities/env_registry.cc \
|
utilities/env_registry.cc \
|
||||||
utilities/flashcache/flashcache.cc \
|
|
||||||
utilities/geodb/geodb_impl.cc \
|
utilities/geodb/geodb_impl.cc \
|
||||||
utilities/leveldb_options/leveldb_options.cc \
|
utilities/leveldb_options/leveldb_options.cc \
|
||||||
utilities/lua/rocks_lua_compaction_filter.cc \
|
utilities/lua/rocks_lua_compaction_filter.cc \
|
||||||
|
55
third-party/flashcache/flashcache_ioctl.h
vendored
55
third-party/flashcache/flashcache_ioctl.h
vendored
@ -1,55 +0,0 @@
|
|||||||
/****************************************************************************
|
|
||||||
* flashcache_ioctl.h
|
|
||||||
* FlashCache: Device mapper target for block-level disk caching
|
|
||||||
*
|
|
||||||
* Copyright 2010 Facebook, Inc.
|
|
||||||
* Author: Mohan Srinivasan (mohan@facebook.com)
|
|
||||||
*
|
|
||||||
* Based on DM-Cache:
|
|
||||||
* Copyright (C) International Business Machines Corp., 2006
|
|
||||||
* Author: Ming Zhao (mingzhao@ufl.edu)
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; under version 2 of the License.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifdef OS_LINUX
|
|
||||||
#ifndef FLASHCACHE_IOCTL_H
|
|
||||||
#define FLASHCACHE_IOCTL_H
|
|
||||||
|
|
||||||
#include <linux/types.h>
|
|
||||||
|
|
||||||
#define FLASHCACHE_IOCTL 0xfe
|
|
||||||
|
|
||||||
enum {
|
|
||||||
FLASHCACHEADDNCPID_CMD=200,
|
|
||||||
FLASHCACHEDELNCPID_CMD,
|
|
||||||
FLASHCACHEDELNCALL_CMD,
|
|
||||||
FLASHCACHEADDWHITELIST_CMD,
|
|
||||||
FLASHCACHEDELWHITELIST_CMD,
|
|
||||||
FLASHCACHEDELWHITELISTALL_CMD,
|
|
||||||
};
|
|
||||||
|
|
||||||
#define FLASHCACHEADDNCPID _IOW(FLASHCACHE_IOCTL, FLASHCACHEADDNCPID_CMD, pid_t)
|
|
||||||
#define FLASHCACHEDELNCPID _IOW(FLASHCACHE_IOCTL, FLASHCACHEDELNCPID_CMD, pid_t)
|
|
||||||
#define FLASHCACHEDELNCALL _IOW(FLASHCACHE_IOCTL, FLASHCACHEDELNCALL_CMD, pid_t)
|
|
||||||
|
|
||||||
#define FLASHCACHEADDBLACKLIST FLASHCACHEADDNCPID
|
|
||||||
#define FLASHCACHEDELBLACKLIST FLASHCACHEDELNCPID
|
|
||||||
#define FLASHCACHEDELALLBLACKLIST FLASHCACHEDELNCALL
|
|
||||||
|
|
||||||
#define FLASHCACHEADDWHITELIST _IOW(FLASHCACHE_IOCTL, FLASHCACHEADDWHITELIST_CMD, pid_t)
|
|
||||||
#define FLASHCACHEDELWHITELIST _IOW(FLASHCACHE_IOCTL, FLASHCACHEDELWHITELIST_CMD, pid_t)
|
|
||||||
#define FLASHCACHEDELALLWHITELIST _IOW(FLASHCACHE_IOCTL, FLASHCACHEDELWHITELISTALL_CMD, pid_t)
|
|
||||||
|
|
||||||
#endif /* FLASHCACHE_IOCTL_H */
|
|
||||||
#endif /* OS_LINUX */
|
|
@ -48,7 +48,6 @@
|
|||||||
#include "rocksdb/slice.h"
|
#include "rocksdb/slice.h"
|
||||||
#include "rocksdb/slice_transform.h"
|
#include "rocksdb/slice_transform.h"
|
||||||
#include "rocksdb/utilities/env_registry.h"
|
#include "rocksdb/utilities/env_registry.h"
|
||||||
#include "rocksdb/utilities/flashcache.h"
|
|
||||||
#include "rocksdb/utilities/optimistic_transaction_db.h"
|
#include "rocksdb/utilities/optimistic_transaction_db.h"
|
||||||
#include "rocksdb/utilities/options_util.h"
|
#include "rocksdb/utilities/options_util.h"
|
||||||
#include "rocksdb/utilities/sim_cache.h"
|
#include "rocksdb/utilities/sim_cache.h"
|
||||||
@ -583,8 +582,6 @@ DEFINE_string(
|
|||||||
"\t--row_cache_size\n"
|
"\t--row_cache_size\n"
|
||||||
"\t--row_cache_numshardbits\n"
|
"\t--row_cache_numshardbits\n"
|
||||||
"\t--enable_io_prio\n"
|
"\t--enable_io_prio\n"
|
||||||
"\t--disable_flashcache_for_background_threads\n"
|
|
||||||
"\t--flashcache_dev\n"
|
|
||||||
"\t--dump_malloc_stats\n"
|
"\t--dump_malloc_stats\n"
|
||||||
"\t--num_multi_db\n");
|
"\t--num_multi_db\n");
|
||||||
#endif // ROCKSDB_LITE
|
#endif // ROCKSDB_LITE
|
||||||
@ -782,11 +779,6 @@ DEFINE_string(compaction_fadvice, "NORMAL",
|
|||||||
static auto FLAGS_compaction_fadvice_e =
|
static auto FLAGS_compaction_fadvice_e =
|
||||||
rocksdb::Options().access_hint_on_compaction_start;
|
rocksdb::Options().access_hint_on_compaction_start;
|
||||||
|
|
||||||
DEFINE_bool(disable_flashcache_for_background_threads, false,
|
|
||||||
"Disable flashcache for background threads");
|
|
||||||
|
|
||||||
DEFINE_string(flashcache_dev, "", "Path to flashcache device");
|
|
||||||
|
|
||||||
DEFINE_bool(use_tailing_iterator, false,
|
DEFINE_bool(use_tailing_iterator, false,
|
||||||
"Use tailing iterator to access a series of keys instead of get");
|
"Use tailing iterator to access a series of keys instead of get");
|
||||||
|
|
||||||
@ -1755,7 +1747,6 @@ class Benchmark {
|
|||||||
int64_t readwrites_;
|
int64_t readwrites_;
|
||||||
int64_t merge_keys_;
|
int64_t merge_keys_;
|
||||||
bool report_file_operations_;
|
bool report_file_operations_;
|
||||||
int cachedev_fd_;
|
|
||||||
|
|
||||||
bool SanityCheck() {
|
bool SanityCheck() {
|
||||||
if (FLAGS_compression_ratio > 1) {
|
if (FLAGS_compression_ratio > 1) {
|
||||||
@ -2011,8 +2002,7 @@ class Benchmark {
|
|||||||
? FLAGS_num
|
? FLAGS_num
|
||||||
: ((FLAGS_writes > FLAGS_reads) ? FLAGS_writes : FLAGS_reads)),
|
: ((FLAGS_writes > FLAGS_reads) ? FLAGS_writes : FLAGS_reads)),
|
||||||
merge_keys_(FLAGS_merge_keys < 0 ? FLAGS_num : FLAGS_merge_keys),
|
merge_keys_(FLAGS_merge_keys < 0 ? FLAGS_num : FLAGS_merge_keys),
|
||||||
report_file_operations_(FLAGS_report_file_operations),
|
report_file_operations_(FLAGS_report_file_operations) {
|
||||||
cachedev_fd_(-1) {
|
|
||||||
// use simcache instead of cache
|
// use simcache instead of cache
|
||||||
if (FLAGS_simcache_size >= 0) {
|
if (FLAGS_simcache_size >= 0) {
|
||||||
if (FLAGS_cache_numshardbits >= 1) {
|
if (FLAGS_cache_numshardbits >= 1) {
|
||||||
@ -2071,11 +2061,6 @@ class Benchmark {
|
|||||||
// this will leak, but we're shutting down so nobody cares
|
// this will leak, but we're shutting down so nobody cares
|
||||||
cache_->DisownData();
|
cache_->DisownData();
|
||||||
}
|
}
|
||||||
if (FLAGS_disable_flashcache_for_background_threads && cachedev_fd_ != -1) {
|
|
||||||
// Dtor for thiis env should run before cachedev_fd_ is closed
|
|
||||||
flashcache_aware_env_ = nullptr;
|
|
||||||
close(cachedev_fd_);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Slice AllocateKey(std::unique_ptr<const char[]>* key_guard) {
|
Slice AllocateKey(std::unique_ptr<const char[]>* key_guard) {
|
||||||
@ -2434,7 +2419,6 @@ class Benchmark {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::unique_ptr<Env> flashcache_aware_env_;
|
|
||||||
std::shared_ptr<TimestampEmulator> timestamp_emulator_;
|
std::shared_ptr<TimestampEmulator> timestamp_emulator_;
|
||||||
|
|
||||||
struct ThreadArg {
|
struct ThreadArg {
|
||||||
@ -3017,23 +3001,7 @@ class Benchmark {
|
|||||||
FLAGS_env->LowerThreadPoolIOPriority(Env::LOW);
|
FLAGS_env->LowerThreadPoolIOPriority(Env::LOW);
|
||||||
FLAGS_env->LowerThreadPoolIOPriority(Env::HIGH);
|
FLAGS_env->LowerThreadPoolIOPriority(Env::HIGH);
|
||||||
}
|
}
|
||||||
if (FLAGS_disable_flashcache_for_background_threads && cachedev_fd_ == -1) {
|
options.env = FLAGS_env;
|
||||||
// Avoid creating the env twice when an use_existing_db is true
|
|
||||||
cachedev_fd_ = open(FLAGS_flashcache_dev.c_str(), O_RDONLY);
|
|
||||||
if (cachedev_fd_ < 0) {
|
|
||||||
fprintf(stderr, "Open flash device failed\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
flashcache_aware_env_ = NewFlashcacheAwareEnv(FLAGS_env, cachedev_fd_);
|
|
||||||
if (flashcache_aware_env_.get() == nullptr) {
|
|
||||||
fprintf(stderr, "Failed to open flashcache device at %s\n",
|
|
||||||
FLAGS_flashcache_dev.c_str());
|
|
||||||
std::abort();
|
|
||||||
}
|
|
||||||
options.env = flashcache_aware_env_.get();
|
|
||||||
} else {
|
|
||||||
options.env = FLAGS_env;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (FLAGS_num_multi_db <= 1) {
|
if (FLAGS_num_multi_db <= 1) {
|
||||||
OpenDb(options, FLAGS_db, &db_);
|
OpenDb(options, FLAGS_db, &db_);
|
||||||
|
@ -1,136 +0,0 @@
|
|||||||
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
|
|
||||||
// This source code is licensed under the BSD-style license found in the
|
|
||||||
// LICENSE file in the root directory of this source tree. An additional grant
|
|
||||||
// of patent rights can be found in the PATENTS file in the same directory.
|
|
||||||
|
|
||||||
#include "utilities/flashcache/flashcache.h"
|
|
||||||
|
|
||||||
#include "rocksdb/utilities/flashcache.h"
|
|
||||||
|
|
||||||
#ifdef OS_LINUX
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <sys/ioctl.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <sys/syscall.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include "third-party/flashcache/flashcache_ioctl.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace rocksdb {
|
|
||||||
|
|
||||||
#if !defined(ROCKSDB_LITE) && defined(OS_LINUX)
|
|
||||||
// Most of the code that handles flashcache is copied from websql's branch of
|
|
||||||
// mysql-5.6
|
|
||||||
class FlashcacheAwareEnv : public EnvWrapper {
|
|
||||||
public:
|
|
||||||
FlashcacheAwareEnv(Env* base, int cachedev_fd)
|
|
||||||
: EnvWrapper(base), cachedev_fd_(cachedev_fd) {
|
|
||||||
pid_t pid = getpid();
|
|
||||||
/* cleanup previous whitelistings */
|
|
||||||
if (ioctl(cachedev_fd_, FLASHCACHEDELALLWHITELIST, &pid) < 0) {
|
|
||||||
cachedev_fd_ = -1;
|
|
||||||
fprintf(stderr, "ioctl del-all-whitelist for flashcache failed\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (ioctl(cachedev_fd_, FLASHCACHEADDWHITELIST, &pid) < 0) {
|
|
||||||
fprintf(stderr, "ioctl add-whitelist for flashcache failed\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
~FlashcacheAwareEnv() {
|
|
||||||
// cachedev_fd_ is -1 if it's unitialized
|
|
||||||
if (cachedev_fd_ != -1) {
|
|
||||||
pid_t pid = getpid();
|
|
||||||
if (ioctl(cachedev_fd_, FLASHCACHEDELWHITELIST, &pid) < 0) {
|
|
||||||
fprintf(stderr, "ioctl del-whitelist for flashcache failed\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int BlacklistCurrentThread(int cachedev_fd) {
|
|
||||||
pid_t pid = static_cast<pid_t>(syscall(SYS_gettid));
|
|
||||||
return ioctl(cachedev_fd, FLASHCACHEADDNCPID, &pid);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int WhitelistCurrentThread(int cachedev_fd) {
|
|
||||||
pid_t pid = static_cast<pid_t>(syscall(SYS_gettid));
|
|
||||||
return ioctl(cachedev_fd, FLASHCACHEDELNCPID, &pid);
|
|
||||||
}
|
|
||||||
|
|
||||||
int GetFlashCacheFileDescriptor() { return cachedev_fd_; }
|
|
||||||
|
|
||||||
struct Arg {
|
|
||||||
Arg(void (*f)(void* arg), void* a, int _cachedev_fd)
|
|
||||||
: original_function_(f), original_arg_(a), cachedev_fd(_cachedev_fd) {}
|
|
||||||
|
|
||||||
void (*original_function_)(void* arg);
|
|
||||||
void* original_arg_;
|
|
||||||
int cachedev_fd;
|
|
||||||
};
|
|
||||||
|
|
||||||
static void BgThreadWrapper(void* a) {
|
|
||||||
Arg* arg = reinterpret_cast<Arg*>(a);
|
|
||||||
if (arg->cachedev_fd != -1) {
|
|
||||||
if (BlacklistCurrentThread(arg->cachedev_fd) < 0) {
|
|
||||||
fprintf(stderr, "ioctl add-nc-pid for flashcache failed\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
arg->original_function_(arg->original_arg_);
|
|
||||||
if (arg->cachedev_fd != -1) {
|
|
||||||
if (WhitelistCurrentThread(arg->cachedev_fd) < 0) {
|
|
||||||
fprintf(stderr, "ioctl del-nc-pid for flashcache failed\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
delete arg;
|
|
||||||
}
|
|
||||||
|
|
||||||
int UnSchedule(void* arg, Priority pri) override {
|
|
||||||
// no unschedule for you
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Schedule(void (*f)(void* arg), void* a, Priority pri,
|
|
||||||
void* tag = nullptr, void (*u)(void* arg) = 0) override {
|
|
||||||
EnvWrapper::Schedule(&BgThreadWrapper, new Arg(f, a, cachedev_fd_), pri,
|
|
||||||
tag);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
int cachedev_fd_;
|
|
||||||
};
|
|
||||||
|
|
||||||
std::unique_ptr<Env> NewFlashcacheAwareEnv(Env* base,
|
|
||||||
const int cachedev_fd) {
|
|
||||||
std::unique_ptr<Env> ret(new FlashcacheAwareEnv(base, cachedev_fd));
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int FlashcacheBlacklistCurrentThread(Env* flashcache_aware_env) {
|
|
||||||
int fd = dynamic_cast<FlashcacheAwareEnv*>(flashcache_aware_env)
|
|
||||||
->GetFlashCacheFileDescriptor();
|
|
||||||
if (fd == -1) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return FlashcacheAwareEnv::BlacklistCurrentThread(fd);
|
|
||||||
}
|
|
||||||
int FlashcacheWhitelistCurrentThread(Env* flashcache_aware_env) {
|
|
||||||
int fd = dynamic_cast<FlashcacheAwareEnv*>(flashcache_aware_env)
|
|
||||||
->GetFlashCacheFileDescriptor();
|
|
||||||
if (fd == -1) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return FlashcacheAwareEnv::WhitelistCurrentThread(fd);
|
|
||||||
}
|
|
||||||
|
|
||||||
#else // !defined(ROCKSDB_LITE) && defined(OS_LINUX)
|
|
||||||
std::unique_ptr<Env> NewFlashcacheAwareEnv(Env* base,
|
|
||||||
const int cachedev_fd) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
int FlashcacheBlacklistCurrentThread(Env* flashcache_aware_env) { return -1; }
|
|
||||||
int FlashcacheWhitelistCurrentThread(Env* flashcache_aware_env) { return -1; }
|
|
||||||
|
|
||||||
#endif // !defined(ROCKSDB_LITE) && defined(OS_LINUX)
|
|
||||||
|
|
||||||
} // namespace rocksdb
|
|
@ -1,18 +0,0 @@
|
|||||||
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
|
|
||||||
// This source code is licensed under the BSD-style license found in the
|
|
||||||
// LICENSE file in the root directory of this source tree. An additional grant
|
|
||||||
// of patent rights can be found in the PATENTS file in the same directory.
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include "rocksdb/env.h"
|
|
||||||
|
|
||||||
namespace rocksdb {
|
|
||||||
|
|
||||||
// This is internal API that will make hacking on flashcache easier. Not sure if
|
|
||||||
// we need to expose this to public users, probably not
|
|
||||||
extern int FlashcacheBlacklistCurrentThread(Env* flashcache_aware_env);
|
|
||||||
extern int FlashcacheWhitelistCurrentThread(Env* flashcache_aware_env);
|
|
||||||
|
|
||||||
} // namespace rocksdb
|
|
Loading…
Reference in New Issue
Block a user