diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2016-11-14 14:51:44 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2016-11-14 14:51:44 +0000 |
commit | 341cc8cd727620353572df905f248ce1d69613ea (patch) | |
tree | 80cddf15f524795028736f982bb1e79981feb5e8 /vdstestlib | |
parent | d316bb2d8c1933e4d61915d3b879628bd5d07143 (diff) |
Make DirConfig thread and process safe.
Diffstat (limited to 'vdstestlib')
-rw-r--r-- | vdstestlib/src/tests/dirconfig/dirconfigtest.cpp | 18 | ||||
-rw-r--r-- | vdstestlib/src/vespa/vdstestlib/cppunit/dirconfig.cpp | 41 | ||||
-rw-r--r-- | vdstestlib/src/vespa/vdstestlib/cppunit/dirconfig.h | 1 |
3 files changed, 43 insertions, 17 deletions
diff --git a/vdstestlib/src/tests/dirconfig/dirconfigtest.cpp b/vdstestlib/src/tests/dirconfig/dirconfigtest.cpp index d373b7de7e4..5e6051269ea 100644 --- a/vdstestlib/src/tests/dirconfig/dirconfigtest.cpp +++ b/vdstestlib/src/tests/dirconfig/dirconfigtest.cpp @@ -34,6 +34,7 @@ Test::Main() #define ASSERT_FILE_CONTENT(file, content) \ { \ std::ifstream in(file); \ + EXPECT_TRUE(bool(in)); \ std::ostringstream ost; \ std::string line; \ while (getline(in, line, '\n')) { \ @@ -45,9 +46,14 @@ Test::Main() void Test::testNormalUsage() { DirConfig config1; DirConfig config2; - - EXPECT_EQUAL("dir:dirconfig.tmp/1", config1.getConfigId()); - EXPECT_EQUAL("dir:dirconfig.tmp/2", config2.getConfigId()); + EXPECT_EQUAL(strncmp("dir:dirconfig.tmp.", config1.getConfigId().c_str(), 18), 0); + EXPECT_EQUAL(26u, config1.getConfigId().size()); + EXPECT_EQUAL('/', config1.getConfigId()[24]); + EXPECT_EQUAL('0', config1.getConfigId()[25]); + EXPECT_EQUAL(strncmp("dir:dirconfig.tmp.", config2.getConfigId().c_str(), 18), 0); + EXPECT_EQUAL(26u, config2.getConfigId().size()); + EXPECT_EQUAL('/', config2.getConfigId()[24]); + EXPECT_EQUAL('1', config2.getConfigId()[25]); try{ config1.getConfig("testconfig"); @@ -72,7 +78,7 @@ void Test::testNormalUsage() { // Trigger publish config1.getConfigId(); - ASSERT_FILE_CONTENT("dirconfig.tmp/1/testconfig.cfg", + ASSERT_FILE_CONTENT(config1.getDir() + "/testconfig.cfg", "intval 7\n" "stringval \"foo\"\n"); @@ -90,9 +96,9 @@ void Test::testNormalUsage() { config1.publish(); config2.publish(); - ASSERT_FILE_CONTENT("dirconfig.tmp/2/testconfig.cfg", + ASSERT_FILE_CONTENT(config2.getDir() + "/testconfig.cfg", "intval 4\n"); - ASSERT_FILE_CONTENT("dirconfig.tmp/1/config2.cfg", + ASSERT_FILE_CONTENT(config1.getDir() + "/config2.cfg", "intval 3\n" "myarray[2]\n" "myarray[0].foo 4\n" diff --git a/vdstestlib/src/vespa/vdstestlib/cppunit/dirconfig.cpp b/vdstestlib/src/vespa/vdstestlib/cppunit/dirconfig.cpp index f0a56c4fd0c..a5e6d844d9b 100644 --- a/vdstestlib/src/vespa/vdstestlib/cppunit/dirconfig.cpp +++ b/vdstestlib/src/vespa/vdstestlib/cppunit/dirconfig.cpp @@ -6,6 +6,7 @@ #include <fstream> #include <vespa/log/log.h> #include <sstream> +#include <atomic> #include <vespa/vespalib/io/fileutil.h> #include <vespa/vespalib/util/exceptions.h> @@ -16,17 +17,38 @@ namespace vdstestlib { // When we start up first time, remove old config from the directories // we're using namespace { - std::string configRoot = "dirconfig.tmp"; - int getFirstDirNumber() { - if (system(("rm -rf " + configRoot).c_str()) != 0) { - throw vespalib::Exception("system(rm -rf "+configRoot+" failed"); +class Root { +public: + Root() : + _nextDir(0) + { + memset(_dirname, 0, sizeof(_dirname)); + sprintf(_dirname, "dirconfig.tmp.XXXXXX"); + char * realName = mkdtemp(_dirname); + assert(realName == _dirname); + } + ~Root() { + if (system((std::string("rm -rf ") + _dirname).c_str()) != 0) { + abort(); } - return 0; } -} -unsigned int DirConfig::_nextDir(getFirstDirNumber()); + std::string nextDir() { + char name[64]; + uint32_t id = _nextDir++; + sprintf(name, "%s/%u", _dirname, id); + return name; + } +private: + std::string dir() const { return _dirname; } + char _dirname[64]; + std::atomic<uint32_t> _nextDir; +}; + +Root _G_root; + +} DirConfig::Config::Config(const ConfigName& name) : defFileName(name), @@ -87,11 +109,8 @@ DirConfig::Config::get(const ConfigKey& key) const DirConfig::DirConfig() : _configs(), - _dirName() + _dirName(_G_root.nextDir()) { - std::ostringstream ost; - ost << configRoot << '/' << ++_nextDir; - _dirName = ost.str(); vespalib::mkdir(_dirName, true); } diff --git a/vdstestlib/src/vespa/vdstestlib/cppunit/dirconfig.h b/vdstestlib/src/vespa/vdstestlib/cppunit/dirconfig.h index 0513628a74e..116f2f76e93 100644 --- a/vdstestlib/src/vespa/vdstestlib/cppunit/dirconfig.h +++ b/vdstestlib/src/vespa/vdstestlib/cppunit/dirconfig.h @@ -71,6 +71,7 @@ struct DirConfig { /** Get the id that should be used to get config from this instance. */ std::string getConfigId() const; + std::string getDir() const { return _dirName; } /** Return whether memory representation currently differ from files. */ bool isCacheDirty() const; |