diff --git a/scheduler/OStoreDB/OStoreDB.cpp b/scheduler/OStoreDB/OStoreDB.cpp index 78dd4916e18f03d3dc48ba1f3b8c25d7a0ea5e64..722c1a238a682ba155829456af3d9dd78b263841 100644 --- a/scheduler/OStoreDB/OStoreDB.cpp +++ b/scheduler/OStoreDB/OStoreDB.cpp @@ -2978,6 +2978,7 @@ void OStoreDB::updateDriveStatus(const common::dataStructures::DriveInfo& driveI log::ScopedParamContainer params(lc); params.add("diskSystem", dr.first) .add("bytes", dr.second) + .add("previousStatus",toString(previousStatus)) .add("newStatus", toString(driveState.driveStatus)); lc.log(log::WARNING, "In OStoreDB::updateDriveStatus(): will clear non-empty disk space reservation on status change."); } @@ -3901,7 +3902,6 @@ void OStoreDB::RetrieveMount::reserveDiskSpace(const DiskSpaceReservationRequest .add("objectName", ds.getAddressIfSet()); lc.log(log::DEBUG, "In RetrieveMount::reserveDiskSpace(): state after reservation."); } - //TODO BUG HERE, see mountId=\"10\" in downloads/tpsrv0* ds.commit(); } diff --git a/tapeserver/castor/tape/tapeserver/daemon/DiskWriteTaskTest.cpp b/tapeserver/castor/tape/tapeserver/daemon/DiskWriteTaskTest.cpp index a49fc4bb658bb0803814a71e91df8b7495143b13..874130eebff5439f260ab475be5cc35f5fee2e44 100644 --- a/tapeserver/castor/tape/tapeserver/daemon/DiskWriteTaskTest.cpp +++ b/tapeserver/castor/tape/tapeserver/daemon/DiskWriteTaskTest.cpp @@ -86,6 +86,10 @@ namespace unitTests{ cta::threading::MutexLocker ml(m_mutex); endSessionsWithError++; } + void setDiskDone() override {} + + void setTapeDone() override {} + MockRecallReportPacker(cta::RetrieveMount *rm,cta::log::LogContext lc): RecallReportPacker(rm,lc), completeJobs(0), failedJobs(0), endSessions(0), endSessionsWithError(0) {} diff --git a/tapeserver/castor/tape/tapeserver/daemon/DiskWriteThreadPool.cpp b/tapeserver/castor/tape/tapeserver/daemon/DiskWriteThreadPool.cpp index b343526488282ef559f6e7b8bfb6f1dcc9f485ae..323307f0c90cedaef70336365aea1b8e719113b5 100644 --- a/tapeserver/castor/tape/tapeserver/daemon/DiskWriteThreadPool.cpp +++ b/tapeserver/castor/tape/tapeserver/daemon/DiskWriteThreadPool.cpp @@ -178,8 +178,6 @@ void DiskWriteThreadPool::DiskWriteWorkerThread::run() { logWithStat(cta::log::INFO, "Finishing DiskWriteWorkerThread"); m_parentThreadPool.addThreadStats(m_threadStat); if(0 == --m_parentThreadPool.m_nbActiveThread){ - m_parentThreadPool.m_reporter.setDiskDone(); - m_parentThreadPool.m_reporter.setTapeDone(); //Im the last Thread alive, report end of session if(m_parentThreadPool.m_failedWriteCount==0){ diff --git a/tapeserver/castor/tape/tapeserver/daemon/RecallReportPacker.cpp b/tapeserver/castor/tape/tapeserver/daemon/RecallReportPacker.cpp index 2e0ddfcded3cefb58551c6e1b9c21c498a383c79..c59172cfbf8f37d998717b23161dc5916b7faa0c 100644 --- a/tapeserver/castor/tape/tapeserver/daemon/RecallReportPacker.cpp +++ b/tapeserver/castor/tape/tapeserver/daemon/RecallReportPacker.cpp @@ -131,6 +131,7 @@ void RecallReportPacker::ReportSuccessful::execute(RecallReportPacker& parent){ //ReportEndofSession::execute //------------------------------------------------------------------------------ void RecallReportPacker::ReportEndofSession::execute(RecallReportPacker& parent){ + parent.setDiskDone(); if(!parent.errorHappened()){ parent.m_lc.log(cta::log::INFO,"Nominal RecallReportPacker::EndofSession has been reported"); if (parent.m_watchdog) { @@ -167,7 +168,6 @@ bool RecallReportPacker::ReportEndofSession::goingToEnd() { void RecallReportPacker::ReportDriveStatus::execute(RecallReportPacker& parent){ parent.m_retrieveMount->setDriveStatus(m_status); if(m_status==cta::common::dataStructures::DriveStatus::Unmounting) { - parent.m_retrieveMount->diskComplete(); parent.m_retrieveMount->tapeComplete(); } } @@ -183,6 +183,7 @@ bool RecallReportPacker::ReportDriveStatus::goingToEnd() { //ReportEndofSessionWithErrors::execute //------------------------------------------------------------------------------ void RecallReportPacker::ReportEndofSessionWithErrors::execute(RecallReportPacker& parent){ + parent.setDiskDone(); if(parent.m_errorHappened) { LogContext::ScopedParam(parent.m_lc,Param("errorCode",m_error_code)); parent.m_lc.log(cta::log::ERR,m_message); @@ -320,7 +321,13 @@ void RecallReportPacker::WorkerThread::run(){ // Make sure the last batch of reports got cleaned up. try { - m_parent.fullCheckAndFinishAsyncExecute(); + m_parent.fullCheckAndFinishAsyncExecute(); + if(m_parent.m_diskThreadComplete){ + //The m_parent.m_diskThreadComplete is set to true when a ReportEndOfSession or a ReportAndOfSessionWithError + //has been put. It is only after the fullCheckandFinishAsyncExecute is finished that we can say to the mount that the disk thread is complete. + m_parent.m_lc.log(cta::log::DEBUG, "In RecallReportPacker::WorkerThread::run(): all disk threads are finished, telling the mount that Disk threads are complete"); + m_parent.m_retrieveMount->diskComplete(); + } } catch(const cta::exception::Exception& e){ cta::log::ScopedParamContainer params(m_parent.m_lc); params.add("exceptionWhat", e.getMessageValue()) @@ -389,6 +396,7 @@ void RecallReportPacker::fullCheckAndFinishAsyncExecute() { //------------------------------------------------------------------------------ void RecallReportPacker::setTapeDone() { m_tapeThreadComplete = true; + m_retrieveMount->tapeComplete(); } //------------------------------------------------------------------------------ diff --git a/tapeserver/castor/tape/tapeserver/daemon/RecallReportPackerTest.cpp b/tapeserver/castor/tape/tapeserver/daemon/RecallReportPackerTest.cpp index 683a813e19c52ab2d8e2e898cf87550676404c8f..2ac1a4416d9bc21bb871ae8aa560e653d69e1263 100644 --- a/tapeserver/castor/tape/tapeserver/daemon/RecallReportPackerTest.cpp +++ b/tapeserver/castor/tape/tapeserver/daemon/RecallReportPackerTest.cpp @@ -95,9 +95,6 @@ TEST_F(castor_tape_tapeserver_daemon_RecallReportPackerTest, RecallReportPackerN rrp.reportCompletedJob(std::move(job1)); rrp.reportCompletedJob(std::move(job2)); - rrp.setDiskDone(); - rrp.setTapeDone(); - rrp.reportDriveStatus(cta::common::dataStructures::DriveStatus::Unmounting); rrp.reportEndOfSession(); @@ -151,9 +148,6 @@ TEST_F(castor_tape_tapeserver_daemon_RecallReportPackerTest, RecallReportPackerB const cta::exception::Exception ex(error_msg); rrp.reportFailedJob(std::move(job3), ex); - rrp.setDiskDone(); - rrp.setTapeDone(); - rrp.reportDriveStatus(cta::common::dataStructures::DriveStatus::Unmounting); rrp.reportEndOfSession(); diff --git a/tapeserver/castor/tape/tapeserver/daemon/TapeReadSingleThread.cpp b/tapeserver/castor/tape/tapeserver/daemon/TapeReadSingleThread.cpp index 7ca950f561b0c2c8c986e6c374cc00e5a4cd2990..2fd34e97508f4b89a756d19c07d451544a1404a5 100644 --- a/tapeserver/castor/tape/tapeserver/daemon/TapeReadSingleThread.cpp +++ b/tapeserver/castor/tape/tapeserver/daemon/TapeReadSingleThread.cpp @@ -111,11 +111,10 @@ castor::tape::tapeserver::daemon::TapeReadSingleThread::TapeCleaning::~TapeClean // And return the tape to the library // In case of manual mode, this will be filtered by the rmc daemon // (which will do nothing) - currentErrorToCount = "Error_tapeDismount"; + currentErrorToCount = "Error_tapeDismount"; m_this.m_rrp.reportDriveStatus(cta::common::dataStructures::DriveStatus::Unmounting); m_this.m_mc.dismountTape(m_this.m_volInfo.vid, m_this.m_drive.config.librarySlot()); m_this.m_drive.disableLogicalBlockProtection(); - m_this.m_rrp.reportDriveStatus(cta::common::dataStructures::DriveStatus::Up); m_this.m_stats.unmountTime += m_timer.secs(cta::utils::Timer::resetCounter); m_this.m_logContext.log(cta::log::INFO, cta::mediachanger::TAPE_LIBRARY_TYPE_MANUAL != m_this.m_drive.config.librarySlot().getLibraryType() ? "TapeReadSingleThread : tape unmounted":"TapeReadSingleThread : tape NOT unmounted (manual mode)"); @@ -356,6 +355,7 @@ void castor::tape::tapeserver::daemon::TapeReadSingleThread::run() { cta::log::ScopedParamContainer params(m_logContext); params.add("status", "success"); m_stats.totalTime = totalTimer.secs(); + m_rrp.setTapeDone(); logWithStat(cta::log::INFO, "Tape thread complete", params); // Report one last time the stats, after unloading/unmounting.