Skip to content

Commit

Permalink
check return values of spool functions
Browse files Browse the repository at this point in the history
We now check the return values of

* begin_data_spool()
* begin_attribute_spool()

as otherwise the job hangs until eternety if there is a problem with the
spool file.

Fixes: #265: job hangs and cannot be terminated if spool file is not writable
  • Loading branch information
pstorz committed Jan 6, 2014
1 parent 68bd762 commit 9204714
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 33 deletions.
23 changes: 15 additions & 8 deletions src/stored/append.c
Expand Up @@ -69,19 +69,16 @@ bool do_append_data(JCR *jcr, BSOCK *bs, const char *what)
Dmsg1(100, "Start append data. res=%d\n", dev->num_reserved());

if (!bs->set_buffer_size(dcr->device->max_network_buffer_size, BNET_SETBUF_WRITE)) {
jcr->setJobStatus(JS_ErrorTerminated);
Jmsg0(jcr, M_FATAL, 0, _("Unable to set network buffer size.\n"));
return false;
goto bail_out;
}

if (!acquire_device_for_append(dcr)) {
jcr->setJobStatus(JS_ErrorTerminated);
return false;
goto bail_out;
}

if (generate_plugin_event(jcr, bsdEventSetupRecordTranslation, dcr) != bRC_OK) {
jcr->setJobStatus(JS_ErrorTerminated);
return false;
goto bail_out;
}

jcr->sendJobStatus(JS_Running);
Expand All @@ -91,8 +88,14 @@ bool do_append_data(JCR *jcr, BSOCK *bs, const char *what)
}
Dmsg1(50, "Begin append device=%s\n", dev->print_name());

begin_data_spool(dcr);
begin_attribute_spool(jcr);
if (!begin_data_spool(dcr) ) {
goto bail_out;
}

if (!begin_attribute_spool(jcr)) {
discard_data_spool(dcr);
goto bail_out;
}

Dmsg0(100, "Just after acquire_device_for_append\n");
if (dev->VolCatInfo.VolCatName[0] == 0) {
Expand Down Expand Up @@ -339,6 +342,10 @@ bool do_append_data(JCR *jcr, BSOCK *bs, const char *what)

Dmsg1(100, "return from do_append_data() ok=%d\n", ok);
return ok;

bail_out:
jcr->setJobStatus(JS_ErrorTerminated);
return false;
}

/*
Expand Down
27 changes: 19 additions & 8 deletions src/stored/mac.c
Expand Up @@ -462,7 +462,7 @@ bool do_mac_run(JCR *jcr)
* Ready devices for reading.
*/
if (!acquire_device_for_read(jcr->read_dcr)) {
jcr->setJobStatus(JS_ErrorTerminated);
ok = false;
goto bail_out;
}

Expand All @@ -475,8 +475,8 @@ bool do_mac_run(JCR *jcr)
*/
sd = jcr->store_bsock;
if (!sd->set_buffer_size(me->max_network_buffer_size, BNET_SETBUF_WRITE)) {
jcr->setJobStatus(JS_ErrorTerminated);
Jmsg(jcr, M_FATAL, 0, _("Cannot set buffer size SD->SD.\n"));
ok = false;
goto bail_out;
}

Expand Down Expand Up @@ -511,7 +511,7 @@ bool do_mac_run(JCR *jcr)
* Expect to get response to the replicate data cmd from Storage daemon
*/
if (!response(jcr, sd, OK_data, "replicate data")) {
jcr->setJobStatus(JS_ErrorTerminated);
ok = false;
goto bail_out;
}

Expand All @@ -536,7 +536,7 @@ bool do_mac_run(JCR *jcr)
* Expect to get response that the replicate data succeeded.
*/
if (!response(jcr, sd, OK_replicate, "replicate data")) {
jcr->setJobStatus(JS_ErrorTerminated);
ok = false;
goto bail_out;
}

Expand All @@ -550,7 +550,7 @@ bool do_mac_run(JCR *jcr)
* Expect to get response to the end replicate cmd from Storage daemon
*/
if (!response(jcr, sd, OK_end_replicate, "end replicate")) {
jcr->setJobStatus(JS_ErrorTerminated);
ok = false;
goto bail_out;
}

Expand All @@ -571,16 +571,23 @@ bool do_mac_run(JCR *jcr)
*/
if (!acquire_device_for_read(jcr->read_dcr) ||
!acquire_device_for_append(jcr->dcr)) {
jcr->setJobStatus(JS_ErrorTerminated);
ok = false;
goto bail_out;
}

Dmsg2(200, "===== After acquire pos %u:%u\n", jcr->dcr->dev->file, jcr->dcr->dev->block_num);

jcr->sendJobStatus(JS_Running);

begin_data_spool(jcr->dcr);
begin_attribute_spool(jcr);
if (!begin_data_spool(jcr->dcr) ) {
ok = false;
goto bail_out;
}

