X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Ffiled%2Faccurate.c;h=d7ff0437573a5c3c59bc15a7035703566d5a22d3;hb=edfffe456de676cc799719b684f883976d467f06;hp=2f076a64b79e8fb6ba0a691ad96295b47a8e8243;hpb=044e73d86a759754a4a8116f9673f0ecb4ccf93a;p=bacula%2Fbacula diff --git a/bacula/src/filed/accurate.c b/bacula/src/filed/accurate.c index 2f076a64b7..d7ff043757 100644 --- a/bacula/src/filed/accurate.c +++ b/bacula/src/filed/accurate.c @@ -1,7 +1,7 @@ /* Bacula® - The Network Backup Solution - Copyright (C) 2000-2008 Free Software Foundation Europe e.V. + Copyright (C) 2000-2009 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. @@ -20,166 +20,52 @@ 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. */ /* - * Version $Id$ + * Version $Id $ * */ #include "bacula.h" #include "filed.h" -static void realfree(void *p); /* used by tokyo code */ static int dbglvl=200; typedef struct PrivateCurFile { -#ifndef USE_TCHDB hlink link; -#endif - char *fname; /* not stored with tchdb mode */ - time_t ctime; - time_t mtime; + char *fname; + utime_t ctime; + utime_t mtime; bool seen; } CurFile; -#ifdef USE_TCHDB - -/* - * Update hash element seen=1 - */ -static bool accurate_mark_file_as_seen(JCR *jcr, CurFile *elt) -{ - bool ret=true; - - elt->seen = 1; - if (!tchdbputasync(jcr->file_list, - elt->fname, strlen(elt->fname)+1, - elt, sizeof(CurFile))) - { /* TODO: disabling accurate mode ? */ - Jmsg(jcr, M_ERROR, 1, _("Can't update accurate hash disk ERR=%s\n"), - tchdberrmsg(tchdbecode(jcr->file_list))); - ret = false; - } - - return ret; -} - -static bool accurate_lookup(JCR *jcr, char *fname, CurFile *ret) -{ - bool found=false; - ret->seen = 0; - - if (tchdbget3(jcr->file_list, - fname, strlen(fname)+1, - ret, sizeof(CurFile)) != -1) - { - found = true; - ret->fname = fname; -// Dmsg1(dbglvl, "lookup <%s> ok\n", fname); - } - return found; -} - -/* Create tokyo dbm hash file - * If something goes wrong, we cancel accurate mode. - */ -static bool accurate_init(JCR *jcr, int nbfile) +bool accurate_mark_file_as_seen(JCR *jcr, char *fname) { - jcr->file_list = tchdbnew(); - tchdbsetcache(jcr->file_list, 300000); - tchdbtune(jcr->file_list, - nbfile, /* nb bucket 0.5n to 4n */ - 6, /* size of element 2^x */ - 16, - 0); /* options like compression */ - - POOLMEM *name = get_pool_memory(PM_MESSAGE); - make_unique_filename(name, jcr->JobId, "accurate"); - - if(!tchdbopen(jcr->file_list, name, HDBOWRITER | HDBOCREAT)){ - Jmsg(jcr, M_ERROR, 1, _("Can't open accurate hash disk ERR=%s\n"), - tchdberrmsg(tchdbecode(jcr->file_list))); - Jmsg(jcr, M_INFO, 1, _("Disabling accurate mode\n")); - tchdbdel(jcr->file_list); - jcr->file_list = NULL; - jcr->accurate = false; - } - free_pool_memory(name); - return jcr->file_list != NULL; -} - -/* This function is called at the end of backup - * We walk over all hash disk element, and we check - * for elt.seen. - */ -bool accurate_send_deleted_list(JCR *jcr) -{ - char *key; - CurFile elt; - FF_PKT *ff_pkt; - int stream = STREAM_UNIX_ATTRIBUTES; - - if (!jcr->accurate || jcr->JobLevel == L_FULL) { - goto bail_out; - } - - if (jcr->file_list == NULL) { - goto bail_out; - } - - ff_pkt = init_find_files(); - ff_pkt->type = FT_DELETED; - - /* traverse records */ - tchdbiterinit(jcr->file_list); - while((key = tchdbiternext2(jcr->file_list)) != NULL) { - if (tchdbget3(jcr->file_list, - key, strlen(key)+1, - &elt, sizeof(CurFile)) != -1) - { - if (!elt.seen) { /* already seen */ - ff_pkt->fname = key; - ff_pkt->statp.st_mtime = elt.mtime; - ff_pkt->statp.st_ctime = elt.ctime; - encode_and_send_attributes(jcr, ff_pkt, stream); - } - realfree(key); /* tokyo cabinet have to use real free() */ - } + if (!jcr->accurate || !jcr->file_list) { + return false; } - - term_find_files(ff_pkt); -bail_out: - /* TODO: clean htable when this function is not reached ? */ - if (jcr->file_list) { - Dmsg2(dbglvl, "Accurate hash size=%lli\n",tchdbfsiz(jcr->file_list)); - if(!tchdbclose(jcr->file_list)){ - Jmsg(jcr, M_ERROR, 1, _("Can't close accurate hash disk ERR=%s\n"), - tchdberrmsg(tchdbecode(jcr->file_list))); - } - - /* delete the object */ - tchdbdel(jcr->file_list); - - POOLMEM *name = get_pool_memory(PM_MESSAGE); - make_unique_filename(name, jcr->JobId, "accurate"); - unlink(name); - - free_pool_memory(name); - jcr->file_list = NULL; + /* TODO: just use elt->seen = 1 */ + CurFile *temp = (CurFile *)jcr->file_list->lookup(fname); + if (temp) { + temp->seen = 1; /* records are in memory */ + Dmsg1(dbglvl, "marked <%s> as seen\n", fname); + } else { + Dmsg1(dbglvl, "<%s> not found to be marked as seen\n", fname); } return true; } -#else /* HTABLE mode */ - static bool accurate_mark_file_as_seen(JCR *jcr, CurFile *elt) { + /* TODO: just use elt->seen = 1 */ CurFile *temp = (CurFile *)jcr->file_list->lookup(elt->fname); - temp->seen = 1; /* records are in memory */ + if (temp) { + temp->seen = 1; /* records are in memory */ + } return true; } @@ -192,7 +78,7 @@ static bool accurate_lookup(JCR *jcr, char *fname, CurFile *ret) if (temp) { memcpy(ret, temp, sizeof(CurFile)); found=true; -// Dmsg1(dbglvl, "lookup <%s> ok\n", fname); + Dmsg1(dbglvl, "lookup <%s> ok\n", fname); } return found; @@ -200,7 +86,7 @@ static bool accurate_lookup(JCR *jcr, char *fname, CurFile *ret) static bool accurate_init(JCR *jcr, int nbfile) { - CurFile *elt=NULL; + CurFile *elt = NULL; jcr->file_list = (htable *)malloc(sizeof(htable)); jcr->file_list->init(elt, &elt->link, nbfile); return true; @@ -216,7 +102,7 @@ bool accurate_send_deleted_list(JCR *jcr) FF_PKT *ff_pkt; int stream = STREAM_UNIX_ATTRIBUTES; - if (!jcr->accurate || jcr->JobLevel == L_FULL) { + if (!jcr->accurate || jcr->get_JobLevel() == L_FULL) { goto bail_out; } @@ -227,15 +113,16 @@ bool accurate_send_deleted_list(JCR *jcr) ff_pkt = init_find_files(); ff_pkt->type = FT_DELETED; - foreach_htable (elt, jcr->file_list) { - if (!elt->seen) { /* already seen */ - Dmsg2(dbglvl, "deleted fname=%s seen=%i\n", elt->fname, elt->seen); - ff_pkt->fname = elt->fname; - ff_pkt->statp.st_mtime = elt->mtime; - ff_pkt->statp.st_ctime = elt->ctime; - encode_and_send_attributes(jcr, ff_pkt, stream); + foreach_htable(elt, jcr->file_list) { + if (elt->seen || plugin_check_file(jcr, elt->fname)) { + continue; } -// free(elt->fname); + Dmsg2(dbglvl, "deleted fname=%s seen=%i\n", elt->fname, elt->seen); + ff_pkt->fname = elt->fname; + ff_pkt->statp.st_mtime = elt->mtime; + ff_pkt->statp.st_ctime = elt->ctime; + encode_and_send_attributes(jcr, ff_pkt, stream); +// free(elt->fname); } term_find_files(ff_pkt); @@ -249,8 +136,6 @@ bail_out: return true; } -#endif /* common code */ - static bool accurate_add_file(JCR *jcr, char *fname, char *lstat) { bool ret = true; @@ -262,16 +147,6 @@ static bool accurate_add_file(JCR *jcr, char *fname, char *lstat) elt.mtime = statp.st_mtime; elt.seen = 0; -#ifdef USE_TCHDB - if (!tchdbputasync(jcr->file_list, - fname, strlen(fname)+1, - &elt, sizeof(CurFile))) - { - Jmsg(jcr, M_ERROR, 1, _("Can't update accurate hash disk ERR=%s\n"), - tchdberrmsg(tchdbecode(jcr->file_list))); - ret = false; - } -#else /* HTABLE */ CurFile *item; /* we store CurFile, fname and ctime/mtime in the same chunk */ item = (CurFile *)jcr->file_list->hash_malloc(sizeof(CurFile)+strlen(fname)+1); @@ -279,9 +154,8 @@ static bool accurate_add_file(JCR *jcr, char *fname, char *lstat) item->fname = (char *)item+sizeof(CurFile); strcpy(item->fname, fname); jcr->file_list->insert(item->fname, item); -#endif -// Dmsg2(dbglvl, "add fname=<%s> lstat=%s\n", fname, lstat); + Dmsg2(dbglvl, "add fname=<%s> lstat=%s\n", fname, lstat); return ret; } @@ -297,7 +171,7 @@ bool accurate_check_file(JCR *jcr, FF_PKT *ff_pkt) char *fname; CurFile elt; - if (!jcr->accurate || jcr->JobLevel == L_FULL) { + if (!jcr->accurate || jcr->get_JobLevel() == L_FULL) { return true; } @@ -320,16 +194,25 @@ bool accurate_check_file(JCR *jcr, FF_PKT *ff_pkt) goto bail_out; } + /* + * We check only mtime/ctime like with the normal + * incremental/differential mode + */ if (elt.mtime != ff_pkt->statp.st_mtime) { - Jmsg(jcr, M_SAVED, 0, _("%s st_mtime differs\n"), fname); +// Jmsg(jcr, M_SAVED, 0, _("%s st_mtime differs\n"), fname); + Dmsg3(dbglvl, "%s st_mtime differs (%i!=%i)\n", + fname, elt.mtime, ff_pkt->statp.st_mtime); stat = true; - } else if (elt.ctime != ff_pkt->statp.st_ctime) { - Jmsg(jcr, M_SAVED, 0, _("%s st_ctime differs\n"), fname); + } else if (!(ff_pkt->flags & FO_MTIMEONLY) + && (elt.ctime != ff_pkt->statp.st_ctime)) { +// Jmsg(jcr, M_SAVED, 0, _("%s st_ctime differs\n"), fname); + Dmsg3(dbglvl, "%s st_ctime differs\n", + fname, elt.ctime, ff_pkt->statp.st_ctime); stat = true; } accurate_mark_file_as_seen(jcr, &elt); - Dmsg2(dbglvl, "accurate %s = %i\n", fname, stat); +// Dmsg2(dbglvl, "accurate %s = %i\n", fname, stat); bail_out: unstrip_path(ff_pkt); @@ -337,7 +220,7 @@ bail_out: } /* - * TODO: use bigbuffer from htable + * TODO: use big buffer from htable */ int accurate_cmd(JCR *jcr) { @@ -345,7 +228,7 @@ int accurate_cmd(JCR *jcr) int len; int32_t nb; - if (!jcr->accurate || job_canceled(jcr) || jcr->JobLevel==L_FULL) { + if (!jcr->accurate || job_canceled(jcr) || jcr->get_JobLevel()==L_FULL) { return true; } @@ -364,7 +247,7 @@ int accurate_cmd(JCR *jcr) while (dir->recv() >= 0) { len = strlen(dir->msg) + 1; if (len < dir->msglen) { - accurate_add_file(jcr, dir->msg, dir->msg + len); + accurate_add_file(jcr, dir->msg, dir->msg + len); } } @@ -378,18 +261,7 @@ int accurate_cmd(JCR *jcr) edit_uint64_with_commas(sm_max_bytes, b3), edit_uint64_with_commas(sm_buffers, b4), edit_uint64_with_commas(sm_max_buffers, b5)); - #endif return true; } - -/* - * Tokyo Cabinet library doesn't use smartalloc by default - * results need to be release with real free() - */ -#undef free -void realfree(void *p) -{ - free(p); -}