rocksdb: use C++ constructor/destructor for thread_ctx
There's some more work needed to clean this up, but this at least gets RocksDB working for now after the following patch which enables dynamically specifying the RocksDB commit ID. Note that for now, we've modified the RocksDB BGThreadWrapper to call SpdkInitializeThread() explicitly. We'll be able to move that in the future, but for now we check whether the channel has already been allocated so that this extra SpdkInitializeThread() effectively becomes a nop. Note that for the main thread, g_fs hasn't been set yet, so we can't allocate the thread_ctx. So we still need an explicit SpdkInitializeThread() call in the main thread. This has the nice side effect of removing the need for SpdkEnv to override Env::StartThread - so remove all of the code associate with that. Signed-off-by: Jim Harris <james.r.harris@intel.com> Change-Id: I1e8d12b74e688953e15d5d6df58b93e3f5b74c3d Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/452112 Reviewed-by: Ben Walker <benjamin.walker@intel.com> Reviewed-by: Changpeng Liu <changpeng.liu@intel.com> Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
parent
6b48e743a3
commit
ec820daba3
@ -58,11 +58,31 @@ uint32_t g_lcore = 0;
|
||||
std::string g_bdev_name;
|
||||
volatile bool g_spdk_ready = false;
|
||||
volatile bool g_spdk_start_failure = false;
|
||||
struct sync_args {
|
||||
|
||||
void SpdkInitializeThread(void);
|
||||
void SpdkFinalizeThread(void);
|
||||
|
||||
class SpdkThreadCtx
|
||||
{
|
||||
public:
|
||||
struct spdk_fs_thread_ctx *channel;
|
||||
|
||||
SpdkThreadCtx(void) : channel(NULL)
|
||||
{
|
||||
SpdkInitializeThread();
|
||||
}
|
||||
|
||||
~SpdkThreadCtx(void)
|
||||
{
|
||||
SpdkFinalizeThread();
|
||||
}
|
||||
|
||||
private:
|
||||
SpdkThreadCtx(const SpdkThreadCtx &);
|
||||
SpdkThreadCtx &operator=(const SpdkThreadCtx &);
|
||||
};
|
||||
|
||||
__thread struct sync_args g_sync_args;
|
||||
thread_local SpdkThreadCtx g_sync_args;
|
||||
|
||||
static void
|
||||
__call_fn(void *arg1, void *arg2)
|
||||
@ -510,7 +530,6 @@ public:
|
||||
}
|
||||
return Status::OK();
|
||||
}
|
||||
virtual void StartThread(void (*function)(void *arg), void *arg) override;
|
||||
virtual Status LockFile(const std::string &fname, FileLock **lock) override
|
||||
{
|
||||
std::string name = sanitize_path(fname, mDirectory);
|
||||
@ -583,7 +602,7 @@ void SpdkInitializeThread(void)
|
||||
{
|
||||
struct spdk_thread *thread;
|
||||
|
||||
if (g_fs != NULL) {
|
||||
if (g_fs != NULL && g_sync_args.channel == NULL) {
|
||||
thread = spdk_thread_create("spdk_rocksdb", NULL);
|
||||
spdk_set_thread(thread);
|
||||
g_sync_args.channel = spdk_fs_alloc_thread_ctx(g_fs);
|
||||
@ -594,32 +613,10 @@ void SpdkFinalizeThread(void)
|
||||
{
|
||||
if (g_sync_args.channel) {
|
||||
spdk_fs_free_thread_ctx(g_sync_args.channel);
|
||||
g_sync_args.channel = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
struct SpdkThreadState {
|
||||
void (*user_function)(void *);
|
||||
void *arg;
|
||||
};
|
||||
|
||||
static void SpdkStartThreadWrapper(void *arg)
|
||||
{
|
||||
SpdkThreadState *state = reinterpret_cast<SpdkThreadState *>(arg);
|
||||
|
||||
SpdkInitializeThread();
|
||||
state->user_function(state->arg);
|
||||
SpdkFinalizeThread();
|
||||
delete state;
|
||||
}
|
||||
|
||||
void SpdkEnv::StartThread(void (*function)(void *arg), void *arg)
|
||||
{
|
||||
SpdkThreadState *state = new SpdkThreadState;
|
||||
state->user_function = function;
|
||||
state->arg = arg;
|
||||
EnvWrapper::StartThread(SpdkStartThreadWrapper, state);
|
||||
}
|
||||
|
||||
static void
|
||||
fs_load_cb(__attribute__((unused)) void *ctx,
|
||||
struct spdk_filesystem *fs, int fserrno)
|
||||
@ -739,7 +736,6 @@ SpdkEnv::~SpdkEnv()
|
||||
}
|
||||
}
|
||||
|
||||
SpdkFinalizeThread();
|
||||
spdk_app_start_shutdown();
|
||||
pthread_join(mSpdkTid, NULL);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user