diff --git a/objectstore/Agent.cpp b/objectstore/Agent.cpp index 1fbf5b008f37292647dcdfcf2ce38c7a3055184e..9f9861718dd7c373e9b6022ebc2833fb3271f878 100644 --- a/objectstore/Agent.cpp +++ b/objectstore/Agent.cpp @@ -218,7 +218,7 @@ std::string Agent::dump(Agent & agent) { updateFromObjectStore(as, agent.getFreeContext()); std::stringstream ret; ret<< "<<<< Agent " << selfName() << " dump start" << std::endl - << "name=" << as.name() + << "name=" << as.name() << std::endl << "Ownership intent size=" << as.ownershipintent_size() << std::endl; for (int i=0; i<as.ownershipintent_size(); i++) { ret << "ownershipIntent[" << i << "]: name=" << as.ownershipintent(i).name() @@ -230,6 +230,6 @@ std::string Agent::dump(Agent & agent) { << " type=" << as.creationintent(i).type() << " container=" << as.creationintent(i).container() << std::endl; } - ret<< ">>>> AgentRegister " << selfName() << " dump end" << std::endl; + ret<< ">>>> Agent " << selfName() << " dump end" << std::endl; return ret.str(); } \ No newline at end of file diff --git a/objectstore/AgentRegister.cpp b/objectstore/AgentRegister.cpp index 4bcda54d164953abd93a324bd318402fdc3c2875..ec7519a864b9afaec92e75562e4b241197dc84cb 100644 --- a/objectstore/AgentRegister.cpp +++ b/objectstore/AgentRegister.cpp @@ -100,11 +100,11 @@ std::list<std::string> AgentRegister::getElements(Agent & agent) { return ret; } -std::string AgentRegister::dump(const std::string & title, Agent & agent) { +std::string AgentRegister::dump(Agent & agent) { cta::objectstore::AgentRegister rs; updateFromObjectStore(rs, agent.getFreeContext()); std::stringstream ret; - ret<< "<<<< AgentRegister " << title << " dump start" << std::endl + ret<< "<<<< AgentRegister " << selfName() << " dump start" << std::endl << "Array size=" << rs.elements_size() << std::endl; for (int i=0; i<rs.elements_size(); i++) { ret << "element[" << i << "]=" << rs.elements(i) << std::endl; @@ -113,6 +113,6 @@ std::string AgentRegister::dump(const std::string & title, Agent & agent) { for (int i=0; i<rs.intendedelements_size(); i++) { ret << "intendedElement[" << i << "]=" << rs.intendedelements(i) << std::endl; } - ret<< ">>>> AgentRegister " << title << " dump end" << std::endl; + ret<< ">>>> AgentRegister " << selfName() << " dump end" << std::endl; return ret.str(); } \ No newline at end of file diff --git a/objectstore/AgentRegister.hpp b/objectstore/AgentRegister.hpp index da84b72d124fd024b94f5d7cae72d4edb998a695..c2c2e03a55e8f01de546c106999e96be7a81c06c 100644 --- a/objectstore/AgentRegister.hpp +++ b/objectstore/AgentRegister.hpp @@ -13,5 +13,5 @@ public: void upgradeIntendedElementToActual(std::string name, Agent & agent); void removeIntendedElement (const std::string & name, Agent & agent); std::list<std::string> getElements(Agent & agent); - std::string dump(const std::string & title, Agent & agent); + std::string dump(Agent & agent); }; \ No newline at end of file diff --git a/objectstore/FIFO.hpp b/objectstore/FIFO.hpp index 7342741cb0152b675c9e8b916dfba7fef769ac88..72259711dc579d5d40c5d8ca6887736346a9e6ce 100644 --- a/objectstore/FIFO.hpp +++ b/objectstore/FIFO.hpp @@ -1,42 +1,56 @@ #pragma once #include "ObjectOps.hpp" +#include "Agent.hpp" #include "exception/Exception.hpp" class FIFO: private ObjectOps<cta::objectstore::FIFO> { public: - FIFO(ObjectStore & os, const std::string & name, ContextHandle & context): - ObjectOps<cta::objectstore::FIFO>(os, name), - m_locked(false) { + FIFO(const std::string & name, Agent & agent): + ObjectOps<cta::objectstore::FIFO>(agent.objectStore(), name) { cta::objectstore::FIFO fs; - updateFromObjectStore(fs, context); + updateFromObjectStore(fs, agent.getFreeContext()); } - void lock(ContextHandle & context) { - if (m_locked) throw cta::exception::Exception( - "In FIFO::lock: already locked"); - lockExclusiveAndRead(m_currentState, context); - m_locked = true; - } - - std::string peek() { - std::string ret; - if (!m_locked) throw cta::exception::Exception( - "In FIFO::pop: FIFO should be locked"); - return m_currentState.name(m_currentState.readpointer()); - return ret; +private: + void lock(ContextHandle & ctx) { + lockExclusiveAndRead(m_currentState, ctx); } - void popAndUnlock(ContextHandle & context) { - if (!m_locked) throw cta::exception::Exception( - "In FIFO::pop: FIFO should be locked"); - m_currentState.set_readpointer(m_currentState.readpointer()+1); - if (m_currentState.readpointer() > 100) { - compactCurrentState(); +public: + friend class Transaction; + class Transaction { + public: + Transaction(FIFO & fifo, Agent & agent): + m_fifo(fifo), m_ctx(agent.getFreeContext()), m_writeDone(false) { + m_fifo.lock(m_ctx); } - write(m_currentState); - unlock(context); - m_locked = false; + + std::string peek() { + if (m_writeDone) + throw cta::exception::Exception("In FIFO::Transaction::peek: write already occurred"); + return m_fifo.m_currentState.name(m_fifo.m_currentState.readpointer()); + } + + void popAndUnlock() { + if (m_writeDone) + throw cta::exception::Exception("In FIFO::Transaction::popAndUnlock: write already occurred"); + m_fifo.m_currentState.set_readpointer(m_fifo.m_currentState.readpointer()+1); + if (m_fifo.m_currentState.readpointer() > 100) { + m_fifo.compactCurrentState(); + } + m_fifo.write(m_fifo.m_currentState); + m_fifo.unlock(m_ctx); + m_writeDone = true; + } + private: + FIFO & m_fifo; + ContextHandle & m_ctx; + bool m_writeDone; + }; + + Transaction startTransaction(Agent & agent) { + return Transaction(*this, agent); } void push(std::string name, ContextHandle & context) { @@ -47,9 +61,9 @@ public: unlock(context); } - std::string dump(ContextHandle & context) { + std::string dump(Agent & agent) { cta::objectstore::FIFO fs; - updateFromObjectStore(fs, context); + updateFromObjectStore(fs, agent.getFreeContext()); std::stringstream ret; ret<< "<<<< FIFO dump start" << std::endl << "Read pointer=" << fs.readpointer() << std::endl @@ -63,7 +77,6 @@ public: } private: - bool m_locked; cta::objectstore::FIFO m_currentState; void compactCurrentState() { diff --git a/objectstore/JobPool.hpp b/objectstore/JobPool.hpp index 359e6b923e84b925224183a771392a563451b360..c1aa7b1844df748ddafae2396b61cfafcc8b2d11 100644 --- a/objectstore/JobPool.hpp +++ b/objectstore/JobPool.hpp @@ -4,16 +4,16 @@ #include "FIFO.hpp" #include "Agent.hpp" -class JobPool: private ObjectOps<cta::objectstore::jobPool> { +class JobPool: private ObjectOps<cta::objectstore::JobPool> { public: JobPool(const std::string & name, Agent & agent): - ObjectOps<cta::objectstore::jobPool>(agent.objectStore(), name) { - cta::objectstore::jobPool jps; + ObjectOps<cta::objectstore::JobPool>(agent.objectStore(), name) { + cta::objectstore::JobPool jps; updateFromObjectStore(jps, agent.getFreeContext()); } void PostRecallJob (const std::string & string, ContextHandle & context, const std::string & MigrationFIFOId) { - cta::objectstore::jobPool jps; + cta::objectstore::JobPool jps; lockExclusiveAndRead(jps, context); } @@ -22,10 +22,20 @@ public: NotAllocatedEx(const std::string & context): cta::exception::Exception(context) {} }; -private: + std::string dump(Agent & agent) { + cta::objectstore::JobPool jps; + updateFromObjectStore(jps, agent.getFreeContext()); + std::stringstream ret; + ret << "<<<< JobPool " << selfName() << " dump start" << std::endl + << "Migration=" << jps.migration() << std::endl + << "Recall=" << jps.recall() << std::endl; + ret << ">>>> JobPool " << selfName() << " dump end" << std::endl; + return ret.str(); + } + std::string getRecallFIFO (Agent & agent) { // Check if the recall FIFO exists - cta::objectstore::jobPool res; + cta::objectstore::JobPool res; updateFromObjectStore(res, agent.getFreeContext()); // If the registry is defined, return it, job done. if (res.recall().size()) @@ -41,7 +51,7 @@ private: } catch (NotAllocatedEx &) { // If we get here, the job pool is not created yet, so we have to do it: // lock the entry again, for writing - cta::objectstore::jobPool res; + cta::objectstore::JobPool res; ContextHandle ctx = agent.getFreeContext(); lockExclusiveAndRead(res, ctx); // If the registry is already defined, somebody was faster. We're done. @@ -56,7 +66,7 @@ private: agent.addToIntend(selfName(), FIFOName, "recallFIFO"); // The potential object can now be garbage collected if we die from here. // Create the object, then lock. The name should be unique, so no race. - cta::objectstore::jobPool jps; + cta::objectstore::JobPool jps; jps.set_migration(""); jps.set_recall(""); writeChild(FIFOName, jps); diff --git a/objectstore/ObjectStructureDumper.hpp b/objectstore/ObjectStructureDumper.hpp index b4a5b61407b254dc3133cd341c1b3e05e30a0b55..5be563d3799303ed6584f013af1894cb58c32c71 100644 --- a/objectstore/ObjectStructureDumper.hpp +++ b/objectstore/ObjectStructureDumper.hpp @@ -3,6 +3,7 @@ #include "RootEntry.hpp" #include "AgentRegister.hpp" #include "Agent.hpp" +#include "JobPool.hpp" #include <iostream> class ObjectStrucutreDumper { @@ -11,16 +12,24 @@ public: std::stringstream ret; ret << "<< Structure dump start" << std::endl; RootEntry re(agent); - ret << re.dump(agent); + ret << re.dump(agent) << std::endl;; try { AgentRegister ar(re.getAgentRegister(agent), agent); - ret << ar.dump("root->agentRegister", agent); + ret << ar.dump(agent) << std::endl; std::list<std::string> agList = ar.getElements(agent); for (std::list<std::string>::iterator i=agList.begin(); i!=agList.end(); i++) { Agent a(*i, agent); - ret << a.dump(agent); + ret << a.dump(agent) << std::endl; } } catch (RootEntry::NotAllocatedEx &) {} + try { + JobPool jp (re.getJobPool(agent), agent); + ret << jp.dump(agent) << std::endl; + try { + FIFO rf(jp.getRecallFIFO(agent), agent); + ret << rf.dump(agent) << std::endl; + } catch (...) {} + } catch (RootEntry::NotAllocatedEx &) {} ret << ">> Structure dump end" << std::endl; return ret.str(); } diff --git a/objectstore/RootEntry.cpp b/objectstore/RootEntry.cpp index 10f719c738f3b8b49e33f6bab3d621e7443077bb..329d282f6b08fd34717cbf58def28a85ebec2e01 100644 --- a/objectstore/RootEntry.cpp +++ b/objectstore/RootEntry.cpp @@ -104,7 +104,7 @@ std::string RootEntry::allocateOrGetJobPool(Agent & agent) { agent.addToIntend(s_rootEntryName, jpName, "jobPool"); // The potential object can now be garbage collected if we die from here. // Create the object, then lock. The name should be unique, so no race. - cta::objectstore::jobPool jps; + cta::objectstore::JobPool jps; jps.set_migration(""); jps.set_recall(""); writeChild(jpName, jps); @@ -127,6 +127,7 @@ std::string RootEntry::dump (Agent & agent) { updateFromObjectStore(res, agent.getFreeContext()); ret << "<<<< Root entry dump start" << std::endl; if (res.has_agentregister()) ret << "agentRegister=" << res.agentregister() << std::endl; + ret << "agentRegister Intent Log size=" << res.agentregisterintentlog_size() << std::endl; for (int i=0; i<res.agentregisterintentlog_size(); i++) { ret << "agentRegisterIntentLog=" << res.agentregisterintentlog(i) << std::endl; } diff --git a/objectstore/cta.proto b/objectstore/cta.proto index 7bf0ff0c68e7485be85a62f35f462f4c7cc69575..ab56046748b847257cd4e1c3f35ce2c9f0c68d73 100644 --- a/objectstore/cta.proto +++ b/objectstore/cta.proto @@ -81,7 +81,7 @@ message RecallJob { } // The job pool -message jobPool { +message JobPool { required string migration = 7001; required string recall = 7002; } diff --git a/objectstore/tapeResourceManagerTest.cpp b/objectstore/tapeResourceManagerTest.cpp index 70dd539ff550324bb2c2a84b33b24fcb7b7f7dce..f0b3ae6510d4d94631f381fef44f5d7d17009a1a 100644 --- a/objectstore/tapeResourceManagerTest.cpp +++ b/objectstore/tapeResourceManagerTest.cpp @@ -70,11 +70,11 @@ int main(void){ std::cout << osd.dump(self) << std::endl; // Create the job pool - std::cout << "About to add job pool" << std::endl; + std::cout << "=============== About to add job pool" << std::endl; JobPool jobPool(re.allocateOrGetJobPool(self), self); - std::cout << osd.dump(self) << std::endl; // Dump again std::cout << osd.dump(self) << std::endl; + } catch (std::exception &e) { std::cout << "got exception: " << e.what() << std::endl; }