Kern's ToDo List
- 08 January 2003
+ 11 January 2003
Documentation to do: (a little bit at a time)
- Document running a test version.
- test and fix < code and | code.
For 1.29 release:
+- Why is catreq.c:111 Find vol called twice for a job?
+- Why is FirstWritten = -1 after label?
+- Add include list to end of chain in findlib
+- Fix cancel in find_one -- need jcr.
+- Write SetJobStatus() function so cancel status not lost.
+- Find out why Full saves run slower and slower (hashing?)
+- Test size of hash table needed in find_one using testfind.
+- Make 1.28c release
+- Rewrite find_one.c to use only pool_memory instead of
+ alloca and malloc.
- Make sure btraceback goes into /sbin not sysconf directory.
- Get correct error status from run_program or open_bpipe().
- Figure out how to allow multiple simultaneous file Volumes on
Mmsg(&mdb->cmd, "SELECT MediaId,VolumeName,VolJobs,VolFiles,VolBlocks,\
VolBytes,VolMounts,VolErrors,VolWrites,MaxVolBytes,VolCapacityBytes,\
VolRetention,VolUseDuration,MaxVolJobs,MaxVolFiles,Recycle,Slot,\
-FirstWritten FROM Media WHERE PoolId=%d AND MediaType='%s' AND VolStatus='%s' \
+FirstWritten,LastWritten \
+FROM Media WHERE PoolId=%d AND MediaType='%s' AND VolStatus='%s' \
ORDER BY MediaId", mr->PoolId, mr->MediaType, mr->VolStatus);
if (!QUERY_DB(mdb, mdb->cmd)) {
mr->Recycle = str_to_int64(row[15]);
mr->Slot = str_to_int64(row[16]);
bstrncpy(mr->cFirstWritten, row[17]!=NULL?row[17]:"", sizeof(mr->cFirstWritten));
+ mr->FirstWritten = (time_t)str_to_utime(mr->cFirstWritten);
+ bstrncpy(mr->cLastWritten, row[18]!=NULL?row[18]:"", sizeof(mr->cLastWritten));
+ mr->LastWritten = (time_t)str_to_utime(mr->cLastWritten);
sql_free_result(mdb);
Mmsg(&mdb->cmd, "SELECT MediaId,VolumeName,VolJobs,VolFiles,VolBlocks,\
VolBytes,VolMounts,VolErrors,VolWrites,MaxVolBytes,VolCapacityBytes,\
MediaType,VolStatus,PoolId,VolRetention,VolUseDuration,MaxVolJobs,MaxVolFiles,\
-Recycle,Slot, FirstWritten \
+Recycle,Slot,FirstWritten,LastWritten \
FROM Media WHERE MediaId=%d", mr->MediaId);
} else { /* find by name */
Mmsg(&mdb->cmd, "SELECT MediaId,VolumeName,VolJobs,VolFiles,VolBlocks,\
VolBytes,VolMounts,VolErrors,VolWrites,MaxVolBytes,VolCapacityBytes,\
MediaType,VolStatus,PoolId,VolRetention,VolUseDuration,MaxVolJobs,MaxVolFiles,\
-Recycle,Slot,FirstWritten \
+Recycle,Slot,FirstWritten,LastWritten \
FROM Media WHERE VolumeName='%s'", mr->VolumeName);
}
mr->Recycle = str_to_int64(row[18]);
mr->Slot = str_to_int64(row[19]);
bstrncpy(mr->cFirstWritten, row[20]!=NULL?row[20]:"", sizeof(mr->cFirstWritten));
+ mr->FirstWritten = (time_t)str_to_utime(mr->cFirstWritten);
+ bstrncpy(mr->cLastWritten, row[21]!=NULL?row[21]:"", sizeof(mr->cLastWritten));
+ mr->LastWritten = (time_t)str_to_utime(mr->cLastWritten);
stat = mr->MediaId;
}
} else {
int
db_update_media_record(B_DB *mdb, MEDIA_DBR *mr)
{
- char dt[MAX_TIME_LENGTH];
+ char dt[MAX_TIME_LENGTH], dtF[MAX_TIME_LENGTH];
time_t ttime;
struct tm tm;
int stat;
Dmsg1(100, "update_media: FirstWritten=%d\n", mr->FirstWritten);
db_lock(mdb);
- if (mr->VolMounts == 1 && mr->VolBlocks==1 && mr->VolWrites==1) {
+ if (mr->VolJobs == 1) {
Dmsg1(400, "Set FirstWritten Vol=%s\n", mr->VolumeName);
+ ttime = mr->FirstWritten;
+ localtime_r(&ttime, &tm);
+ strftime(dtF, sizeof(dtF), "%Y-%m-%d %T", &tm);
Mmsg(&mdb->cmd, "UPDATE Media SET FirstWritten='%s'\
- WHERE VolumeName='%s'", dt, mr->VolumeName);
+ WHERE VolumeName='%s'", dtF, mr->VolumeName);
stat = UPDATE_DB(mdb, mdb->cmd);
Dmsg1(400, "Firstwritten stat=%d\n", stat);
}
}
}
/* Check if use duration has expired */
- if (ok && mr.VolUseDuration > 0 &&
- strcmp(mr.VolStatus, "Recycle") != 0) {
+ Dmsg2(200, "VolJobs=%d FirstWritten=%d\n", mr.VolJobs, mr.FirstWritten);
+ if (ok && mr.VolJobs > 0 && mr.VolUseDuration > 0 &&
+ strcmp(mr.VolStatus, "Recycle") != 0) {
utime_t now = time(NULL);
- utime_t start = str_to_utime(mr.cFirstWritten);
- if (start > 0 && mr.VolUseDuration <= (now - start)) {
+ if (mr.VolUseDuration <= (now - mr.FirstWritten)) {
Dmsg4(100, "Duration=%d now=%d start=%d now-start=%d\n",
- (int)jcr->pool->VolUseDuration, (int)now, (int)start, (int)(now-start));
+ (int)jcr->pool->VolUseDuration, (int)now, (int)mr.FirstWritten,
+ (int)(now-mr.FirstWritten));
Jmsg(jcr, M_INFO, 0, _("Max configured use duration exceeded. "
"Marking Volume \"%s\" as Used.\n"), mr.VolumeName);
strcpy(mr.VolStatus, "Used"); /* yes, mark as used */
edit_uint64(mr.MaxVolBytes, ed2),
edit_uint64(mr.VolCapacityBytes, ed3),
mr.VolStatus, mr.Slot, mr.MaxVolJobs, mr.MaxVolFiles);
+ Dmsg1(200, "Find media: %s", bs->msg);
} else {
bnet_fsend(bs, "1999 No Media\n");
}
edit_uint64(mr.MaxVolBytes, ed2),
edit_uint64(mr.VolCapacityBytes, ed3),
mr.VolStatus, mr.Slot, mr.MaxVolJobs, mr.MaxVolFiles);
- Dmsg5(200, "get_media_record PoolId=%d wanted %d, Status=%s, Slot=%d \
-MediaType=%s\n", mr.PoolId, jcr->PoolId, mr.VolStatus, mr.Slot, mr.MediaType);
+ Dmsg1(200, "Vol Info: %s", bs->msg);
} else {
/* Not suitable volume */
bnet_fsend(bs, "1998 Volume \"%s\"not appropriate.\n",
bnet_fsend(bs, "1991 Catalog Request failed: %s", db_strerror(jcr->db));
return;
}
+ /* Set first written time if this is first job */
+ if (mr.VolJobs == 0) {
+ mr.FirstWritten = jcr->start_time; /* use Job start time as first write */
+ }
+ Dmsg2(200, "Update media: BefVolJobs=%u After=%u\n", mr.VolJobs, sdmr.VolJobs);
/* Copy updated values to original media record */
mr.VolJobs = sdmr.VolJobs;
mr.VolFiles = sdmr.VolFiles;
/* Finally, check Use duration expiration */
} else if (mr.VolUseDuration > 0) {
- utime_t start;
utime_t now = time(NULL);
- start = str_to_utime(mr.cFirstWritten);
/* See if Vol Use has expired */
- if (start > 0 && mr.VolUseDuration <= (now - start)) {
+ if (mr.VolUseDuration <= (now - mr.FirstWritten)) {
Jmsg(jcr, M_INFO, 0, _("Max configured use duration exceeded. "
"Marking Volume \"%s\"as Used.\n"), mr.VolumeName);
strcpy(mr.VolStatus, "Used"); /* yes, mark as used */
*p++ = 0; /* terminate keyword and point to value */
/* Unquote quoted values */
if (*p == '"') {
- Dmsg1(000, "Start with quote: %s\n", p);
for (n = q = ++p; *p && *p != '"'; ) {
if (*p == '\\') {
p++;
stream = encode_attribsEx(jcr, attribsEx, ff_pkt);
Dmsg3(200, "File %s\nattribs=%s\nattribsEx=%s\n", ff_pkt->fname, attribs, attribsEx);
+ P(jcr->mutex);
jcr->JobFiles++; /* increment number of files sent */
pm_strcpy(&jcr->last_fname, ff_pkt->fname);
+ V(jcr->mutex);
/*
* Send Attributes header to Storage daemon
}
Dmsg1(100, ">stored: attrhdr %s\n", sd->msg);
- /*
- * Send file attributes to Storage daemon
+ /*
+ * Send file attributes to Storage daemon
* File_index
* File type
* Filename (full path)
*
*/
/*
- Copyright (C) 2000, 2001, 2002 Kern Sibbald and John Walker
+ Copyright (C) 2000-2003 Kern Sibbald and John Walker
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
break;
case CF_EXTRACT:
extract = TRUE;
+ P(jcr->mutex);
pm_strcpy(&jcr->last_fname, ofile);
+ V(jcr->mutex);
/* Fall-through wanted */
case CF_CREATED:
jcr->JobFiles++;
*
*/
/*
- Copyright (C) 2000, 2001, 2002 Kern Sibbald and John Walker
+ Copyright (C) 2000-2003 Kern Sibbald and John Walker
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
edit_uint64_with_commas(njcr->num_files_examined, b1));
sendit(msg, len, arg);
if (njcr->JobFiles > 0) {
+ P(njcr->mutex);
len = Mmsg(&msg, _(" Processing file: %s\n"), njcr->last_fname);
+ V(njcr->mutex);
sendit(msg, len, arg);
}
encode_stat(attribs, &ff_pkt->statp);
+ P(jcr->mutex);
jcr->JobFiles++; /* increment number of files sent */
pm_strcpy(&jcr->last_fname, ff_pkt->fname);
+ V(jcr->mutex);
/*
*
*/
/*
- Copyright (C) 2000, 2001, 2002 Kern Sibbald and John Walker
+ Copyright (C) 2000-2003 Kern Sibbald and John Walker
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
} else {
*lname = 0;
}
+ P(jcr->mutex);
jcr->JobFiles++;
jcr->num_files_examined++;
pm_strcpy(&jcr->last_fname, fname); /* last file examined */
+ V(jcr->mutex);
/*
* Send file attributes to Director
/* Imported functions */
int find_one_file(FF_PKT *ff, int handle_file(FF_PKT *ff_pkt, void *hpkt),
void *pkt, char *p, dev_t parent_device, int top_level);
-void term_find_one(FF_PKT *ff);
+int term_find_one(FF_PKT *ff);
size_t name_max; /* filename max length */
size_t path_max; /* path name max length */
* Terminate find_files() and release
* all allocated memory
*/
-void
+int
term_find_files(FF_PKT *ff)
{
+ int hard_links;
+
term_include_exclude_files(ff);
free_pool_memory(ff->sys_fname);
- term_find_one(ff);
+ hard_links = term_find_one(ff);
free(ff);
- return;
+ return hard_links;
}
}
/* File not previously dumped. Chain it into our list. */
- lp = (struct f_link *)bmalloc(sizeof (struct f_link) + strlen(fname));
+ lp = (struct f_link *)bmalloc(sizeof(struct f_link) + strlen(fname) +1);
lp->ino = ff_pkt->statp.st_ino;
lp->dev = ff_pkt->statp.st_dev;
- strcpy (lp->name, fname);
+ strcpy(lp->name, fname);
lp->next = ff_pkt->linklist;
ff_pkt->linklist = lp;
}
return handle_file(ff_pkt, pkt);
}
-void term_find_one(FF_PKT *ff)
+int term_find_one(FF_PKT *ff)
{
struct f_link *lp, *lc;
+ int count = 0;
/* Free up list of hard linked files */
for (lp = ff->linklist; lp;) {
lp = lp->next;
if (lc) {
free(lc);
+ count++;
}
}
- return;
+ return count;
}
FF_PKT *init_find_files();
void set_find_options(FF_PKT *ff, int incremental, time_t mtime);
int find_files(FF_PKT *ff, int sub(FF_PKT *ff_pkt, void *hpkt), void *pkt);
-void term_find_files(FF_PKT *ff);
+int term_find_files(FF_PKT *ff);
/* From match.c */
void init_include_exclude_files(FF_PKT *ff);
if (sscanf(str, "%d-%d-%d %d:%d:%d", &tm.tm_year, &tm.tm_mon, &tm.tm_mday,
&tm.tm_hour, &tm.tm_min, &tm.tm_sec) != 6) {
- return -1;
+ return 0;
+ }
+ if (tm.tm_mon > 0) {
+ tm.tm_mon--;
+ }
+ if (tm.tm_year >= 1900) {
+ tm.tm_year -= 1900;
+ } else {
+ tm.tm_year = 0;
}
- tm.tm_mon--;
- tm.tm_year -= 1900;
return (utime_t)mktime(&tm);
}
* Version $Id$
*/
/*
- Copyright (C) 2000, 2001, 2002 Kern Sibbald and John Walker
+ Copyright (C) 2000-2003 Kern Sibbald and John Walker
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
dev->VolCatInfo.VolCatFiles++; /* increment number of files */
dev->VolCatInfo.VolCatJobs++; /* increment number of jobs */
/* Note! do volume update before close, which zaps VolCatInfo */
- Dmsg0(100, "dir_update_vol_info. Release\n");
+ Dmsg0(200, "dir_update_vol_info. Release0\n");
dir_update_volume_info(jcr, &dev->VolCatInfo, 0); /* send Volume info to Director */
if (!dev_is_tape(dev) || !(dev->capabilities & CAP_ALWAYSOPEN)) {
} else {
Dmsg0(100, "dir_create_jobmedia_record. Release\n");
dir_create_jobmedia_record(jcr);
- Dmsg0(100, "dir_update_vol_info. Release\n");
+ Dmsg0(200, "dir_update_vol_info. Release1\n");
dev->VolCatInfo.VolCatJobs++; /* increment number of jobs */
dir_update_volume_info(jcr, &dev->VolCatInfo, 0); /* send Volume info to Director */
}
* Version $Id$
*/
/*
- Copyright (C) 2000, 2001, 2002 Kern Sibbald and John Walker
+ Copyright (C) 2000-2003 Kern Sibbald and John Walker
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
Dmsg1(000, "%s", dev->errmsg);
/* Attempt to reposition to re-read the block */
if (dev->state & ST_TAPE) {
- Dmsg0(000, "Backspace record for reread.\n");
+ Dmsg0(100, "Backspace record for reread.\n");
if (bsf_dev(dev, 1) != 0) {
Emsg0(M_ERROR, 0, dev->errmsg);
return 0;
}
} else {
- Dmsg0(000, "Seek to beginning of block for reread.\n");
+ Dmsg0(100, "Seek to beginning of block for reread.\n");
off_t pos = lseek(dev->fd, (off_t)0, SEEK_CUR); /* get curr pos */
pos -= block->read_len;
lseek(dev->fd, pos, SEEK_SET);
* Version $Id$
*/
/*
- Copyright (C) 2000, 2001, 2002 Kern Sibbald and John Walker
+ Copyright (C) 2000-2003 Kern Sibbald and John Walker
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
}
strcpy(dev->VolCatInfo.VolCatStatus, "Full");
- Dmsg2(100, "Call update_vol_info Stat=%s Vol=%s\n",
+ Dmsg2(200, "Call update_vol_info Stat=%s Vol=%s\n",
dev->VolCatInfo.VolCatStatus, dev->VolCatInfo.VolCatName);
if (!dir_update_volume_info(jcr, &dev->VolCatInfo, 0)) { /* send Volume info to Director */
Jmsg(jcr, M_ERROR, 0, _("Could not update Volume info Volume=%s Job=%s\n"),
* Version $Id$
*/
/*
- Copyright (C) 2000, 2001, 2002 Kern Sibbald and John Walker
+ Copyright (C) 2000-2003 Kern Sibbald and John Walker
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
Setting slot to zero in catalog.\n"),
jcr->VolCatInfo.VolCatName, jcr->VolCatInfo.Slot);
jcr->VolCatInfo.Slot = 0; /* invalidate slot */
+ Dmsg0(200, "update vol info in mount\n");
dir_update_volume_info(jcr, &jcr->VolCatInfo, 1); /* set slot */
}
Dmsg0(100, "Default\n");
/* Recreate a correct volume label and return it in the block */
write_volume_label_to_block(jcr, dev, block);
/* Set or reset Volume statistics */
- dev->VolCatInfo.VolCatJobs = 1;
- dev->VolCatInfo.VolCatFiles = 1;
+ dev->VolCatInfo.VolCatJobs = 0;
+ dev->VolCatInfo.VolCatFiles = 0;
dev->VolCatInfo.VolCatErrors = 0;
- dev->VolCatInfo.VolCatBlocks = 1;
+ dev->VolCatInfo.VolCatBlocks = 0;
if (recycle) {
dev->VolCatInfo.VolCatMounts++;
dev->VolCatInfo.VolCatRecycles++;
dev->VolCatInfo.VolCatReads = 1;
}
strcpy(dev->VolCatInfo.VolCatStatus, "Append");
- Dmsg0(100, "dir_update_vol_info. Set Append\n");
+ Dmsg0(200, "dir_update_vol_info. Set Append\n");
dir_update_volume_info(jcr, &dev->VolCatInfo, 1); /* indicate doing relabel */
if (recycle) {
Jmsg(jcr, M_INFO, 0, _("Recycled volume %s on device %s, all previous data lost.\n"),
Jmsg(jcr, M_INFO, 0, _("Marking Volume %s in Error in Catalog.\n"),
jcr->VolumeName);
strcpy(dev->VolCatInfo.VolCatStatus, "Error");
- Dmsg0(100, "dir_update_vol_info. Set Error.\n");
+ Dmsg0(200, "dir_update_vol_info. Set Error.\n");
dir_update_volume_info(jcr, &dev->VolCatInfo, 0);
goto mount_next_vol;
}
The number of files mismatch! Volume=%d Catalog=%d\n"),
dev_file(dev)+1, dev->VolCatInfo.VolCatFiles);
strcpy(dev->VolCatInfo.VolCatStatus, "Error");
- Dmsg0(100, "dir_update_vol_info. Set Error.\n");
+ Dmsg0(200, "dir_update_vol_info. Set Error.\n");
dir_update_volume_info(jcr, &dev->VolCatInfo, 0);
goto mount_next_vol;
}
}
dev->VolCatInfo.VolCatMounts++; /* Update mounts */
+ Dmsg1(200, "update volinfo mounts=%d\n", dev->VolCatInfo.VolCatMounts);
dir_update_volume_info(jcr, &dev->VolCatInfo, 0);
/* Return an empty block */
empty_block(block); /* we used it for reading so set for write */
{
FF_PKT *ff;
char name[1000];
- int i, ch;
+ int i, ch, hard_links;
while ((ch = getopt(argc, argv, "ad:?")) != -1) {
switch (ch) {
}
find_files(ff, print_file, NULL);
- term_find_files(ff);
+ hard_links = term_find_files(ff);
printf(_("\
Total files : %d\n\
Max file length: %d\n\
Max path length: %d\n\
Files truncated: %d\n\
-Paths truncated: %d\n"),
+Paths truncated: %d\n\
+Hard links : %d\n"),
num_files, max_file_len, max_path_len,
- trunc_fname, trunc_path);
+ trunc_fname, trunc_path, hard_links);
close_memory_pool();
sm_dump(False);
/* */
#define VERSION "1.29"
#define VSTRING "1"
-#define DATE "9 January 2003"
-#define LSMDATE "09Jan03"
+#define DATE "12 January 2003"
+#define LSMDATE "12Jan03"
/* Debug flags */
#define DEBUG 1