From 7b80a7ea6ee61c5d91f749516d98a891d4a82861 Mon Sep 17 00:00:00 2001 From: Victor Kotlyar <Victor.Kotlyar@cern.ch> Date: Tue, 5 Sep 2017 09:07:38 +0200 Subject: [PATCH] Add cleaner logic for cta-taped shutdown. If it is a shutdown kill for the cta-taped and there is a tape in the drive than cleaner should unload&dismount the tape. --- tapeserver/daemon/DriveHandler.cpp | 32 ++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/tapeserver/daemon/DriveHandler.cpp b/tapeserver/daemon/DriveHandler.cpp index b315078a4d..655b310db4 100644 --- a/tapeserver/daemon/DriveHandler.cpp +++ b/tapeserver/daemon/DriveHandler.cpp @@ -1105,6 +1105,38 @@ SubprocessHandler::ProcessingStatus DriveHandler::shutdown() { params.add("unitName", m_configLine.unitName); m_processManager.logContext().log(log::INFO, "In DriveHandler::shutdown(): simply killing the process."); kill(); + + std::set<SessionState> statesRequiringCleaner = { SessionState::Mounting, + SessionState::Running, SessionState::Unmounting }; + if ( statesRequiringCleaner.count(m_sessionState)) { + if (!m_sessionVid.size()) { + m_processManager.logContext().log(log::ERR, "In DriveHandler::shutdown(): Should run cleaner but VID is missing. Do not nothing."); + } else { + log::ScopedParamContainer params(m_processManager.logContext()); + params.add("VID", m_sessionVid) + .add("unitName", m_configLine.unitName) + .add("sessionState", session::toString(m_sessionState)) + .add("sessionType", session::toString(m_sessionType)); + m_processManager.logContext().log(log::INFO, "In DriveHandler::shutdown(): starting cleaner."); + // Capabilities management. + cta::server::ProcessCap capUtils; + // Mounting management. + cta::mediachanger::MediaChangerFacade mediaChangerFacade(m_processManager.logContext().logger()); + castor::tape::System::realWrapper sWrapper; + castor::tape::tapeserver::daemon::CleanerSession cleanerSession( + capUtils, + mediaChangerFacade, + m_processManager.logContext().logger(), + m_configLine, + sWrapper, + m_sessionVid, + true, + 60, + ""); + cleanerSession.execute(); + } + } + m_sessionState = SessionState::Shutdown; m_processingStatus.nextTimeout=m_processingStatus.nextTimeout.max(); m_processingStatus.forkRequested = false; -- GitLab