From f1ab1cc4ca4b06499f688ebfb04c6c7f820cec73 Mon Sep 17 00:00:00 2001 From: Dmitry Simonenko <pmwkaa@gmail.com> Date: Thu, 22 Jan 2015 20:24:35 +0400 Subject: [PATCH] sophia-gh-678: sophia engine creates empty sophia dir --- src/box/sophia_engine.cc | 4 ++++ src/box/sophia_engine.h | 1 + src/box/sophia_index.cc | 8 ++++++++ test/app/sophia_dir.result | 3 +++ test/app/sophia_dir.test.lua | 27 +++++++++++++++++++++++++++ third_party/sophia | 2 +- 6 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 test/app/sophia_dir.result create mode 100755 test/app/sophia_dir.test.lua diff --git a/src/box/sophia_engine.cc b/src/box/sophia_engine.cc index 1524553770..57e0e983f1 100644 --- a/src/box/sophia_engine.cc +++ b/src/box/sophia_engine.cc @@ -112,6 +112,7 @@ SophiaFactory::SophiaFactory() flags = ENGINE_TRANSACTIONAL; env = NULL; tx = NULL; + sophia_dir_exists = 0; recovery.state = READY_NO_KEYS; recovery.recover = sophia_recovery_begin_snapshot; recovery.replace = sophia_replace_recover; @@ -125,6 +126,7 @@ SophiaFactory::init() panic("failed to create sophia environment"); void *c = sp_ctl(env); sp_set(c, "sophia.path", cfg_gets("sophia_dir")); + sp_set(c, "sophia.path_create", "0"); sp_set(c, "scheduler.threads", cfg_gets("sophia.threads")); sp_set(c, "memory.limit", cfg_gets("sophia.memory_limit")); sp_set(c, "compaction.node_size", cfg_gets("sophia.node_size")); @@ -135,6 +137,8 @@ SophiaFactory::init() int rc = sp_open(env); if (rc == -1) sophia_raise(env); + if (access(cfg_gets("sophia_dir"), F_OK) == 0) + sophia_dir_exists = 1; } Engine* diff --git a/src/box/sophia_engine.h b/src/box/sophia_engine.h index 570773fddc..afb6cc2fef 100644 --- a/src/box/sophia_engine.h +++ b/src/box/sophia_engine.h @@ -44,6 +44,7 @@ struct SophiaFactory: public EngineFactory { virtual void end_recover_snapshot(); virtual void end_recovery(); virtual void snapshot(enum engine_snapshot_event, int64_t); + int sophia_dir_exists; void *env; void *tx; }; diff --git a/src/box/sophia_index.cc b/src/box/sophia_index.cc index e03460c2e3..ce9a3af3ea 100644 --- a/src/box/sophia_index.cc +++ b/src/box/sophia_index.cc @@ -154,6 +154,14 @@ SophiaIndex::SophiaIndex(struct key_def *key_def_arg __attribute__((unused))) struct space *space = space_cache_find(key_def->space_id); SophiaFactory *factory = (SophiaFactory*)space->engine->factory; + if (! factory->sophia_dir_exists) { + int rc = mkdir(cfg_gets("sophia_dir"), 0755); + if (rc == -1) { + tnt_raise(SystemError, "failed to create directory '%s'", + cfg_gets("sophia_dir")); + } + factory->sophia_dir_exists = 1; + } env = factory->env; db = sophia_configure(space, key_def); if (db == NULL) diff --git a/test/app/sophia_dir.result b/test/app/sophia_dir.result new file mode 100644 index 0000000000..188ba4b343 --- /dev/null +++ b/test/app/sophia_dir.result @@ -0,0 +1,3 @@ +TAP version 13 +1..1 +ok - sophia_dir is not auto-created diff --git a/test/app/sophia_dir.test.lua b/test/app/sophia_dir.test.lua new file mode 100755 index 0000000000..d6555d41a7 --- /dev/null +++ b/test/app/sophia_dir.test.lua @@ -0,0 +1,27 @@ +#!/usr/bin/env tarantool + +local tap = require('tap') +local test = tap.test('cfg') +test:plan(1) + +local function file_exists(name) + local f = io.open(name,"r") + if f ~= nil then + io.close(f) + return true + else + return false + end +end + +os.execute("rm -rf sophia") +local box = require('box') +box.cfg{ + logger="tarantool.log", + slab_alloc_arena=0.1, + wal_mode = "" +} +test:is(file_exists("sophia"), false, 'sophia_dir is not auto-created') +test:check() + +os.exit(0) diff --git a/third_party/sophia b/third_party/sophia index 5d894d284d..4a9b77cbad 160000 --- a/third_party/sophia +++ b/third_party/sophia @@ -1 +1 @@ -Subproject commit 5d894d284d1bf8c036845f0c0fa82627a7afc1b4 +Subproject commit 4a9b77cbad39976ec40efaa0cb2e66bdaf810d41 -- GitLab