/*
* Amanda, The Advanced Maryland Automatic Network Disk Archiver
- * Copyright (c) 2009, 2010 Zmanda, Inc. All Rights Reserved.
+ * Copyright (c) 2009-2012 Zmanda, Inc. All Rights Reserved.
*
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 as published
- * by the Free Software Foundation.
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
arglist_start(argp, fmt);
g_vsnprintf(msg, sizeof(msg), fmt, argp);
arglist_end(argp);
- g_debug("XDT thd-%p: %s", g_thread_self(), msg);
+ g_debug("XDT: %s", msg);
}
/* "Fast forward" the slice list by the given length. This will free any
g_mutex_unlock(self->ring_mutex);
part_done:
- if (elt->cancelled) {
- g_timer_destroy(timer);
- return NULL;
- }
-
/* if we write all of the blocks, but the finish_file fails, then likely
* there was some buffering going on in the device driver, and the blocks
* did not all make it to permanent storage -- so it's a failed part. Note
* that we try to finish_file even if the part failed, just to be thorough. */
if (self->device->in_file) {
if (!device_finish_file(self->device))
- part_status = PART_FAILED;
+ if (!elt->cancelled) {
+ part_status = PART_FAILED;
+ }
}
g_timer_stop(timer);
msg->partnum = self->partnum;
msg->fileno = fileno;
msg->successful = self->last_part_successful = part_status != PART_FAILED;
- msg->eom = self->last_part_eom = (part_status == PART_LEOM || !msg->successful);
+ msg->eom = self->last_part_eom = part_status == PART_LEOM || self->device->is_eom;
msg->eof = self->last_part_eof = part_status == PART_EOF;
/* time runs backward on some test boxes, so make sure this is positive */
if (msg->duration < 0) msg->duration = 0;
- if (msg->successful)
+ if (msg->successful && msg->size > 0)
self->partnum++;
self->no_more_parts = msg->eof || (!msg->successful && !self->expect_cache_inform);
/* then signal all of our condition variables, so that threads waiting on them
* wake up and see elt->cancelled. */
- g_mutex_lock(self->state_mutex);
- g_cond_broadcast(self->state_cond);
- g_mutex_unlock(self->state_mutex);
-
g_mutex_lock(self->ring_mutex);
g_cond_broadcast(self->ring_add_cond);
g_cond_broadcast(self->ring_free_cond);
g_mutex_unlock(self->ring_mutex);
+ g_mutex_lock(self->state_mutex);
+ g_cond_broadcast(self->state_cond);
+ g_mutex_unlock(self->state_mutex);
+
return rv;
}
/* NOTE: this access is unsafe and may return inconsistent results (e.g, a
* partial write to the 64-bit value on a 32-bit system). This is ok for
* the moment, as it's only informational, but be warned. */
- return self->part_bytes_written;
+ if (self->device) {
+ return device_get_bytes_written(self->device);
+ } else {
+ return self->part_bytes_written;
+ }
}
static void