diff --git a/objectstore/BackendPopulator.cpp b/objectstore/BackendPopulator.cpp index ab56b2c0411c97410e1d0359482786d2a4cafbb6..e1dd631f4d708ec6791707a0f370ad4de56fd0b2 100644 --- a/objectstore/BackendPopulator.cpp +++ b/objectstore/BackendPopulator.cpp @@ -29,18 +29,29 @@ BackendPopulator::BackendPopulator(cta::objectstore::Backend & be, const std::string &agentType, const cta::log::LogContext & lc): m_backend(be), m_agentReference(agentType, lc.logger()), m_lc(lc) { cta::objectstore::RootEntry re(m_backend); - cta::objectstore::ScopedExclusiveLock rel(re); - re.fetch(); + re.fetchNoLock(); + cta::objectstore::EntryLogSerDeser cl("user0", "systemhost", time(NULL)); + // We might have to create the agent register (but this is unlikely) + try { + re.getAgentRegisterAddress(); + } catch (...) { + RootEntry re2(m_backend); + ScopedExclusiveLock rel(re2); + re2.fetch(); + re2.addOrGetAgentRegisterPointerAndCommit(m_agentReference, cl); + } Agent agent(m_agentReference.getAgentAddress(), m_backend); agent.initialize(); - cta::objectstore::EntryLogSerDeser cl("user0", "systemhost", time(NULL)); - re.addOrGetAgentRegisterPointerAndCommit(m_agentReference, cl); - rel.release(); agent.insertAndRegisterSelf(); - rel.lock(re); - re.fetch(); - re.addOrGetDriveRegisterPointerAndCommit(m_agentReference, cl); - rel.release(); + // Likewise, make sure the drive register is around. + try { + re.getDriveRegisterAddress(); + } catch (...) { + RootEntry re2(m_backend); + ScopedExclusiveLock rel(re2); + re2.fetch(); + re2.addOrGetDriveRegisterPointerAndCommit(m_agentReference, cl); + } } //------------------------------------------------------------------------------