|
Packit Service |
392537 |
/*
|
|
Packit Service |
392537 |
* Copyright (c) 1998,1999,2000
|
|
Packit Service |
392537 |
* Traakan, Inc., Los Altos, CA
|
|
Packit Service |
392537 |
* All rights reserved.
|
|
Packit Service |
392537 |
*
|
|
Packit Service |
392537 |
* Redistribution and use in source and binary forms, with or without
|
|
Packit Service |
392537 |
* modification, are permitted provided that the following conditions
|
|
Packit Service |
392537 |
* are met:
|
|
Packit Service |
392537 |
* 1. Redistributions of source code must retain the above copyright
|
|
Packit Service |
392537 |
* notice unmodified, this list of conditions, and the following
|
|
Packit Service |
392537 |
* disclaimer.
|
|
Packit Service |
392537 |
* 2. Redistributions in binary form must reproduce the above copyright
|
|
Packit Service |
392537 |
* notice, this list of conditions and the following disclaimer in the
|
|
Packit Service |
392537 |
* documentation and/or other materials provided with the distribution.
|
|
Packit Service |
392537 |
*
|
|
Packit Service |
392537 |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
Packit Service |
392537 |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
Packit Service |
392537 |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
Packit Service |
392537 |
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
Packit Service |
392537 |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
Packit Service |
392537 |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
Packit Service |
392537 |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
Packit Service |
392537 |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
Packit Service |
392537 |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
Packit Service |
392537 |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
Packit Service |
392537 |
* SUCH DAMAGE.
|
|
Packit Service |
392537 |
*/
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
/*
|
|
Packit Service |
392537 |
* Project: NDMJOB
|
|
Packit Service |
392537 |
* Ident: $Id: $
|
|
Packit Service |
392537 |
*
|
|
Packit Service |
392537 |
* Description:
|
|
Packit Service |
392537 |
*
|
|
Packit Service |
392537 |
*/
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
#include "ndmagents.h"
|
|
Packit Service |
392537 |
#include "amutil.h"
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
#ifndef NDMOS_OPTION_NO_CONTROL_AGENT
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
int ndmca_monitor_backup_tape_tcp (struct ndm_session *sess);
|
|
Packit Service |
392537 |
int ndmca_monitor_recover_tape_tcp (struct ndm_session *sess);
|
|
Packit Service |
392537 |
int ndmca_monitor_shutdown_tape_tcp (struct ndm_session *sess);
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
int
|
|
Packit Service |
392537 |
ndmca_op_create_backup (struct ndm_session *sess)
|
|
Packit Service |
392537 |
{
|
|
Packit Service |
392537 |
struct ndm_control_agent *ca = &sess->control_acb;
|
|
Packit Service |
392537 |
int rc;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ca->tape_mode = NDMP9_TAPE_RDWR_MODE;
|
|
Packit Service |
392537 |
ca->mover_mode = NDMP9_MOVER_MODE_READ;
|
|
Packit Service |
392537 |
ca->is_label_op = 0;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
rc = ndmca_backreco_startup (sess);
|
|
Packit Service |
392537 |
if (rc) return rc;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
rc = ndmca_data_start_backup (sess);
|
|
Packit Service |
392537 |
if (rc == 0) {
|
|
Packit Service |
392537 |
rc = ndmca_monitor_startup (sess);
|
|
Packit Service |
392537 |
if (rc == 0) {
|
|
Packit Service |
392537 |
rc = ndmca_monitor_backup (sess);
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (rc == 0)
|
|
Packit Service |
392537 |
rc = ndmca_monitor_shutdown (sess);
|
|
Packit Service |
392537 |
else
|
|
Packit Service |
392537 |
ndmca_monitor_shutdown (sess);
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmca_media_tattle (sess);
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
return rc;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
int
|
|
Packit Service |
392537 |
ndmca_op_recover_files (struct ndm_session *sess)
|
|
Packit Service |
392537 |
{
|
|
Packit Service |
392537 |
struct ndm_control_agent *ca = &sess->control_acb;
|
|
Packit Service |
392537 |
int rc;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ca->tape_mode = NDMP9_TAPE_READ_MODE;
|
|
Packit Service |
392537 |
ca->mover_mode = NDMP9_MOVER_MODE_WRITE;
|
|
Packit Service |
392537 |
ca->is_label_op = 0;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
rc = ndmca_backreco_startup (sess);
|
|
Packit Service |
392537 |
if (rc) return rc;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
rc = ndmca_data_start_recover (sess);
|
|
Packit Service |
392537 |
if (rc == 0) {
|
|
Packit Service |
392537 |
rc = ndmca_monitor_startup (sess);
|
|
Packit Service |
392537 |
if (rc == 0) {
|
|
Packit Service |
392537 |
rc = ndmca_monitor_recover (sess);
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (rc == 0)
|
|
Packit Service |
392537 |
rc = ndmca_monitor_shutdown (sess);
|
|
Packit Service |
392537 |
else
|
|
Packit Service |
392537 |
ndmca_monitor_shutdown (sess);
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (rc == 0) {
|
|
Packit Service |
392537 |
if (ca->recover_log_file_count > 0) {
|
|
Packit Service |
392537 |
struct ndm_control_agent *ca = &sess->control_acb;
|
|
Packit Service |
392537 |
int n_nlist = ca->job.nlist_tab.n_nlist;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 0,
|
|
Packit Service |
392537 |
"LOG_FILE messages: %d OK, %d ERROR, total %d of %d",
|
|
Packit Service |
392537 |
ca->recover_log_file_ok,
|
|
Packit Service |
392537 |
ca->recover_log_file_error,
|
|
Packit Service |
392537 |
ca->recover_log_file_count,
|
|
Packit Service |
392537 |
n_nlist);
|
|
Packit Service |
392537 |
if (ca->recover_log_file_ok < n_nlist) {
|
|
Packit Service |
392537 |
rc = 1;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
} else {
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 1,
|
|
Packit Service |
392537 |
"DATA did not report any LOG_FILE messages");
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if(!ca->job.tape_tcp)
|
|
Packit Service |
392537 |
ndmca_media_tattle (sess);
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
return rc;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
int
|
|
Packit Service |
392537 |
ndmca_op_recover_fh (struct ndm_session *sess)
|
|
Packit Service |
392537 |
{
|
|
Packit Service |
392537 |
struct ndm_control_agent *ca = &sess->control_acb;
|
|
Packit Service |
392537 |
int rc;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ca->tape_mode = NDMP9_TAPE_READ_MODE;
|
|
Packit Service |
392537 |
ca->mover_mode = NDMP9_MOVER_MODE_WRITE;
|
|
Packit Service |
392537 |
ca->is_label_op = 0;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
rc = ndmca_backreco_startup (sess);
|
|
Packit Service |
392537 |
if (rc) return rc;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
rc = ndmca_data_start_recover_filehist (sess);
|
|
Packit Service |
392537 |
if (rc == 0) {
|
|
Packit Service |
392537 |
rc = ndmca_monitor_startup (sess);
|
|
Packit Service |
392537 |
if (rc == 0) {
|
|
Packit Service |
392537 |
rc = ndmca_monitor_recover (sess);
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (rc == 0)
|
|
Packit Service |
392537 |
rc = ndmca_monitor_shutdown (sess);
|
|
Packit Service |
392537 |
else
|
|
Packit Service |
392537 |
ndmca_monitor_shutdown (sess);
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmca_media_tattle (sess);
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
return rc;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
char *ndmca_data_est(struct ndm_control_agent *ca)
|
|
Packit Service |
392537 |
{
|
|
Packit Service |
392537 |
char *estb;
|
|
Packit Service |
392537 |
static char estb_buf[64];
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
estb = 0;
|
|
Packit Service |
392537 |
if (ca->data_state.est_bytes_remain.valid &&
|
|
Packit Service |
392537 |
(ca->data_state.est_bytes_remain.value >= 1024)) {
|
|
Packit Service |
392537 |
snprintf(estb_buf,
|
|
Packit Service |
392537 |
sizeof (estb_buf),
|
|
Packit Service |
392537 |
" left %lldKB",
|
|
Packit Service |
392537 |
ca->data_state.est_bytes_remain.value/1024LL);
|
|
Packit Service |
392537 |
estb = estb_buf;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
return estb;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
int
|
|
Packit Service |
392537 |
ndmca_monitor_backup (struct ndm_session *sess)
|
|
Packit Service |
392537 |
{
|
|
Packit Service |
392537 |
struct ndm_control_agent *ca = &sess->control_acb;
|
|
Packit Service |
392537 |
int count;
|
|
Packit Service |
392537 |
ndmp9_data_state ds;
|
|
Packit Service |
392537 |
ndmp9_mover_state ms;
|
|
Packit Service |
392537 |
char *estb;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (ca->job.tape_tcp) {
|
|
Packit Service |
392537 |
return ndmca_monitor_backup_tape_tcp(sess);
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 3, "Monitoring backup");
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
for (count = 0; count < 10; count++) {
|
|
Packit Service |
392537 |
ndmca_mon_wait_for_something (sess, count <= 1 ? 30 : 10);
|
|
Packit Service |
392537 |
if (ndmca_monitor_get_states(sess) < 0)
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
#if 0
|
|
Packit Service |
392537 |
if (count > 2)
|
|
Packit Service |
392537 |
ndmca_mon_show_states(sess);
|
|
Packit Service |
392537 |
#endif
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ds = ca->data_state.state;
|
|
Packit Service |
392537 |
ms = ca->mover_state.state;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
estb = ndmca_data_est(ca);
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 1,
|
|
Packit Service |
392537 |
"DATA: bytes %lldKB%s MOVER: written %lldKB record %d",
|
|
Packit Service |
392537 |
ca->data_state.bytes_processed/1024LL,
|
|
Packit Service |
392537 |
estb ? estb : "",
|
|
Packit Service |
392537 |
ca->mover_state.bytes_moved/1024LL,
|
|
Packit Service |
392537 |
ca->mover_state.record_num);
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (ds == NDMP9_DATA_STATE_ACTIVE
|
|
Packit Service |
392537 |
&& ms == NDMP9_MOVER_STATE_ACTIVE) {
|
|
Packit Service |
392537 |
count = 0;
|
|
Packit Service |
392537 |
continue;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
/*
|
|
Packit Service |
392537 |
* Check MOVER for needed tape change during DATA_FLOW_TO_TAPE.
|
|
Packit Service |
392537 |
* Have to do this before checking DATA. Even if DATA halted,
|
|
Packit Service |
392537 |
* MOVER may be holding unwritten data. Have to perform
|
|
Packit Service |
392537 |
* the tape change.
|
|
Packit Service |
392537 |
*/
|
|
Packit Service |
392537 |
if (ms == NDMP9_MOVER_STATE_PAUSED) {
|
|
Packit Service |
392537 |
ndmp9_mover_pause_reason pr;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
pr = ca->mover_state.pause_reason;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (!ca->pending_notify_mover_paused) {
|
|
Packit Service |
392537 |
/* count=count */
|
|
Packit Service |
392537 |
continue; /* wait for notice */
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ca->pending_notify_mover_paused = 0;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 3, "Mover paused, reason=%s",
|
|
Packit Service |
392537 |
ndmp9_mover_pause_reason_to_str (pr));
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
/* backups are different then recoverys... When
|
|
Packit Service |
392537 |
* we reach the end of a window, we signal EOW
|
|
Packit Service |
392537 |
* except in V2 where we signal EOF. EOM occurs
|
|
Packit Service |
392537 |
* at EOT (or EOF does).
|
|
Packit Service |
392537 |
* This is based on reading comments in the email
|
|
Packit Service |
392537 |
* archives...
|
|
Packit Service |
392537 |
*/
|
|
Packit Service |
392537 |
if ((pr == NDMP9_MOVER_PAUSE_EOM) ||
|
|
Packit Service |
392537 |
(pr == NDMP9_MOVER_PAUSE_EOW)) {
|
|
Packit Service |
392537 |
if (ndmca_monitor_load_next(sess) == 0) {
|
|
Packit Service |
392537 |
/* count=count */
|
|
Packit Service |
392537 |
continue; /* Happy */
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
/* Something went wrong with tape change. */
|
|
Packit Service |
392537 |
} else if ((sess->plumb.tape->protocol_version <= 2) &&
|
|
Packit Service |
392537 |
pr == NDMP9_MOVER_PAUSE_EOF) {
|
|
Packit Service |
392537 |
if (ndmca_monitor_load_next(sess) == 0) {
|
|
Packit Service |
392537 |
/* count=count */
|
|
Packit Service |
392537 |
continue; /* Happy */
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
/* Something went wrong with tape change. */
|
|
Packit Service |
392537 |
} else {
|
|
Packit Service |
392537 |
/* All other pause reasons
|
|
Packit Service |
392537 |
* are critically bogus. */
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 0,
|
|
Packit Service |
392537 |
"Operation paused w/o remedy, cancelling");
|
|
Packit Service |
392537 |
ndmca_mover_abort (sess);
|
|
Packit Service |
392537 |
return -1;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
/*
|
|
Packit Service |
392537 |
* If DATA has halted, the show is over.
|
|
Packit Service |
392537 |
*/
|
|
Packit Service |
392537 |
if (ds == NDMP9_DATA_STATE_HALTED) {
|
|
Packit Service |
392537 |
if (ms != NDMP9_MOVER_STATE_HALTED) {
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 3,
|
|
Packit Service |
392537 |
"DATA halted, MOVER active");
|
|
Packit Service |
392537 |
/*
|
|
Packit Service |
392537 |
* MOVER still occupied. It might be a
|
|
Packit Service |
392537 |
* heartbeat away from asking for another
|
|
Packit Service |
392537 |
* tape. Give it a chance.
|
|
Packit Service |
392537 |
*/
|
|
Packit Service |
392537 |
continue;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 2, "Operation done, cleaning up");
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmca_monitor_get_post_backup_env (sess);
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
return 0;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
#if 1
|
|
Packit Service |
392537 |
if (ms == NDMP9_MOVER_STATE_HALTED) {
|
|
Packit Service |
392537 |
if (ds == NDMP9_DATA_STATE_ACTIVE) {
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 3,
|
|
Packit Service |
392537 |
"MOVER halted, DATA active");
|
|
Packit Service |
392537 |
/*
|
|
Packit Service |
392537 |
* DATA still occupied.
|
|
Packit Service |
392537 |
*/
|
|
Packit Service |
392537 |
continue;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
#endif
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (ms != NDMP9_MOVER_STATE_ACTIVE && count == 0) {
|
|
Packit Service |
392537 |
/* Not active. Not paused. Something wrong */
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 0,
|
|
Packit Service |
392537 |
"Operation in unreasonable state, cancelling");
|
|
Packit Service |
392537 |
return -1;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 0, "Operation monitoring mishandled, cancelling");
|
|
Packit Service |
392537 |
return -1;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
int
|
|
Packit Service |
392537 |
ndmca_monitor_backup_tape_tcp (struct ndm_session *sess)
|
|
Packit Service |
392537 |
{
|
|
Packit Service |
392537 |
struct ndm_control_agent *ca = &sess->control_acb;
|
|
Packit Service |
392537 |
int count;
|
|
Packit Service |
392537 |
ndmp9_data_state ds;
|
|
Packit Service |
392537 |
char *estb;
|
|
Packit Service |
392537 |
struct ndmlog * ixlog = &ca->job.index_log;
|
|
Packit Service |
392537 |
char * pname = get_pname();
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 3, "Monitoring backup");
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
for (count = 0; count < 10; count++) {
|
|
Packit Service |
392537 |
ndmca_mon_wait_for_something (sess, count <= 1 ? 30 : 10);
|
|
Packit Service |
392537 |
if (ndmca_monitor_get_states(sess) < 0)
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
#if 0
|
|
Packit Service |
392537 |
if (count > 2)
|
|
Packit Service |
392537 |
ndmca_mon_show_states(sess);
|
|
Packit Service |
392537 |
#endif
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ds = ca->data_state.state;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
estb = ndmca_data_est(ca);
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 1,
|
|
Packit Service |
392537 |
"DATA: bytes %lldKB%s",
|
|
Packit Service |
392537 |
ca->data_state.bytes_processed/1024LL,
|
|
Packit Service |
392537 |
estb ? estb : "");
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (strcmp(pname, "amndmjob") == 0) {
|
|
Packit Service |
392537 |
ndmlogf (ixlog, "DATA SIZE", 0, "%lldKB",
|
|
Packit Service |
392537 |
ca->data_state.bytes_processed/1024LL);
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (ds == NDMP9_DATA_STATE_ACTIVE) {
|
|
Packit Service |
392537 |
count = 0;
|
|
Packit Service |
392537 |
continue;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
/*
|
|
Packit Service |
392537 |
* If DATA has halted, the show is over.
|
|
Packit Service |
392537 |
*/
|
|
Packit Service |
392537 |
if (ds == NDMP9_DATA_STATE_HALTED) {
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 2, "Operation done, cleaning up");
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmca_monitor_get_post_backup_env (sess);
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
return 0;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 0, "Operation monitoring mishandled, cancelling");
|
|
Packit Service |
392537 |
return -1;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
int
|
|
Packit Service |
392537 |
ndmca_monitor_get_post_backup_env (struct ndm_session *sess)
|
|
Packit Service |
392537 |
{
|
|
Packit Service |
392537 |
struct ndm_control_agent *ca = &sess->control_acb;
|
|
Packit Service |
392537 |
struct ndmlog * ixlog = &ca->job.index_log;
|
|
Packit Service |
392537 |
int rc, i;
|
|
Packit Service |
392537 |
ndmp9_pval * pv;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
rc = ndmca_data_get_env (sess);
|
|
Packit Service |
392537 |
if (rc && ca->data_state.error == NDMP9_ILLEGAL_STATE_ERR) {
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 2, "fetch post backup env failed");
|
|
Packit Service |
392537 |
return 0;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
if (rc) {
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 0, "fetch post backup env failed");
|
|
Packit Service |
392537 |
return -1;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
for (i = 0; i < ca->job.result_env_tab.n_env; i++) {
|
|
Packit Service |
392537 |
pv = &ca->job.result_env_tab.env[i];
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmlogf (ixlog, "DE", 0, "%s=%s", pv->name, pv->value);
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
return 0;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
int
|
|
Packit Service |
392537 |
ndmca_monitor_recover (struct ndm_session *sess)
|
|
Packit Service |
392537 |
{
|
|
Packit Service |
392537 |
struct ndm_control_agent *ca = &sess->control_acb;
|
|
Packit Service |
392537 |
int count, rc;
|
|
Packit Service |
392537 |
ndmp9_data_state ds;
|
|
Packit Service |
392537 |
ndmp9_mover_state ms;
|
|
Packit Service |
392537 |
char *estb;
|
|
Packit Service |
392537 |
int last_state_print = 0;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (ca->job.tape_tcp) {
|
|
Packit Service |
392537 |
return (ndmca_monitor_recover_tape_tcp(sess));
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 3, "Monitoring recover");
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
for (count = 0; count < 10; count++) {
|
|
Packit Service |
392537 |
if (ca->pending_notify_data_read) {
|
|
Packit Service |
392537 |
ca->pending_notify_data_read = 0;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
rc = ndmca_mover_read (sess,
|
|
Packit Service |
392537 |
ca->last_notify_data_read.offset,
|
|
Packit Service |
392537 |
ca->last_notify_data_read.length);
|
|
Packit Service |
392537 |
if (rc) {
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 0, "data-read failed");
|
|
Packit Service |
392537 |
return -1;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
if (count < 5)
|
|
Packit Service |
392537 |
continue;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmca_mon_wait_for_something (sess, count <= 1 ? 30 : 10);
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (ndmca_monitor_get_states(sess) < 0)
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
#if 0
|
|
Packit Service |
392537 |
if (count > 2)
|
|
Packit Service |
392537 |
ndmca_mon_show_states(sess);
|
|
Packit Service |
392537 |
#endif
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ds = ca->data_state.state;
|
|
Packit Service |
392537 |
ms = ca->mover_state.state;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
estb = ndmca_data_est(ca);
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if ((ds != NDMP9_DATA_STATE_ACTIVE) ||
|
|
Packit Service |
392537 |
(ms != NDMP9_MOVER_STATE_ACTIVE) ||
|
|
Packit Service |
392537 |
((time(0) - last_state_print) >= 5)) {
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 1,
|
|
Packit Service |
392537 |
"DATA: bytes %lldKB%s MOVER: read %lldKB record %d",
|
|
Packit Service |
392537 |
ca->data_state.bytes_processed/1024LL,
|
|
Packit Service |
392537 |
estb ? estb : "",
|
|
Packit Service |
392537 |
ca->mover_state.bytes_moved/1024LL,
|
|
Packit Service |
392537 |
ca->mover_state.record_num);
|
|
Packit Service |
392537 |
last_state_print = time(0);
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (ds == NDMP9_DATA_STATE_ACTIVE
|
|
Packit Service |
392537 |
&& ms == NDMP9_MOVER_STATE_ACTIVE) {
|
|
Packit Service |
392537 |
count = 0;
|
|
Packit Service |
392537 |
continue;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
/*
|
|
Packit Service |
392537 |
* Check MOVER for needed tape change during DATA_FLOW_TO_TAPE.
|
|
Packit Service |
392537 |
* Have to do this before checking DATA. Even if DATA halted,
|
|
Packit Service |
392537 |
* MOVER may be holding unwritten data. Have to perform
|
|
Packit Service |
392537 |
* the tape change.
|
|
Packit Service |
392537 |
*/
|
|
Packit Service |
392537 |
if (ms == NDMP9_MOVER_STATE_PAUSED) {
|
|
Packit Service |
392537 |
ndmp9_mover_pause_reason pr;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
pr = ca->mover_state.pause_reason;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (!ca->pending_notify_mover_paused) {
|
|
Packit Service |
392537 |
/* count=count */
|
|
Packit Service |
392537 |
continue; /* wait for notice */
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ca->pending_notify_mover_paused = 0;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 3, "Mover paused, reason=%s",
|
|
Packit Service |
392537 |
ndmp9_mover_pause_reason_to_str (pr));
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (((pr == NDMP9_MOVER_PAUSE_EOF) ||
|
|
Packit Service |
392537 |
(pr == NDMP9_MOVER_PAUSE_SEEK))
|
|
Packit Service |
392537 |
&& (ca->cur_media_ix+1 == ca->job.media_tab.n_media)) {
|
|
Packit Service |
392537 |
/*
|
|
Packit Service |
392537 |
* Last tape consumed by tape agent.
|
|
Packit Service |
392537 |
* The DATA agent may be just shy
|
|
Packit Service |
392537 |
* of done, but there is no way for
|
|
Packit Service |
392537 |
* us to tell. So, close the
|
|
Packit Service |
392537 |
* image stream from the TAPE
|
|
Packit Service |
392537 |
* agent side, thus indicating
|
|
Packit Service |
392537 |
* EOF to the DATA agent.
|
|
Packit Service |
392537 |
*/
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 2, "End of tapes");
|
|
Packit Service |
392537 |
ndmca_mover_close (sess);
|
|
Packit Service |
392537 |
/* count=count */
|
|
Packit Service |
392537 |
continue;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (pr == NDMP9_MOVER_PAUSE_EOM
|
|
Packit Service |
392537 |
|| pr == NDMP9_MOVER_PAUSE_EOF) {
|
|
Packit Service |
392537 |
if (ndmca_monitor_load_next(sess) == 0) {
|
|
Packit Service |
392537 |
/* count=count */
|
|
Packit Service |
392537 |
continue; /* Happy */
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
/* Something went wrong with tape change. */
|
|
Packit Service |
392537 |
} else if (pr == NDMP9_MOVER_PAUSE_SEEK) {
|
|
Packit Service |
392537 |
if (ndmca_monitor_seek_tape(sess) == 0) {
|
|
Packit Service |
392537 |
/* count=count */
|
|
Packit Service |
392537 |
continue; /* Happy */
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
/* Something went wrong with tape change. */
|
|
Packit Service |
392537 |
} else {
|
|
Packit Service |
392537 |
/* All other pause reasons
|
|
Packit Service |
392537 |
* are critically bogus. */
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 0,
|
|
Packit Service |
392537 |
"Operation paused w/o remedy, cancelling");
|
|
Packit Service |
392537 |
ndmca_mover_abort (sess);
|
|
Packit Service |
392537 |
return -1;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
/*
|
|
Packit Service |
392537 |
* If DATA has halted, the show is over.
|
|
Packit Service |
392537 |
*/
|
|
Packit Service |
392537 |
if (ds == NDMP9_DATA_STATE_HALTED) {
|
|
Packit Service |
392537 |
if (ms != NDMP9_MOVER_STATE_HALTED) {
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 3,
|
|
Packit Service |
392537 |
"DATA halted, MOVER active");
|
|
Packit Service |
392537 |
/*
|
|
Packit Service |
392537 |
* MOVER still occupied. It might
|
|
Packit Service |
392537 |
* figure it out. Then again, it might
|
|
Packit Service |
392537 |
* be awaiting a MOVER_READ. The NDMP
|
|
Packit Service |
392537 |
* design does not provide a state
|
|
Packit Service |
392537 |
* for awaiting MOVER_READ, so we have
|
|
Packit Service |
392537 |
* to guess.
|
|
Packit Service |
392537 |
*/
|
|
Packit Service |
392537 |
if (count > 0) {
|
|
Packit Service |
392537 |
ndmca_mover_close(sess);
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
continue;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 2, "Operation done, cleaning up");
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmca_monitor_get_post_backup_env (sess);
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
return 0;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (ms != NDMP9_MOVER_STATE_ACTIVE && count == 0) {
|
|
Packit Service |
392537 |
/* Not active. Not paused. Something wrong */
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 0,
|
|
Packit Service |
392537 |
"Operation in unreasonable state, cancelling");
|
|
Packit Service |
392537 |
return -1;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 0, "Operation monitoring mishandled, cancelling");
|
|
Packit Service |
392537 |
return -1;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
int
|
|
Packit Service |
392537 |
ndmca_monitor_recover_tape_tcp (struct ndm_session *sess)
|
|
Packit Service |
392537 |
{
|
|
Packit Service |
392537 |
struct ndm_control_agent *ca = &sess->control_acb;
|
|
Packit Service |
392537 |
int count;
|
|
Packit Service |
392537 |
ndmp9_data_state ds;
|
|
Packit Service |
392537 |
char *estb;
|
|
Packit Service |
392537 |
int last_state_print = 0;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 3, "Monitoring recover");
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
for (count = 0; count < 10; count++) {
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmca_mon_wait_for_something (sess, count <= 1 ? 30 : 10);
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (ndmca_monitor_get_states(sess) < 0)
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
#if 0
|
|
Packit Service |
392537 |
if (count > 2)
|
|
Packit Service |
392537 |
ndmca_mon_show_states(sess);
|
|
Packit Service |
392537 |
#endif
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ds = ca->data_state.state;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
estb = ndmca_data_est(ca);
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if ((ds != NDMP9_DATA_STATE_ACTIVE) ||
|
|
Packit Service |
392537 |
((time(0) - last_state_print) >= 5)) {
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 1,
|
|
Packit Service |
392537 |
"DATA: bytes %lldKB%s MOVER: read %lldKB record %d",
|
|
Packit Service |
392537 |
ca->data_state.bytes_processed/1024LL,
|
|
Packit Service |
392537 |
estb ? estb : "",
|
|
Packit Service |
392537 |
ca->mover_state.bytes_moved/1024LL,
|
|
Packit Service |
392537 |
ca->mover_state.record_num);
|
|
Packit Service |
392537 |
last_state_print = time(0);
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (ds == NDMP9_DATA_STATE_ACTIVE) {
|
|
Packit Service |
392537 |
count = 0;
|
|
Packit Service |
392537 |
continue;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
/*
|
|
Packit Service |
392537 |
* If DATA has halted, the show is over.
|
|
Packit Service |
392537 |
*/
|
|
Packit Service |
392537 |
if (ds == NDMP9_DATA_STATE_HALTED) {
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 2, "Operation done, cleaning up");
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmca_monitor_get_post_backup_env (sess);
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
return 0;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 0, "Operation monitoring mishandled, cancelling");
|
|
Packit Service |
392537 |
return -1;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
int
|
|
Packit Service |
392537 |
ndmca_backreco_startup (struct ndm_session *sess)
|
|
Packit Service |
392537 |
{
|
|
Packit Service |
392537 |
struct ndm_control_agent *ca = &sess->control_acb;
|
|
Packit Service |
392537 |
int rc = 0;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (!ca->job.tape_tcp)
|
|
Packit Service |
392537 |
rc = ndmca_op_robot_startup (sess, 1);
|
|
Packit Service |
392537 |
if (rc) return rc;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
rc = ndmca_connect_data_agent(sess);
|
|
Packit Service |
392537 |
if (rc) {
|
|
Packit Service |
392537 |
ndmconn_destruct (sess->plumb.data);
|
|
Packit Service |
392537 |
return rc;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (ca->job.tape_tcp) {
|
|
Packit Service |
392537 |
return 0;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
rc = ndmca_connect_tape_agent(sess);
|
|
Packit Service |
392537 |
if (rc) {
|
|
Packit Service |
392537 |
ndmconn_destruct (sess->plumb.tape);
|
|
Packit Service |
392537 |
return rc;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
rc = ndmca_mover_set_record_size (sess);
|
|
Packit Service |
392537 |
if (rc) return rc;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
rc = ndmca_media_load_first (sess);
|
|
Packit Service |
392537 |
if (rc) return rc;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmca_media_calculate_offsets (sess);
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (sess->control_acb.swap_connect &&
|
|
Packit Service |
392537 |
(sess->plumb.tape->protocol_version >= 3)) {
|
|
Packit Service |
392537 |
if (sess->plumb.tape->protocol_version < 4) {
|
|
Packit Service |
392537 |
rc = ndmca_data_listen (sess);
|
|
Packit Service |
392537 |
if (rc) return rc;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
rc = ndmca_media_set_window_current (sess);
|
|
Packit Service |
392537 |
if (rc) return rc;
|
|
Packit Service |
392537 |
} else {
|
|
Packit Service |
392537 |
rc = ndmca_media_set_window_current (sess);
|
|
Packit Service |
392537 |
if (rc) return rc;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
rc = ndmca_data_listen (sess);
|
|
Packit Service |
392537 |
if (rc) return rc;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
} else {
|
|
Packit Service |
392537 |
if (sess->plumb.tape->protocol_version < 4) {
|
|
Packit Service |
392537 |
rc = ndmca_mover_listen (sess);
|
|
Packit Service |
392537 |
if (rc) return rc;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
rc = ndmca_media_set_window_current (sess);
|
|
Packit Service |
392537 |
if (rc) return rc;
|
|
Packit Service |
392537 |
} else {
|
|
Packit Service |
392537 |
rc = ndmca_media_set_window_current (sess);
|
|
Packit Service |
392537 |
if (rc) return rc;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
rc = ndmca_mover_listen (sess);
|
|
Packit Service |
392537 |
if (rc) return rc;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
return 0;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
int
|
|
Packit Service |
392537 |
ndmca_monitor_startup (struct ndm_session *sess)
|
|
Packit Service |
392537 |
{
|
|
Packit Service |
392537 |
struct ndm_control_agent *ca = &sess->control_acb;
|
|
Packit Service |
392537 |
ndmp9_data_state ds;
|
|
Packit Service |
392537 |
ndmp9_mover_state ms;
|
|
Packit Service |
392537 |
int count;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 3, "Waiting for operation to start");
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (ca->job.tape_tcp)
|
|
Packit Service |
392537 |
return 0;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
for (count = 0; count < 10; count++) {
|
|
Packit Service |
392537 |
if (ndmca_monitor_get_states (sess) < 0)
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ds = ca->data_state.state;
|
|
Packit Service |
392537 |
if (!ca->job.tape_tcp)
|
|
Packit Service |
392537 |
ms = ca->mover_state.state;
|
|
Packit Service |
392537 |
else
|
|
Packit Service |
392537 |
ms = NDMP9_MOVER_STATE_ACTIVE;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (ds == NDMP9_DATA_STATE_ACTIVE
|
|
Packit Service |
392537 |
&& ms == NDMP9_MOVER_STATE_ACTIVE) {
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 1, "Operation started");
|
|
Packit Service |
392537 |
return 0;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (ds == NDMP9_DATA_STATE_HALTED
|
|
Packit Service |
392537 |
&& ms == NDMP9_MOVER_STATE_HALTED) {
|
|
Packit Service |
392537 |
/* operation finished immediately */
|
|
Packit Service |
392537 |
return 0;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (ds != NDMP9_DATA_STATE_IDLE
|
|
Packit Service |
392537 |
&& ms != NDMP9_MOVER_STATE_IDLE
|
|
Packit Service |
392537 |
&& ms != NDMP9_MOVER_STATE_LISTEN) {
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 1,
|
|
Packit Service |
392537 |
"Operation started in unusual fashion");
|
|
Packit Service |
392537 |
return 0;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmca_mon_wait_for_something (sess, 2);
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 0, "Operation failed to start");
|
|
Packit Service |
392537 |
return -1;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
/*
|
|
Packit Service |
392537 |
* Just make sure things get finished
|
|
Packit Service |
392537 |
*/
|
|
Packit Service |
392537 |
int
|
|
Packit Service |
392537 |
ndmca_monitor_shutdown (struct ndm_session *sess)
|
|
Packit Service |
392537 |
{
|
|
Packit Service |
392537 |
struct ndm_control_agent *ca = &sess->control_acb;
|
|
Packit Service |
392537 |
ndmp9_data_state ds;
|
|
Packit Service |
392537 |
ndmp9_data_halt_reason dhr;
|
|
Packit Service |
392537 |
ndmp9_mover_state ms;
|
|
Packit Service |
392537 |
ndmp9_mover_halt_reason mhr;
|
|
Packit Service |
392537 |
int count;
|
|
Packit Service |
392537 |
int finish;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (ca->job.tape_tcp) {
|
|
Packit Service |
392537 |
return ndmca_monitor_shutdown_tape_tcp(sess);
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 3, "Waiting for operation to halt");
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
for (count = 0; count < 10; count++) {
|
|
Packit Service |
392537 |
ndmca_mon_wait_for_something (sess, 2);
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (ndmca_monitor_get_states (sess) < 0)
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
#if 0
|
|
Packit Service |
392537 |
if (count > 2)
|
|
Packit Service |
392537 |
ndmca_mon_show_states(sess);
|
|
Packit Service |
392537 |
#endif
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ds = ca->data_state.state;
|
|
Packit Service |
392537 |
ms = ca->mover_state.state;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (ds == NDMP9_DATA_STATE_HALTED
|
|
Packit Service |
392537 |
&& ms == NDMP9_MOVER_STATE_HALTED) {
|
|
Packit Service |
392537 |
dhr = ca->data_state.halt_reason;
|
|
Packit Service |
392537 |
mhr = ca->mover_state.halt_reason;
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (count > 2) {
|
|
Packit Service |
392537 |
if (ds != NDMP9_DATA_STATE_HALTED)
|
|
Packit Service |
392537 |
ndmca_data_abort(sess);
|
|
Packit Service |
392537 |
if (ms != NDMP9_MOVER_STATE_HALTED)
|
|
Packit Service |
392537 |
ndmca_mover_abort(sess);
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (ca->tape_state.error == NDMP9_NO_ERR) {
|
|
Packit Service |
392537 |
ndmca_monitor_unload_last_tape (sess);
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (count >= 10) {
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 0,
|
|
Packit Service |
392537 |
"Operation did not halt, something wrong");
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 2, "Operation halted, stopping");
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ds = ca->data_state.state;
|
|
Packit Service |
392537 |
ms = ca->mover_state.state;
|
|
Packit Service |
392537 |
dhr = ca->data_state.halt_reason;
|
|
Packit Service |
392537 |
mhr = ca->mover_state.halt_reason;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if ((ds == NDMP9_DATA_STATE_HALTED)
|
|
Packit Service |
392537 |
&& (ms == NDMP9_MOVER_STATE_HALTED)) {
|
|
Packit Service |
392537 |
if ((dhr == NDMP9_DATA_HALT_SUCCESSFUL) &&
|
|
Packit Service |
392537 |
(mhr == NDMP9_MOVER_HALT_CONNECT_CLOSED)) {
|
|
Packit Service |
392537 |
/* Successful operation */
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 0, "Operation ended OKAY");
|
|
Packit Service |
392537 |
finish = 0;
|
|
Packit Service |
392537 |
} else {
|
|
Packit Service |
392537 |
/* Questionable success */
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 0, "Operation ended questionably");
|
|
Packit Service |
392537 |
finish = 1;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
} else {
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 0, "Operation ended in failure");
|
|
Packit Service |
392537 |
finish = -1;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmca_data_stop (sess);
|
|
Packit Service |
392537 |
ndmca_mover_stop (sess);
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
for (count = 0; count < 10; count++) {
|
|
Packit Service |
392537 |
if (ndmca_monitor_get_states(sess) < 0)
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
#if 0
|
|
Packit Service |
392537 |
if (count > 2)
|
|
Packit Service |
392537 |
ndmca_mon_show_states(sess);
|
|
Packit Service |
392537 |
#endif
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ds = ca->data_state.state;
|
|
Packit Service |
392537 |
ms = ca->mover_state.state;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (ds == NDMP9_DATA_STATE_IDLE
|
|
Packit Service |
392537 |
&& ms == NDMP9_MOVER_STATE_IDLE) {
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (count >= 10) {
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 0,
|
|
Packit Service |
392537 |
"Operation did not stop, something wrong");
|
|
Packit Service |
392537 |
return -1;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
return finish;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
int
|
|
Packit Service |
392537 |
ndmca_monitor_shutdown_tape_tcp (struct ndm_session *sess)
|
|
Packit Service |
392537 |
{
|
|
Packit Service |
392537 |
struct ndm_control_agent *ca = &sess->control_acb;
|
|
Packit Service |
392537 |
ndmp9_data_state ds;
|
|
Packit Service |
392537 |
ndmp9_data_halt_reason dhr;
|
|
Packit Service |
392537 |
int count;
|
|
Packit Service |
392537 |
int finish;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 3, "Waiting for operation to halt");
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
for (count = 0; count < 10; count++) {
|
|
Packit Service |
392537 |
ndmca_mon_wait_for_something (sess, 2);
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (ndmca_monitor_get_states (sess) < 0)
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
#if 0
|
|
Packit Service |
392537 |
if (count > 2)
|
|
Packit Service |
392537 |
ndmca_mon_show_states(sess);
|
|
Packit Service |
392537 |
#endif
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ds = ca->data_state.state;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (ds == NDMP9_DATA_STATE_HALTED) {
|
|
Packit Service |
392537 |
dhr = ca->data_state.halt_reason;
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (count > 2) {
|
|
Packit Service |
392537 |
if (ds != NDMP9_DATA_STATE_HALTED)
|
|
Packit Service |
392537 |
ndmca_data_abort(sess);
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (count >= 10) {
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 0,
|
|
Packit Service |
392537 |
"Operation did not halt, something wrong");
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 2, "Operation halted, stopping");
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ds = ca->data_state.state;
|
|
Packit Service |
392537 |
dhr = ca->data_state.halt_reason;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (ds == NDMP9_DATA_STATE_HALTED) {
|
|
Packit Service |
392537 |
if (dhr == NDMP9_DATA_HALT_SUCCESSFUL) {
|
|
Packit Service |
392537 |
/* Successful operation */
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 0, "Operation ended OKAY");
|
|
Packit Service |
392537 |
finish = 0;
|
|
Packit Service |
392537 |
} else {
|
|
Packit Service |
392537 |
/* Questionable success */
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 0, "Operation ended questionably");
|
|
Packit Service |
392537 |
finish = 1;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
} else {
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 0, "Operation ended in failure");
|
|
Packit Service |
392537 |
finish = -1;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmca_data_stop (sess);
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
for (count = 0; count < 10; count++) {
|
|
Packit Service |
392537 |
if (ndmca_monitor_get_states(sess) < 0)
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
#if 0
|
|
Packit Service |
392537 |
if (count > 2)
|
|
Packit Service |
392537 |
ndmca_mon_show_states(sess);
|
|
Packit Service |
392537 |
#endif
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ds = ca->data_state.state;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (ds == NDMP9_DATA_STATE_IDLE) {
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (count >= 10) {
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 0,
|
|
Packit Service |
392537 |
"Operation did not stop, something wrong");
|
|
Packit Service |
392537 |
return -1;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
return finish;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
int
|
|
Packit Service |
392537 |
ndmca_monitor_get_states (struct ndm_session *sess)
|
|
Packit Service |
392537 |
{
|
|
Packit Service |
392537 |
struct ndm_control_agent *ca = &sess->control_acb;
|
|
Packit Service |
392537 |
int rc = 0;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (ndmca_data_get_state (sess) < 0)
|
|
Packit Service |
392537 |
rc = -1;
|
|
Packit Service |
392537 |
if (!ca->job.tape_tcp) {
|
|
Packit Service |
392537 |
if (ndmca_mover_get_state (sess) < 0)
|
|
Packit Service |
392537 |
rc = -1;
|
|
Packit Service |
392537 |
ndmca_tape_get_state_no_tattle (sess);
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
return rc;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
int
|
|
Packit Service |
392537 |
ndmca_monitor_load_next (struct ndm_session *sess)
|
|
Packit Service |
392537 |
{
|
|
Packit Service |
392537 |
struct ndm_control_agent *ca = &sess->control_acb;
|
|
Packit Service |
392537 |
int rc;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 1, "Operation requires next tape");
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmca_media_capture_mover_window (sess);
|
|
Packit Service |
392537 |
ndmca_media_calculate_offsets (sess);
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (ca->tape_mode == NDMP9_TAPE_RDWR_MODE) {
|
|
Packit Service |
392537 |
if (ca->mover_state.pause_reason != NDMP9_MOVER_PAUSE_EOM)
|
|
Packit Service |
392537 |
ndmca_media_write_filemarks (sess);
|
|
Packit Service |
392537 |
else
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 1, "At EOM, not writing filemarks");
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
rc = ndmca_media_unload_current(sess);
|
|
Packit Service |
392537 |
if (rc) return rc;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
rc = ndmca_media_load_next(sess);
|
|
Packit Service |
392537 |
if (rc) return rc;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
rc = ndmca_media_set_window_current (sess);
|
|
Packit Service |
392537 |
if (rc) return rc;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
rc = ndmca_mover_continue(sess);
|
|
Packit Service |
392537 |
if (rc) return rc;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 1, "Operation resuming");
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
return 0;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
/* VERY VERY HARD */
|
|
Packit Service |
392537 |
int
|
|
Packit Service |
392537 |
ndmca_monitor_seek_tape (struct ndm_session *sess)
|
|
Packit Service |
392537 |
{
|
|
Packit Service |
392537 |
struct ndm_control_agent *ca = &sess->control_acb;
|
|
Packit Service |
392537 |
int rc;
|
|
Packit Service |
392537 |
unsigned long long pos;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
pos = ca->last_notify_mover_paused.seek_position;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 1, "Operation requires a different tape");
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
/* ndmca_media_capture_mover_window (sess); // !!! */
|
|
Packit Service |
392537 |
ndmca_media_calculate_offsets (sess);
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
rc = ndmca_media_unload_current(sess);
|
|
Packit Service |
392537 |
if (rc) return rc;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
rc = ndmca_media_load_seek (sess, pos);
|
|
Packit Service |
392537 |
if (rc) return rc;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
rc = ndmca_media_set_window_current (sess);
|
|
Packit Service |
392537 |
if (rc) return rc;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
rc = ndmca_mover_continue(sess);
|
|
Packit Service |
392537 |
if (rc) return rc;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 1, "Operation resuming");
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
return 0;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
int
|
|
Packit Service |
392537 |
ndmca_monitor_unload_last_tape (struct ndm_session *sess)
|
|
Packit Service |
392537 |
{
|
|
Packit Service |
392537 |
struct ndm_control_agent *ca = &sess->control_acb;
|
|
Packit Service |
392537 |
int rc;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (!ca->media_is_loaded)
|
|
Packit Service |
392537 |
return 0;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmca_media_capture_mover_window (sess);
|
|
Packit Service |
392537 |
ndmca_media_calculate_offsets (sess);
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (ca->tape_mode == NDMP9_TAPE_RDWR_MODE) {
|
|
Packit Service |
392537 |
ndmca_media_write_filemarks (sess);
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
rc = ndmca_media_unload_current(sess);
|
|
Packit Service |
392537 |
if (rc) return rc;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
return 0;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
int
|
|
Packit Service |
392537 |
ndmca_mon_wait_for_something (struct ndm_session *sess, int max_delay_secs)
|
|
Packit Service |
392537 |
{
|
|
Packit Service |
392537 |
struct ndm_control_agent *ca = &sess->control_acb;
|
|
Packit Service |
392537 |
int delta, notices;
|
|
Packit Service |
392537 |
int time_ref = time(0) + max_delay_secs;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 5, "mon_wait_for_something() entered");
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
for (;;) {
|
|
Packit Service |
392537 |
delta = time_ref - time(0);
|
|
Packit Service |
392537 |
if (delta <= 0)
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
notices = 0;
|
|
Packit Service |
392537 |
if (ca->pending_notify_data_read) {
|
|
Packit Service |
392537 |
/* leave visible */
|
|
Packit Service |
392537 |
notices++;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
if (ca->pending_notify_data_halted) {
|
|
Packit Service |
392537 |
/* just used to "wake up" */
|
|
Packit Service |
392537 |
ca->pending_notify_data_halted = 0;
|
|
Packit Service |
392537 |
notices++;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
if (ca->pending_notify_mover_paused) {
|
|
Packit Service |
392537 |
/* leave visible */
|
|
Packit Service |
392537 |
notices++;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
if (ca->pending_notify_mover_halted) {
|
|
Packit Service |
392537 |
/* just used to "wake up" */
|
|
Packit Service |
392537 |
ca->pending_notify_mover_halted = 0;
|
|
Packit Service |
392537 |
notices++;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndma_session_quantum (sess, notices ? 0 : delta);
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
if (notices)
|
|
Packit Service |
392537 |
break;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
ndmalogf (sess, 0, 5, "mon_wait_for_something() happened, resid=%d",
|
|
Packit Service |
392537 |
delta);
|
|
Packit Service |
392537 |
|
|
Packit Service |
392537 |
return 0;
|
|
Packit Service |
392537 |
}
|
|
Packit Service |
392537 |
#endif /* !NDMOS_OPTION_NO_CONTROL_AGENT */
|