if (!begin_attribute_spool(jcr)) {
ok = false;
goto bail_out;
}

jcr->dcr->VolFirstIndex = jcr->dcr->VolLastIndex = 0;
jcr->run_time = time(NULL);
Expand All @@ -594,6 +601,10 @@ bool do_mac_run(JCR *jcr)
}

bail_out:
if (!ok) {
jcr->setJobStatus(JS_ErrorTerminated);
}

if (!jcr->remote_replicate && jcr->dcr) {
/*
* Don't use time_t for job_elapsed as time_t can be 32 or 64 bits,
Expand Down
33 changes: 16 additions & 17 deletions src/stored/ndmp_tape.c
Expand Up @@ -626,16 +626,14 @@ extern "C" ndmp9_error bndmp_tape_open(struct ndm_session *sess,
* Actually acquire the device which we reserved.
*/
if (!acquire_device_for_append(dcr)) {
jcr->setJobStatus(JS_ErrorTerminated);
return NDMP9_NO_DEVICE_ERR;
goto bail_out;
}

/*
* Let any SD plugin know now its time to setup the record translation infra.
*/
if (generate_plugin_event(jcr, bsdEventSetupRecordTranslation, dcr) != bRC_OK) {
jcr->setJobStatus(JS_ErrorTerminated);
return NDMP9_NO_DEVICE_ERR;
goto bail_out;
}

/*
Expand All @@ -655,7 +653,10 @@ extern "C" ndmp9_error bndmp_tape_open(struct ndm_session *sess,
* set per NDMP backup stream we only setup data spooling and not
* attribute spooling.
*/
begin_data_spool(dcr);

if (!begin_data_spool(dcr) ) {
goto bail_out;
}

/*
* Write Begin Session Record
Expand All @@ -664,8 +665,7 @@ extern "C" ndmp9_error bndmp_tape_open(struct ndm_session *sess,
Jmsg1(jcr, M_FATAL, 0,
_("Write session label failed. ERR=%s\n"),
dcr->dev->bstrerror());
jcr->setJobStatus(JS_ErrorTerminated);
return NDMP9_NO_DEVICE_ERR;
goto bail_out;
}

dcr->VolFirstIndex = dcr->VolLastIndex = 0;
Expand Down Expand Up @@ -696,8 +696,7 @@ extern "C" ndmp9_error bndmp_tape_open(struct ndm_session *sess,
if (!bndmp_create_virtual_file(jcr, virtual_filename.c_str())) {
Jmsg0(jcr, M_FATAL, 0,
_("Creating virtual file attributes failed.\n"));
jcr->setJobStatus(JS_ErrorTerminated);
return NDMP9_NO_DEVICE_ERR;
goto bail_out;
}
} else {
bool ok = true;
Expand All @@ -711,8 +710,7 @@ extern "C" ndmp9_error bndmp_tape_open(struct ndm_session *sess,

if (jcr->NumReadVolumes == 0) {
Jmsg(jcr, M_FATAL, 0, _("No Volume names found for restore.\n"));
jcr->setJobStatus(JS_ErrorTerminated);
return NDMP9_NO_DEVICE_ERR;
goto bail_out;
}

Dmsg2(200, "Found %d volumes names to restore. First=%s\n",
Expand All @@ -722,16 +720,14 @@ extern "C" ndmp9_error bndmp_tape_open(struct ndm_session *sess,
* Ready device for reading
*/
if (!acquire_device_for_read(dcr)) {
jcr->setJobStatus(JS_ErrorTerminated);
return NDMP9_NO_DEVICE_ERR;
goto bail_out;
}

/*
* Let any SD plugin know now its time to setup the record translation infra.
*/
if (generate_plugin_event(jcr, bsdEventSetupRecordTranslation, dcr) != bRC_OK) {
jcr->setJobStatus(JS_ErrorTerminated);
return NDMP9_NO_DEVICE_ERR;
goto bail_out;
}

/*
Expand Down Expand Up @@ -763,8 +759,7 @@ extern "C" ndmp9_error bndmp_tape_open(struct ndm_session *sess,
Jmsg1(jcr, M_FATAL, 0,
_("Read session label failed. ERR=%s\n"),
dcr->dev->bstrerror());
jcr->setJobStatus(JS_ErrorTerminated);
return NDMP9_NO_DEVICE_ERR;
goto bail_out;
}

read_context_set_record(dcr, rctx);
Expand Down Expand Up @@ -793,6 +788,10 @@ extern "C" ndmp9_error bndmp_tape_open(struct ndm_session *sess,
ta->tape_state.space_remain.valid = NDMP9_VALIDITY_INVALID;

return NDMP9_NO_ERR;

bail_out:
jcr->setJobStatus(JS_ErrorTerminated);
return NDMP9_NO_DEVICE_ERR;
}

extern "C" ndmp9_error bndmp_tape_close(struct ndm_session *sess)
Expand Down

0 comments on commit 9204714

Please sign in to comment.