From 67abf1393570d83bec52dc6c743bd1852b80e34e Mon Sep 17 00:00:00 2001 From: Eric Bollengier Date: Mon, 19 May 2008 17:54:29 +0000 Subject: [PATCH] ebl Revert to #6988 for accurate mode (keep htable default) git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@6991 91ce42f0-d328-0410-95d8-f526ca767f89 --- bacula/src/filed/Makefile.in | 11 ++--- bacula/src/filed/accurate.c | 94 ++++++++++++++++++++++++++++++++++++ bacula/src/filed/filed.h | 6 ++- bacula/src/jcr.h | 4 ++ bacula/src/lib/Makefile.in | 2 +- 5 files changed, 109 insertions(+), 8 deletions(-) diff --git a/bacula/src/filed/Makefile.in b/bacula/src/filed/Makefile.in index 6a402d7f24..2e7304319c 100644 --- a/bacula/src/filed/Makefile.in +++ b/bacula/src/filed/Makefile.in @@ -7,7 +7,6 @@ @MCOMMON@ srcdir = . -libdir = ../lib VPATH = . .PATH: . @@ -56,7 +55,7 @@ WIN32LIBS = $(@WIN32@) # inference rules .c.o: @echo "Compiling $<" - $(NO_ECHO)$(CXX) $(DEFS) $(DEBUG) -c $(WCFLAGS) $(CPPFLAGS) $(PYTHON_INC) -I$(srcdir) -I$(basedir) $(DINCLUDE) -I$(libdir) $(CFLAGS) $< + $(NO_ECHO)$(CXX) $(DEFS) $(DEBUG) -c $(WCFLAGS) $(CPPFLAGS) $(PYTHON_INC) -I$(srcdir) -I$(basedir) $(DINCLUDE) $(CFLAGS) $< #------------------------------------------------------------------------- all: Makefile @WIN32@ bacula-fd @STATIC_FD@ @echo "==== Make of filed is good ====" @@ -79,15 +78,15 @@ win32: $(WIN32OBJS) (cd win32; $(MAKE) DESTDIR=$(DESTDIR)) @rm -f bacula-fd.exe -bacula-fd: $(SVROBJS) ../findlib/libfind.a ../lib/libbac.a ../lib/libtokyocabinet.a @WIN32@ +bacula-fd: $(SVROBJS) ../findlib/libfind.a ../lib/libbac.a @WIN32@ @echo "Linking $@ ..." $(CXX) $(WLDFLAGS) $(LDFLAGS) -L../lib -L../findlib -o $@ $(SVROBJS) \ - $(WIN32LIBS) $(FDLIBS) -lfind -lbac -ltokyocabinet -lm $(PYTHON_LIBS) $(LIBS) \ + $(WIN32LIBS) $(FDLIBS) -lfind -lbac -lm $(PYTHON_LIBS) $(LIBS) \ $(DLIB) $(WRAPLIBS) $(GETTEXT_LIBS) $(OPENSSL_LIBS) static-bacula-fd: $(SVROBJS) ../findlib/libfind.a ../lib/libbac.a @WIN32@ $(CXX) $(WLDFLAGS) $(LDFLAGS) -static -L../lib -L../findlib -o $@ $(SVROBJS) \ - $(WIN32LIBS) $(FDLIBS) -lfind -lbac -ltokyodbm -lm $(PYTHON_LIBS) $(LIBS) \ + $(WIN32LIBS) $(FDLIBS) -lfind -lbac -lm $(PYTHON_LIBS) $(LIBS) \ $(DLIB) $(WRAPLIBS) $(GETTEXT_LIBS) $(OPENSSL_LIBS) strip $@ @@ -153,7 +152,7 @@ depend: @$(MV) Makefile Makefile.bak @$(SED) "/^# DO NOT DELETE:/,$$ d" Makefile.bak > Makefile @$(ECHO) "# DO NOT DELETE: nice dependency list follows" >> Makefile - @$(CXX) -S -M $(CPPFLAGS) $(XINC) $(PYTHON_INC) -I$(srcdir) -I$(basedir) -I$(libdir) *.c >> Makefile + @$(CXX) -S -M $(CPPFLAGS) $(XINC) $(PYTHON_INC) -I$(srcdir) -I$(basedir) $(SQL_INC) *.c >> Makefile @if test -f Makefile ; then \ $(RMF) Makefile.bak; \ else \ diff --git a/bacula/src/filed/accurate.c b/bacula/src/filed/accurate.c index ba491bfcac..e404d18f5e 100644 --- a/bacula/src/filed/accurate.c +++ b/bacula/src/filed/accurate.c @@ -36,12 +36,16 @@ static int dbglvl=200; typedef struct PrivateCurFile { +#ifndef USE_TCADB + hlink link; +#endif char *fname; /* not stored with tchdb mode */ time_t ctime; time_t mtime; bool seen; } CurFile; +#ifdef USE_TCADB static void realfree(void *p); /* used by tokyo code */ /* @@ -186,6 +190,83 @@ bail_out: return true; } +#else /* HTABLE mode */ + +static bool accurate_mark_file_as_seen(JCR *jcr, CurFile *elt) +{ + CurFile *temp = (CurFile *)jcr->file_list->lookup(elt->fname); + temp->seen = 1; /* records are in memory */ + return true; +} + +static bool accurate_lookup(JCR *jcr, char *fname, CurFile *ret) +{ + bool found=false; + ret->seen = 0; + + CurFile *temp = (CurFile *)jcr->file_list->lookup(fname); + if (temp) { + memcpy(ret, temp, sizeof(CurFile)); + found=true; +// Dmsg1(dbglvl, "lookup <%s> ok\n", fname); + } + + return found; +} + +static bool accurate_init(JCR *jcr, int nbfile) +{ + CurFile *elt=NULL; + jcr->file_list = (htable *)malloc(sizeof(htable)); + jcr->file_list->init(elt, &elt->link, nbfile); + return true; +} + +/* 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) +{ + 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; + + 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); + } +// free(elt->fname); + } + + term_find_files(ff_pkt); +bail_out: + /* TODO: clean htable when this function is not reached ? */ + if (jcr->file_list) { + jcr->file_list->destroy(); + free(jcr->file_list); + jcr->file_list = NULL; + } + return true; +} + +#endif /* common code */ + static bool accurate_add_file(JCR *jcr, char *fname, char *lstat) { bool ret = true; @@ -197,6 +278,7 @@ static bool accurate_add_file(JCR *jcr, char *fname, char *lstat) elt.mtime = statp.st_mtime; elt.seen = 0; +#ifdef USE_TCADB if (!tcadbput(jcr->file_list, fname, strlen(fname)+1, &elt, sizeof(CurFile))) @@ -204,6 +286,15 @@ static bool accurate_add_file(JCR *jcr, char *fname, char *lstat) Jmsg(jcr, M_ERROR, 1, _("Can't update accurate hash disk ERR=%s\n")); 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); + memcpy(item, &elt, sizeof(CurFile)); + 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); return ret; @@ -308,6 +399,8 @@ int accurate_cmd(JCR *jcr) return true; } +#ifdef USE_TCADB + /* * Tokyo Cabinet library doesn't use smartalloc by default * results need to be released with real free() @@ -318,3 +411,4 @@ void realfree(void *p) free(p); } +#endif diff --git a/bacula/src/filed/filed.h b/bacula/src/filed/filed.h index 9653dbaa02..81a20fa0ca 100644 --- a/bacula/src/filed/filed.h +++ b/bacula/src/filed/filed.h @@ -35,7 +35,11 @@ #define FILE_DAEMON 1 -#include "lib/tcadb.h" +#ifdef USE_TCADB /* hash disk based */ +# include +#else +# include "lib/htable.h" +#endif #include "filed_conf.h" #include "fd_plugins.h" #include "findlib/find.h" diff --git a/bacula/src/jcr.h b/bacula/src/jcr.h index 40c79ece66..2ad419f19a 100644 --- a/bacula/src/jcr.h +++ b/bacula/src/jcr.h @@ -341,8 +341,12 @@ public: CRYPTO_CTX crypto; /* Crypto ctx */ DIRRES* director; /* Director resource */ bool VSS; /* VSS used by FD */ +#ifdef USE_TCADB TCADB *file_list; /* Previous file list (accurate mode) */ POOLMEM *hash_name; +#else + htable *file_list; /* Previous file list (accurate mode) */ +#endif #endif /* FILE_DAEMON */ diff --git a/bacula/src/lib/Makefile.in b/bacula/src/lib/Makefile.in index bb6c0b638c..3cf96fe0ff 100644 --- a/bacula/src/lib/Makefile.in +++ b/bacula/src/lib/Makefile.in @@ -69,7 +69,7 @@ libtokyocabinet.a: @(cd tokyocabinet ; echo "==>Entering directory `pwd`"; \ $(MAKE) $@ || (echo ""; echo ""; echo " ====== Error in `pwd` ======"; \ echo ""; echo "";)); - @cp tokyocabinet/t*.h . + @cp tokyocabinet/tcadb.h tokyocabinet/tcbdb.h tokyocabinet/tchdb.h . @cp tokyocabinet/libtokyocabinet.a . libbac.a: $(LIBOBJS) -- 2.39.5