00001 #ifndef ARCHIVER_H 00002 #define ARCHIVER_H 00003 00004 #include <is/isinfo.h> 00005 #include <ipc/object.h> 00006 #include <ipc/server.h> 00007 00008 #include <string> 00009 #include <memory> 00010 #include <sys/types.h> 00011 #include <unistd.h> 00012 00013 #include <boost/thread.hpp> 00014 #include "ArchivingServiceInterface.hh" 00015 #include "ArchiverArguments.h" 00016 #include "Sct/Exception.h" 00017 #include "Sct/ConfigurationException.h" 00018 #include "Sct/LogicErrors.h" 00019 #include "Sct/IoExceptions.h" 00020 #include "Sct/Archive/IOManagerArchive.h" 00021 00022 using namespace Sct; 00023 namespace SctArchiving { 00024 class ArchivingCommand; 00025 class ArchivingWorkerGroup; 00034 class Archiver: public IPCNamedObject<POA_ArchivingServiceI::ArchivingServiceInterface, ipc::multi_thread>, private boost::noncopyable{ 00035 private: 00037 Archiver(ArchiverArguments args); 00038 protected: 00040 ~Archiver() throw(); 00041 private: 00042 static Archiver* archiver; 00043 00044 public: 00045 void shutdown() {}; 00050 static Archiver& instance(); 00051 00056 static Archiver& initialize(ArchiverArguments args); 00060 void go(unsigned nWorker) throw(IsException); 00064 const char* getStatus() const throw(); 00069 virtual char* status(); 00073 virtual CORBA::Short busy(); 00077 virtual CORBA::Short queueLength(); 00081 virtual void suspendCallbacks (CORBA::Boolean doSuspend); 00085 static void archive_callback(ISCallbackInfo * isc); 00086 00088 IPCServer& getArchiverServer() throw(); 00089 00093 virtual void archiveISName (const char* ioNameIS); 00097 virtual void retrieveISName (const char* ioNameIS); 00101 virtual void retrieveArchName (const char* archivingName); 00105 virtual void retrieve(const char* runNumber, const char* scanNumber, const char* className, const char* specifier); 00109 virtual CORBA::Short getCompressionLevel (); 00113 virtual void setCompressionLevel (CORBA::Short level); 00117 virtual void setRetrieveIsServer (const char* serverName); 00118 /* 00119 Add an ArchivingCommand to the workergroup. 00120 */ 00121 virtual void addCommand(boost::shared_ptr<ArchivingCommand> command) const; 00125 void incrimentNArchived() throw(); 00129 void incrimentNRetrieved() throw(); 00133 void incrimentNValidated() throw(); 00137 void addISTime(double time) throw(); 00141 void addFileTime(double time) throw(); 00145 Sct::Archive::IOManagerArchive& Archiver::getIOManagerArchive() const; 00149 string internal_getRetrieveIsServer() const throw(); 00150 00152 virtual void setPersistentDirectory(const char* newDirectory); 00153 00157 char * getRetrieveIsServer() throw(); 00158 /* 00159 save any unsaved data - may be time consuming! 00160 */ 00161 void recover(); 00162 private: 00166 ArchivingWorkerGroup* workergroup; 00170 void subscribe(const string& servername, const string& regexp, ISCallbackInfo::Callback callback); 00174 std::auto_ptr<ISInfoReceiver> infoReceiver; 00175 /* counters */ 00176 long nArchived; 00177 long nRetrieved; 00178 long nValidated; 00179 double isTimeTaken; 00180 double fileTimeTaken; 00181 mutable boost::recursive_mutex counterMutex; 00182 double getAverageTime(double time) const throw(); 00184 Sct::Archive::IOManagerArchive* m_archive_manager; 00185 std::string m_retrieval_is_server; 00186 bool m_suspend_callback; 00187 ArchiverArguments m_args; 00188 }; // end of definition of class Archiver; 00189 00190 }// end of namespace SctArchiving 00191 #endif // #ifndef ARCHIVER_H