diff --git a/tapeserver/daemon/DriveHandler.cpp b/tapeserver/daemon/DriveHandler.cpp index b315078a4dc9a41b8de1c7fb2bc0fd7757536cda..655b310db4cfbb766bd333d09de047d6e442828f 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;