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 void setFifo(bool); 00085 bool isFifo(); 00089 virtual void suspendCallbacks (CORBA::Boolean doSuspend); 00093 static void archive_callback(ISCallbackInfo * isc); 00094 00096 IPCServer& getArchiverServer() throw(); 00097 00101 virtual void archiveISName (const char* ioNameIS); 00105 virtual void retrieveISName (const char* ioNameIS); 00109 virtual void retrieveArchName (const char* archivingName); 00113 virtual void retrieve(const char* runNumber, const char* scanNumber, const char* className, const char* specifier); 00117 virtual CORBA::Short getCompressionLevel (); 00121 virtual void setCompressionLevel (CORBA::Short level); 00125 virtual void setRetrieveIsServer (const char* serverName); 00126 /* 00127 Add an ArchivingCommand to the workergroup. 00128 */ 00129 virtual void addCommand(boost::shared_ptr<ArchivingCommand> command) const; 00133 void incrimentNArchived() throw(); 00137 void incrimentNRetrieved() throw(); 00141 void incrimentNValidated() throw(); 00145 void addISTime(double time) throw(); 00149 void addFileTime(double time) throw(); 00153 Sct::Archive::IOManagerArchive& Archiver::getIOManagerArchive() const; 00157 string internal_getRetrieveIsServer() const throw(); 00158 00160 virtual void setPersistentDirectory(const char* newDirectory); 00161 00165 char * getRetrieveIsServer() throw(); 00166 /* 00167 save any unsaved data - may be time consuming! 00168 */ 00169 void recover(); 00170 private: 00174 ArchivingWorkerGroup* workergroup; 00178 void subscribe(const string& servername, const string& regexp, ISCallbackInfo::Callback callback); 00182 std::auto_ptr<ISInfoReceiver> infoReceiver; 00183 /* counters */ 00184 long nArchived; 00185 long nRetrieved; 00186 long nValidated; 00187 double isTimeTaken; 00188 double fileTimeTaken; 00189 mutable boost::recursive_mutex counterMutex; 00190 double getAverageTime(double time) const throw(); 00192 Sct::Archive::IOManagerArchive* m_archive_manager; 00193 std::string m_retrieval_is_server; 00194 bool m_suspend_callback; 00195 ArchiverArguments m_args; 00196 }; // end of definition of class Archiver; 00197 00198 }// end of namespace SctArchiving 00199 #endif // #ifndef ARCHIVER_H