From 787d41d26816f32224d054af601718c0b3ed80c9 Mon Sep 17 00:00:00 2001 From: Victor Kotlyar <Victor.Kotlyar@cern.ch> Date: Thu, 11 Jul 2019 11:39:40 +0200 Subject: [PATCH] Add notification from taped to the catalogue when tape mounted for read or write. --- .../tapeserver/daemon/DataTransferSession.cpp | 12 ++++++++---- .../tapeserver/daemon/DataTransferSession.hpp | 7 ++++++- .../daemon/DataTransferSessionTest.cpp | 18 +++++++++--------- .../daemon/TapeReadSingleThread.cpp | 19 ++++++++++++++++--- .../daemon/TapeReadSingleThread.hpp | 7 ++++++- .../daemon/TapeWriteSingleThread.cpp | 17 +++++++++++++++-- .../daemon/TapeWriteSingleThread.hpp | 8 +++++++- tapeserver/daemon/DriveHandler.cpp | 3 ++- 8 files changed, 69 insertions(+), 22 deletions(-) diff --git a/tapeserver/castor/tape/tapeserver/daemon/DataTransferSession.cpp b/tapeserver/castor/tape/tapeserver/daemon/DataTransferSession.cpp index 00946f2556..1fca0fc215 100644 --- a/tapeserver/castor/tape/tapeserver/daemon/DataTransferSession.cpp +++ b/tapeserver/castor/tape/tapeserver/daemon/DataTransferSession.cpp @@ -55,7 +55,8 @@ castor::tape::tapeserver::daemon::DataTransferSession::DataTransferSession( cta::tape::daemon::TapedProxy & initialProcess, cta::server::ProcessCap & capUtils, const DataTransferConfig & castorConf, - cta::Scheduler & scheduler): + cta::Scheduler & scheduler, + cta::catalogue::Catalogue &catalogue): m_log(log), m_sysWrapper(sysWrapper), m_driveConfig(driveConfig), @@ -64,7 +65,8 @@ castor::tape::tapeserver::daemon::DataTransferSession::DataTransferSession( m_mc(mc), m_intialProcess(initialProcess), m_capUtils(capUtils), - m_scheduler(scheduler) + m_scheduler(scheduler), + m_catalogue(catalogue) { } @@ -236,7 +238,8 @@ castor::tape::tapeserver::daemon::Session::EndOfSessionAction TapeReadSingleThread trst(*drive, m_mc, tsr, m_volInfo, m_castorConf.bulkRequestRecallMaxFiles,m_capUtils,rwd,lc,rrp, - m_castorConf.useLbp, m_castorConf.useRAO, m_castorConf.externalEncryptionKeyScript,*retrieveMount); + m_castorConf.useLbp, m_castorConf.useRAO, m_castorConf.externalEncryptionKeyScript,*retrieveMount, + m_catalogue); DiskWriteThreadPool dwtp(m_castorConf.nbDiskThreads, rrp, rwd, @@ -338,7 +341,8 @@ castor::tape::tapeserver::daemon::Session::EndOfSessionAction m_castorConf.maxBytesBeforeFlush, m_castorConf.useLbp, m_castorConf.externalEncryptionKeyScript, - *archiveMount); + *archiveMount, + m_catalogue); DiskReadThreadPool drtp(m_castorConf.nbDiskThreads, m_castorConf.bulkRequestMigrationMaxFiles, diff --git a/tapeserver/castor/tape/tapeserver/daemon/DataTransferSession.hpp b/tapeserver/castor/tape/tapeserver/daemon/DataTransferSession.hpp index f8f4956472..9b1354a1b0 100644 --- a/tapeserver/castor/tape/tapeserver/daemon/DataTransferSession.hpp +++ b/tapeserver/castor/tape/tapeserver/daemon/DataTransferSession.hpp @@ -64,7 +64,8 @@ namespace daemon { cta::tape::daemon::TapedProxy & initialProcess, cta::server::ProcessCap &capUtils, const DataTransferConfig & castorConf, - cta::Scheduler &scheduler); + cta::Scheduler &scheduler, + cta::catalogue::Catalogue &catalogue); /** * Execute the session and return the type of action to be performed @@ -146,6 +147,10 @@ namespace daemon { * The scheduler, i.e. the local interface to the Objectstore DB */ cta::Scheduler &m_scheduler; + /** + * Reference to the catalogue interface + */ + cta::catalogue::Catalogue &m_catalogue; /** * Returns the string representation of the specified mount type diff --git a/tapeserver/castor/tape/tapeserver/daemon/DataTransferSessionTest.cpp b/tapeserver/castor/tape/tapeserver/daemon/DataTransferSessionTest.cpp index 9f10d83ab7..d4c4d73bc0 100644 --- a/tapeserver/castor/tape/tapeserver/daemon/DataTransferSessionTest.cpp +++ b/tapeserver/castor/tape/tapeserver/daemon/DataTransferSessionTest.cpp @@ -487,7 +487,7 @@ TEST_P(DataTransferSessionTest, DataTransferSessionGooddayRecall) { cta::server::ProcessCap capUtils; castor::messages::TapeserverProxyDummy initialProcess; castor::tape::tapeserver::daemon::DataTransferSession sess("tapeHost", logger, mockSys, - driveConfig, mc, initialProcess, capUtils, castorConf, scheduler); + driveConfig, mc, initialProcess, capUtils, castorConf, scheduler, catalogue); // 8) Run the data transfer session sess.execute(); @@ -692,7 +692,7 @@ TEST_P(DataTransferSessionTest, DataTransferSessionWrongRecall) { cta::server::ProcessCap capUtils; castor::messages::TapeserverProxyDummy initialProcess; DataTransferSession sess("tapeHost", logger, mockSys, - driveConfig, mc, initialProcess, capUtils, castorConf, scheduler); + driveConfig, mc, initialProcess, capUtils, castorConf, scheduler, catalogue); // 8) Run the data transfer session sess.execute(); @@ -900,7 +900,7 @@ TEST_P(DataTransferSessionTest, DataTransferSessionRAORecall) { cta::server::ProcessCap capUtils; castor::messages::TapeserverProxyDummy initialProcess; castor::tape::tapeserver::daemon::DataTransferSession sess("tapeHost", logger, mockSys, - driveConfig, mc, initialProcess, capUtils, castorConf, scheduler); + driveConfig, mc, initialProcess, capUtils, castorConf, scheduler, catalogue); // 8) Run the data transfer session sess.execute(); @@ -1073,7 +1073,7 @@ TEST_P(DataTransferSessionTest, DataTransferSessionNoSuchDrive) { castor::messages::TapeserverProxyDummy initialProcess; cta::server::ProcessCapDummy capUtils; DataTransferSession sess("tapeHost", logger, mockSys, - driveConfig, mc, initialProcess, capUtils, castorConf, scheduler); + driveConfig, mc, initialProcess, capUtils, castorConf, scheduler, catalogue); ASSERT_NO_THROW(sess.execute()); std::string temp = logger.getLog(); ASSERT_NE(std::string::npos, logger.getLog().find("Could not stat path: /dev/noSuchDrive")); @@ -1223,7 +1223,7 @@ TEST_P(DataTransferSessionTest, DataTransferSessionFailtoMount) { cta::server::ProcessCap capUtils; castor::messages::TapeserverProxyDummy initialProcess; DataTransferSession sess("tapeHost", logger, mockSys, - driveConfig, mc, initialProcess, capUtils, castorConf, scheduler); + driveConfig, mc, initialProcess, capUtils, castorConf, scheduler, catalogue); ASSERT_NO_THROW(sess.execute()); std::string temp = logger.getLog(); ASSERT_NE(std::string::npos, logger.getLog().find("Failed to mount the tape")); @@ -1354,7 +1354,7 @@ TEST_P(DataTransferSessionTest, DataTransferSessionGooddayMigration) { cta::mediachanger::MediaChangerFacade mc(dummyLog); cta::server::ProcessCap capUtils; castor::messages::TapeserverProxyDummy initialProcess; - DataTransferSession sess("tapeHost", logger, mockSys, driveConfig, mc, initialProcess, capUtils, castorConf, scheduler); + DataTransferSession sess("tapeHost", logger, mockSys, driveConfig, mc, initialProcess, capUtils, castorConf, scheduler, catalogue); sess.execute(); std::string logToCheck = logger.getLog(); logToCheck += ""; @@ -1504,7 +1504,7 @@ TEST_P(DataTransferSessionTest, DataTransferSessionMissingFilesMigration) { cta::mediachanger::MediaChangerFacade mc(dummyLog); cta::server::ProcessCap capUtils; castor::messages::TapeserverProxyDummy initialProcess; - DataTransferSession sess("tapeHost", logger, mockSys, driveConfig, mc, initialProcess, capUtils, castorConf, scheduler); + DataTransferSession sess("tapeHost", logger, mockSys, driveConfig, mc, initialProcess, capUtils, castorConf, scheduler, catalogue); sess.execute(); std::string temp = logger.getLog(); temp += ""; @@ -1659,7 +1659,7 @@ TEST_P(DataTransferSessionTest, DataTransferSessionTapeFullMigration) { cta::mediachanger::MediaChangerFacade mc(dummyLog); cta::server::ProcessCap capUtils; castor::messages::TapeserverProxyDummy initialProcess; - DataTransferSession sess("tapeHost", logger, mockSys, driveConfig, mc, initialProcess, capUtils, castorConf, scheduler); + DataTransferSession sess("tapeHost", logger, mockSys, driveConfig, mc, initialProcess, capUtils, castorConf, scheduler, catalogue); sess.execute(); std::string temp = logger.getLog(); temp += ""; @@ -1819,7 +1819,7 @@ TEST_P(DataTransferSessionTest, DataTransferSessionTapeFullOnFlushMigration) { cta::mediachanger::MediaChangerFacade mc(dummyLog); cta::server::ProcessCap capUtils; castor::messages::TapeserverProxyDummy initialProcess; - DataTransferSession sess("tapeHost", logger, mockSys, driveConfig, mc, initialProcess, capUtils, castorConf, scheduler); + DataTransferSession sess("tapeHost", logger, mockSys, driveConfig, mc, initialProcess, capUtils, castorConf, scheduler, catalogue); sess.execute(); std::string temp = logger.getLog(); temp += ""; diff --git a/tapeserver/castor/tape/tapeserver/daemon/TapeReadSingleThread.cpp b/tapeserver/castor/tape/tapeserver/daemon/TapeReadSingleThread.cpp index 2c61233c1b..566b0d3816 100644 --- a/tapeserver/castor/tape/tapeserver/daemon/TapeReadSingleThread.cpp +++ b/tapeserver/castor/tape/tapeserver/daemon/TapeReadSingleThread.cpp @@ -38,7 +38,8 @@ castor::tape::tapeserver::daemon::TapeReadSingleThread::TapeReadSingleThread( const bool useLbp, const bool useRAO, const std::string & externalEncryptionKeyScript, - const cta::RetrieveMount& retrieveMount) : + const cta::RetrieveMount& retrieveMount, + cta::catalogue::Catalogue &catalogue) : TapeSingleThreadInterface<TapeReadTask>(drive, mc, initialProcess, volInfo, capUtils, lc, externalEncryptionKeyScript), m_maxFilesRequest(maxFilesRequest), @@ -46,7 +47,8 @@ castor::tape::tapeserver::daemon::TapeReadSingleThread::TapeReadSingleThread( m_rrp(rrp), m_useLbp(useLbp), m_useRAO(useRAO), - m_retrieveMount(retrieveMount){} + m_retrieveMount(retrieveMount), + m_catalogue(catalogue){} //------------------------------------------------------------------------------ //TapeCleaning::~TapeCleaning() @@ -300,7 +302,7 @@ void castor::tape::tapeserver::daemon::TapeReadSingleThread::run() { scoped.add("useLbp", m_useLbp); scoped.add("detectedLbp", rs->isTapeWithLbp()); if (rs->isTapeWithLbp() && !m_useLbp) { - m_logContext.log(cta::log::WARNING, "Tapserver started without LBP support" + m_logContext.log(cta::log::WARNING, "Tapeserver started without LBP support" " but the tape with LBP label mounted"); } switch(m_drive.getLbpToUse()) { @@ -319,6 +321,17 @@ void castor::tape::tapeserver::daemon::TapeReadSingleThread::run() { } m_initialProcess.reportState(cta::tape::session::SessionState::Running, cta::tape::session::SessionType::Retrieve); + + try { + m_catalogue.tapeMountedForRetrieve(m_volInfo.vid, m_drive.config.unitName); + } catch (cta::exception::Exception &ex) { + cta::log::ScopedParamContainer scoped(m_logContext); + params.add("tapeVid", m_volInfo.vid) + .add("tapeDrive", m_drive.config.unitName); + m_logContext.log(cta::log::WARNING, + "Failed to update catalogue for the tape mounted for retrieve."); + } + m_stats.waitReportingTime += timer.secs(cta::utils::Timer::resetCounter); // Then we will loop on the tasks as they get from // the task injector diff --git a/tapeserver/castor/tape/tapeserver/daemon/TapeReadSingleThread.hpp b/tapeserver/castor/tape/tapeserver/daemon/TapeReadSingleThread.hpp index 71bc25db50..20a87b58bb 100644 --- a/tapeserver/castor/tape/tapeserver/daemon/TapeReadSingleThread.hpp +++ b/tapeserver/castor/tape/tapeserver/daemon/TapeReadSingleThread.hpp @@ -69,7 +69,8 @@ public: const bool useLbp, const bool useRAO, const std::string & externalEncryptionKeyScript, - const cta::RetrieveMount &retrieveMount); + const cta::RetrieveMount &retrieveMount, + cta::catalogue::Catalogue &catalogue); /** * Set the task injector. Has to be done that way (and not in the constructor) @@ -159,6 +160,10 @@ private: * on which we are reading */ const cta::RetrieveMount& m_retrieveMount; + /** + * Reference to the catalogue interface + */ + cta::catalogue::Catalogue &m_catalogue; /// Helper virtual function to access the watchdog from parent class virtual void countTapeLogError(const std::string & error) { diff --git a/tapeserver/castor/tape/tapeserver/daemon/TapeWriteSingleThread.cpp b/tapeserver/castor/tape/tapeserver/daemon/TapeWriteSingleThread.cpp index f209e4f0df..acfca1d289 100644 --- a/tapeserver/castor/tape/tapeserver/daemon/TapeWriteSingleThread.cpp +++ b/tapeserver/castor/tape/tapeserver/daemon/TapeWriteSingleThread.cpp @@ -38,7 +38,8 @@ castor::tape::tapeserver::drive::DriveInterface & drive, cta::server::ProcessCap &capUtils, uint64_t filesBeforeFlush, uint64_t bytesBeforeFlush, const bool useLbp, const std::string & externalEncryptionKeyScript, - const cta::ArchiveMount & archiveMount): + const cta::ArchiveMount & archiveMount, + cta::catalogue::Catalogue &catalogue): TapeSingleThreadInterface<TapeWriteTask>(drive, mc, tsr, volInfo, capUtils, lc, externalEncryptionKeyScript), m_filesBeforeFlush(filesBeforeFlush), @@ -49,7 +50,8 @@ castor::tape::tapeserver::drive::DriveInterface & drive, m_compress(true), m_useLbp(useLbp), m_watchdog(mwd), - m_archiveMount(archiveMount){} + m_archiveMount(archiveMount), + m_catalogue(catalogue){} //------------------------------------------------------------------------------ //TapeCleaning::~TapeCleaning() @@ -397,6 +399,17 @@ void castor::tape::tapeserver::daemon::TapeWriteSingleThread::run() { m_initialProcess.reportState(cta::tape::session::SessionState::Running, cta::tape::session::SessionType::Archive); + + try { + m_catalogue.tapeMountedForArchive(m_volInfo.vid, m_drive.config.unitName); + } catch (cta::exception::Exception &ex) { + cta::log::ScopedParamContainer scoped(m_logContext); + params.add("tapeVid", m_volInfo.vid) + .add("tapeDrive", m_drive.config.unitName); + m_logContext.log(cta::log::WARNING, + "Failed to update catalogue for the tape mounted for archive."); + } + uint64_t bytes=0; uint64_t files=0; m_stats.waitReportingTime += timer.secs(cta::utils::Timer::resetCounter); diff --git a/tapeserver/castor/tape/tapeserver/daemon/TapeWriteSingleThread.hpp b/tapeserver/castor/tape/tapeserver/daemon/TapeWriteSingleThread.hpp index b92622b979..61ce244c29 100644 --- a/tapeserver/castor/tape/tapeserver/daemon/TapeWriteSingleThread.hpp +++ b/tapeserver/castor/tape/tapeserver/daemon/TapeWriteSingleThread.hpp @@ -70,7 +70,8 @@ public: cta::server::ProcessCap &capUtils, uint64_t filesBeforeFlush, uint64_t bytesBeforeFlush, const bool useLbp, const std::string & externalEncryptionKeyScript, - const cta::ArchiveMount & archiveMount); + const cta::ArchiveMount & archiveMount, + cta::catalogue::Catalogue &catalogue); /** * @@ -197,6 +198,11 @@ private: */ const cta::ArchiveMount & m_archiveMount; + /** + * Reference to the catalogue interface + */ + cta::catalogue::Catalogue & m_catalogue; + protected: /*** * Helper virtual function to access the watchdog from parent class diff --git a/tapeserver/daemon/DriveHandler.cpp b/tapeserver/daemon/DriveHandler.cpp index 35f8bb9cd8..b0d43810c3 100644 --- a/tapeserver/daemon/DriveHandler.cpp +++ b/tapeserver/daemon/DriveHandler.cpp @@ -1091,7 +1091,8 @@ int DriveHandler::runChild() { driveHandlerProxy, capUtils, dataTransferConfig, - scheduler); + scheduler, + *catalogue); auto ret = dataTransferSession.execute(); agentHeartbeat.stopAndWaitThread(); -- GitLab