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