diff --git a/objectstore/BackendRados.cpp b/objectstore/BackendRados.cpp index 7afbedaebbd8c38171889b22706328090bd5c901..40416e2dd12dab8769c89ea0725ddefc43fb77d4 100644 --- a/objectstore/BackendRados.cpp +++ b/objectstore/BackendRados.cpp @@ -84,6 +84,7 @@ cta::threading::Mutex BackendRados::RadosTimeoutLogger::g_mutex; BackendRados::BackendRados(log::Logger & logger, const std::string & userId, const std::string & pool, const std::string &radosNameSpace) : m_user(userId), m_pool(pool), m_namespace(radosNameSpace), m_cluster(), m_radosCtxPool() { + log::LogContext lc(logger); cta::exception::Errnum::throwOnReturnedErrno(-m_cluster.init(userId.c_str()), "In ObjectStoreRados::ObjectStoreRados, failed to m_cluster.init"); try { @@ -102,12 +103,32 @@ m_user(userId), m_pool(pool), m_namespace(radosNameSpace), m_cluster(), m_radosC // Create the connection pool. One per CPU hardware thread. for (size_t i=0; i<std::thread::hardware_concurrency(); i++) { m_radosCtxPool.emplace_back(librados::IoCtx()); + log::ScopedParamContainer params(lc); + params.add("contextId", i); + lc.log(log::DEBUG, "BackendRados::BackendRados() about to create a new context"); rtl.reset(); cta::exception::Errnum::throwOnReturnedErrno(-m_cluster.ioctx_create(pool.c_str(), m_radosCtxPool.back()), "In ObjectStoreRados::ObjectStoreRados, failed to m_cluster.ioctx_create"); rtl.logIfNeeded("In BackendRados::BackendRados(): m_cluster.ioctx_create()", "no object"); + lc.log(log::DEBUG, "BackendRados::BackendRados() context created. About to set namespace."); + librados::bufferlist bl; + rtl.reset(); // An empty string also sets the namespace to default so no need to filter. This function does not fail. m_radosCtxPool.back().set_namespace(radosNameSpace); + rtl.logIfNeeded("In BackendRados::BackendRados(): m_radosCtxPool.back().set_namespace()", "no object"); + rtl.reset(); +lc.log(log::DEBUG, "BackendRados::BackendRados() namespace set. About to test access."); + // Try to read a non-existing object through the newly created context, in hope this will protect against + // race conditions(?) when creating the contexts in a tight loop. + auto rc=m_radosCtxPool.back().read("TestObjectThatDoesNotNeedToExist", bl, 1, 0); + rtl.logIfNeeded("In BackendRados::BackendRados(): m_radosCtxPool.back().read()", "TestObjectThatDoesNotNeedToExist"); + if (-rc != ENOENT) cta::exception::Errnum::throwOnReturnedErrno(-rc, + "In ObjectStoreRados::ObjectStoreRados, failed to m_radosCtxPool.back().read(), and error is not ENOENT as expected"); + } + { + log::ScopedParamContainer params(lc); + params.add("radosContexts", m_radosCtxPool.size()); + lc.log(log::DEBUG, "In BackendRados::BackendRados(): created rados contexts"); } // Create the thread pool. One thread per CPU hardware thread. for (size_t i=0; i<std::thread::hardware_concurrency(); i++) { @@ -115,10 +136,9 @@ m_user(userId), m_pool(pool), m_namespace(radosNameSpace), m_cluster(), m_radosC m_threads.push_back(rwtac); m_threads.back()->start(); } - log::LogContext lc(logger); log::ScopedParamContainer params(lc); params.add("workThreads", m_threads.size()); - lc.log(log::INFO, "In BackendRados::BackendRados(): created worked threads"); + lc.log(log::INFO, "In BackendRados::BackendRados(): created worker threads"); } catch (...) { for (size_t i=0; i<m_threads.size(); i++) m_JobQueue.push(nullptr); for (auto &t: m_threads) {