case JS_ErrorTerminated:
Mmsg(term_msg, _("*** Backup Error ***"));
msg_type = M_ERROR; /* Generate error message */
- if (jcr->store_bsock) {
- jcr->store_bsock->signal(BNET_TERMINATE);
- if (jcr->SD_msg_chan_started) {
- pthread_cancel(jcr->SD_msg_chan);
- }
- }
+ terminate_sd_msg_chan_thread(jcr);
break;
case JS_Canceled:
Mmsg(term_msg, _("Backup Canceled"));
- if (jcr->store_bsock) {
- jcr->store_bsock->signal(BNET_TERMINATE);
- if (jcr->SD_msg_chan_started) {
- pthread_cancel(jcr->SD_msg_chan);
- }
- }
+ terminate_sd_msg_chan_thread(jcr);
break;
default:
Mmsg(term_msg, _("Inappropriate term code: %c\n"), jcr->JobStatus);
case JS_ErrorTerminated:
Mmsg(term_msg, _("*** %%s Error ***"));
msg_type = M_ERROR; /* Generate error message */
- if (jcr->store_bsock) {
- jcr->store_bsock->signal(BNET_TERMINATE);
- if (jcr->SD_msg_chan_started) {
- pthread_cancel(jcr->SD_msg_chan);
- }
- }
- if (wjcr->store_bsock) {
- wjcr->store_bsock->signal(BNET_TERMINATE);
- if (wjcr->SD_msg_chan_started) {
- pthread_cancel(wjcr->SD_msg_chan);
- }
- }
+ terminate_sd_msg_chan_thread(jcr);
+ terminate_sd_msg_chan_thread(wjcr);
break;
case JS_Canceled:
Mmsg(term_msg, _("%%s Canceled"));
- if (jcr->store_bsock) {
- jcr->store_bsock->signal(BNET_TERMINATE);
- if (jcr->SD_msg_chan_started) {
- pthread_cancel(jcr->SD_msg_chan);
- }
- }
- if (wjcr->store_bsock) {
- wjcr->store_bsock->signal(BNET_TERMINATE);
- if (wjcr->SD_msg_chan_started) {
- pthread_cancel(wjcr->SD_msg_chan);
- }
- }
+ terminate_sd_msg_chan_thread(jcr);
+ terminate_sd_msg_chan_thread(wjcr);
break;
default:
Mmsg(term_msg, _("Inappropriate %s term code"));
jcr->setJobStatus(JS_Terminated);
}
+void terminate_sd_msg_chan_thread(JCR *jcr)
+{
+ if (jcr->store_bsock) {
+ jcr->store_bsock->signal(BNET_TERMINATE);
+ jcr->lock();
+ if ( !jcr->sd_msg_thread_done
+ && jcr->SD_msg_chan_started
+ && !pthread_equal(jcr->SD_msg_chan, pthread_self())) {
+ Dmsg1(800, "Send kill to SD msg chan jid=%d\n", jcr->JobId);
+ int cnt = 6; // 6*5sec
+ while (!jcr->sd_msg_thread_done && cnt>0) {
+ jcr->unlock();
+ pthread_kill(jcr->SD_msg_chan, TIMEOUT_SIGNAL);
+ struct timeval tv;
+ struct timezone tz;
+ struct timespec timeout;
+
+ gettimeofday(&tv, &tz);
+ timeout.tv_nsec = 0;
+ timeout.tv_sec = tv.tv_sec + 5; /* wait 5 seconds */
+ Dmsg0(00, "I'm waiting for message thread termination.\n");
+ P(mutex);
+ pthread_cond_timedwait(&jcr->term_wait, &mutex, &timeout);
+ V(mutex);
+ jcr->lock();
+ cnt--;
+ }
+ }
+ jcr->unlock();
+ }
+}
+
/*
* Send bootstrap file to Storage daemon.
* This is used for restore, verify VolumeToCatalog, migration,
extern void cancel_storage_daemon_job(JCR *jcr);
extern bool run_console_command(JCR *jcr, const char *cmd);
extern void sd_msg_thread_send_signal(JCR *jcr, int sig);
+void terminate_sd_msg_chan_thread(JCR *jcr);
/* jobq.c */
extern bool inc_read_store(JCR *jcr);
case JS_ErrorTerminated:
term_msg = _("*** Restore Error ***");
msg_type = M_ERROR; /* Generate error message */
- if (jcr->store_bsock) {
- jcr->store_bsock->signal(BNET_TERMINATE);
- if (jcr->SD_msg_chan_started) {
- pthread_cancel(jcr->SD_msg_chan);
- }
- }
+ terminate_sd_msg_chan_thread(jcr);
break;
case JS_Canceled:
term_msg = _("Restore Canceled");
- if (jcr->store_bsock) {
- jcr->store_bsock->signal(BNET_TERMINATE);
- if (jcr->SD_msg_chan_started) {
- pthread_cancel(jcr->SD_msg_chan);
- }
- }
+ terminate_sd_msg_chan_thread(jcr);
break;
default:
term_msg = term_code;
case JS_ErrorTerminated:
term_msg = _("*** Backup Error ***");
msg_type = M_ERROR; /* Generate error message */
- if (jcr->store_bsock) {
- jcr->store_bsock->signal(BNET_TERMINATE);
- if (jcr->SD_msg_chan_started) {
- pthread_cancel(jcr->SD_msg_chan);
- }
- }
+ terminate_sd_msg_chan_thread(jcr);
break;
case JS_Canceled:
term_msg = _("Backup Canceled");
- if (jcr->store_bsock) {
- jcr->store_bsock->signal(BNET_TERMINATE);
- if (jcr->SD_msg_chan_started) {
- pthread_cancel(jcr->SD_msg_chan);
- }
- }
+ terminate_sd_msg_chan_thread(jcr);
break;
default:
term_msg = term_code;