/*
Bacula® - The Network Backup Solution
- Copyright (C) 2000-2008 Free Software Foundation Europe e.V.
+ Copyright (C) 2000-2010 Free Software Foundation Europe e.V.
The main author of Bacula is Kern Sibbald, with contributions from
many others, a complete list can be found in the file AUTHORS.
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- Bacula® is a registered trademark of John Walker.
+ Bacula® is a registered trademark of Kern Sibbald.
The licensor of Bacula is the Free Software Foundation Europe
(FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
Switzerland, email:ftf@fsfeurope.org.
*
* Kern Sibbald, December 2000
*
- * Version $Id$
*/
#include "bacula.h" /* pull in global headers */
"changer_name=%s media_type=%s volume_name=%s\n";
-/* Send update information about a device to Director */
+/** Send update information about a device to Director */
bool dir_update_device(JCR *jcr, DEVICE *dev)
{
BSOCK *dir = jcr->dir_bsock;
#endif
-/*
+/**
* Send current JobStatus to Director
*/
bool dir_send_job_status(JCR *jcr)
return jcr->dir_bsock->fsend(Job_status, jcr->Job, jcr->JobStatus);
}
-/*
+/**
* Common routine for:
* dir_get_volume_info()
* and
int n;
int32_t InChanger;
+ dcr->setVolCatInfo(false);
if (dir->recv() <= 0) {
Dmsg0(200, "getvolname error bnet_recv\n");
Mmsg(jcr->errmsg, _("Network error on bnet_recv in req_vol_info.\n"));
return false;
}
vol.InChanger = InChanger; /* bool in structure */
+ vol.is_valid = true;
unbash_spaces(vol.VolCatName);
bstrncpy(dcr->VolumeName, vol.VolCatName, sizeof(dcr->VolumeName));
dcr->VolCatInfo = vol; /* structure assignment */
}
-/*
+/**
* Get Volume info for a specific volume from the Director's Database
*
* Returns: true on success (Director guarantees that Pool and MediaType
BSOCK *dir = jcr->dir_bsock;
P(vol_info_mutex);
- bstrncpy(dcr->VolCatInfo.VolCatName, dcr->VolumeName, sizeof(dcr->VolCatInfo.VolCatName));
- bash_spaces(dcr->VolCatInfo.VolCatName);
- dir->fsend(Get_Vol_Info, jcr->Job, dcr->VolCatInfo.VolCatName,
+ dcr->setVolCatName(dcr->VolumeName);
+ bash_spaces(dcr->getVolCatName());
+ dir->fsend(Get_Vol_Info, jcr->Job, dcr->getVolCatName(),
writing==GET_VOL_INFO_FOR_WRITE?1:0);
Dmsg1(100, ">dird %s", dir->msg);
- unbash_spaces(dcr->VolCatInfo.VolCatName);
+ unbash_spaces(dcr->getVolCatName());
bool ok = do_get_volume_info(dcr);
V(vol_info_mutex);
return ok;
-/*
+/**
* Get info on the next appendable volume in the Director's database
*
* Returns: true on success dcr->VolumeName is volume
break;
}
bstrncpy(lastVolume, dcr->VolumeName, sizeof(lastVolume));
- if (dcr->can_i_use_volume()) {
+ if (dcr->can_i_write_volume()) {
Dmsg1(100, "Call reserve_volume. Vol=%s\n", dcr->VolumeName);
if (reserve_volume(dcr, dcr->VolumeName) == NULL) {
Dmsg2(100, "Could not reserve volume %s on %s\n", dcr->VolumeName,
}
-/*
+/**
* After writing a Volume, send the updated statistics
* back to the director. The information comes from the
* dev record.
POOL_MEM VolumeName;
/* If system job, do not update catalog */
- if (jcr->JobType == JT_SYSTEM) {
+ if (jcr->getJobType() == JT_SYSTEM) {
return true;
}
/* Lock during Volume update */
P(vol_info_mutex);
- Dmsg1(100, "Update cat VolFiles=%d\n", dev->file);
+ Dmsg1(100, "Update cat VolBytes=%lld\n", vol->VolCatBytes);
/* Just labeled or relabeled the tape */
if (label) {
bstrncpy(vol->VolCatStatus, "Append", sizeof(vol->VolCatStatus));
return ok;
}
-/*
+/**
* After writing a Volume, create the JobMedia record.
*/
-bool dir_create_jobmedia_record(DCR *dcr)
+bool dir_create_jobmedia_record(DCR *dcr, bool zero)
{
JCR *jcr = dcr->jcr;
BSOCK *dir = jcr->dir_bsock;
char ed1[50];
/* If system job, do not update catalog */
- if (jcr->JobType == JT_SYSTEM) {
+ if (jcr->getJobType() == JT_SYSTEM) {
+ return true;
+ }
+
+ /* Throw out records where FI is zero -- i.e. nothing done */
+ if (!zero && dcr->VolFirstIndex == 0 &&
+ (dcr->StartBlock != 0 || dcr->EndBlock != 0)) {
+ Dmsg0(100, "JobMedia FI=0 StartBlock!=0 record suppressed\n");
return true;
}
}
dcr->WroteVol = false;
- dir->fsend(Create_job_media, jcr->Job,
- dcr->VolFirstIndex, dcr->VolLastIndex,
- dcr->StartFile, dcr->EndFile,
- dcr->StartBlock, dcr->EndBlock,
- dcr->Copy, dcr->Stripe,
- edit_uint64(dcr->VolMediaId, ed1));
- Dmsg1(100, ">dird %s", dir->msg);
+ if (zero) {
+ /* Send dummy place holder to avoid purging */
+ dir->fsend(Create_job_media, jcr->Job,
+ 0 , 0, 0, 0, 0, 0, 0, 0, edit_uint64(dcr->VolMediaId, ed1));
+ } else {
+ dir->fsend(Create_job_media, jcr->Job,
+ dcr->VolFirstIndex, dcr->VolLastIndex,
+ dcr->StartFile, dcr->EndFile,
+ dcr->StartBlock, dcr->EndBlock,
+ dcr->Copy, dcr->Stripe,
+ edit_uint64(dcr->VolMediaId, ed1));
+ }
+ Dmsg1(100, ">dird %s", dir->msg);
if (dir->recv() <= 0) {
Dmsg0(190, "create_jobmedia error bnet_recv\n");
Jmsg(jcr, M_FATAL, 0, _("Error creating JobMedia record: ERR=%s\n"),
}
-/*
+/**
* Update File Attribute data
+ * We do the following:
+ * 1. expand the bsock buffer to be large enough
+ * 2. Write a "header" into the buffer with serialized data
+ * VolSessionId
+ * VolSeesionTime
+ * FileIndex
+ * Stream
+ * data length that follows
+ * start of raw byte data from the Device record.
+ * Note, this is primarily for Attribute data, but can
+ * also handle any device record. The Director must know
+ * the raw byte data format that is defined for each Stream.
+ * Now Restore Objects pass through here STREAM_RESTORE_OBJECT
*/
bool dir_update_file_attributes(DCR *dcr, DEV_RECORD *rec)
{
ser_bytes(rec->data, rec->data_len);
dir->msglen = ser_length(dir->msg);
Dmsg1(1800, ">dird %s\n", dir->msg); /* Attributes */
+ if (rec->Stream == STREAM_UNIX_ATTRIBUTES ||
+ rec->Stream == STREAM_UNIX_ATTRIBUTES_EX) {
+ dir->set_data_end(); /* set offset of last valid data */
+ }
return dir->send();
}
-/*
+/**
* Request the sysop to create an appendable volume
*
* Entered with device blocked.
JCR *jcr = dcr->jcr;
bool got_vol = false;
+ if (job_canceled(jcr)) {
+ return false;
+ }
Dmsg0(400, "enter dir_ask_sysop_to_create_appendable_volume\n");
ASSERT(dev->blocked());
for ( ;; ) {
} else {
if (stat == W_TIMEOUT || stat == W_MOUNT) {
Mmsg(dev->errmsg, _(
-"Job %s waiting. Cannot find any appendable volumes.\n"
-"Please use the \"label\" command to create a new Volume for:\n"
+"Job %s is waiting. Cannot find any appendable volumes.\n"
+"Please use the \"label\" command to create a new Volume for:\n"
" Storage: %s\n"
" Pool: %s\n"
" Media type: %s\n"),
return true;
}
-/*
+/**
* Request to mount specific Volume
*
* Entered with device blocked and dcr->VolumeName is desired