]> git.sur5r.net Git - bacula/bacula/blob - bacula/patches/testing/project-accurate-backup-without-lstat.patch
ebl Tweak patch for current trunk
[bacula/bacula] / bacula / patches / testing / project-accurate-backup-without-lstat.patch
1 Index: src/filed/backup.c
2 ===================================================================
3 --- src/filed/backup.c  (revision 6497)
4 +++ src/filed/backup.c  (working copy)
5 @@ -53,7 +53,8 @@
6  typedef struct CurFile {
7     hlink link;
8     char *fname;
9 -   char *lstat;
10 +   time_t ctime;
11 +   time_t mtime;
12     bool seen;
13  } CurFile;
14  
15 @@ -66,24 +67,12 @@
16   * the last time. After we can compare Lstat field. 
17   * 
18   */
19 -/* TODO: tweak verify code to use the same function ?? */
20  bool accurate_check_file(JCR *jcr, FF_PKT *ff_pkt)
21  {
22 -   char *p;
23     int stat=false;
24 -   struct stat statc;                 /* catalog stat */
25 -   char *Opts_Digest;
26     char *fname;
27     CurFile *elt;
28  
29 -   int32_t LinkFIc;
30 -
31 -   if (*ff_pkt->VerifyOpts) {   /* use mtime + ctime checks by default */
32 -      Opts_Digest = ff_pkt->VerifyOpts;
33 -   } else {
34 -      Opts_Digest = "cm"; 
35 -   }
36 -
37     if (jcr->accurate == false || jcr->JobLevel == L_FULL) {
38        return true;
39     }
40 @@ -110,95 +99,14 @@
41        goto bail_out;
42     }
43  
44 -   decode_stat(elt->lstat, &statc, &LinkFIc); /* decode catalog stat */
45 -//   *do_Digest = CRYPTO_DIGEST_NONE;
46 -
47 -   for (p=Opts_Digest; *p; p++) {
48 -      char ed1[30], ed2[30];
49 -      switch (*p) {
50 -      case 'i':                /* compare INODEs */
51 -         if (statc.st_ino != ff_pkt->statp.st_ino) {
52 -            Jmsg(jcr, M_SAVED, 0, _("%s      st_ino   differ. Cat: %s File: %s\n"), fname,
53 -                 edit_uint64((uint64_t)statc.st_ino, ed1),
54 -                 edit_uint64((uint64_t)ff_pkt->statp.st_ino, ed2));
55 -            stat = true;
56 -         }
57 -         break;
58 -      case 'p':                /* permissions bits */
59 -         if (statc.st_mode != ff_pkt->statp.st_mode) {
60 -            Jmsg(jcr, M_SAVED, 0, _("%s      st_mode  differ. Cat: %x File: %x\n"), fname,
61 -                 (uint32_t)statc.st_mode, (uint32_t)ff_pkt->statp.st_mode);
62 -            stat = true;
63 -         }
64 -         break;
65 -//      case 'n':                /* number of links */
66 -//         if (statc.st_nlink != ff_pkt->statp.st_nlink) {
67 -//            Jmsg(jcr, M_SAVED, 0, _("%s      st_nlink differ. Cat: %d File: %d\n"), fname,
68 -//                 (uint32_t)statc.st_nlink, (uint32_t)ff_pkt->statp.st_nlink);
69 -//            stat = true;
70 -//         }
71 -//         break;
72 -      case 'u':                /* user id */
73 -         if (statc.st_uid != ff_pkt->statp.st_uid) {
74 -            Jmsg(jcr, M_SAVED, 0, _("%s      st_uid   differ. Cat: %u File: %u\n"), fname,
75 -                 (uint32_t)statc.st_uid, (uint32_t)ff_pkt->statp.st_uid);
76 -            stat = true;
77 -         }
78 -         break;
79 -      case 'g':                /* group id */
80 -         if (statc.st_gid != ff_pkt->statp.st_gid) {
81 -            Jmsg(jcr, M_SAVED, 0, _("%s      st_gid   differ. Cat: %u File: %u\n"), fname,
82 -                 (uint32_t)statc.st_gid, (uint32_t)ff_pkt->statp.st_gid);
83 -            stat = true;
84 -         }
85 -         break;
86 -      case 's':                /* size */
87 -         if (statc.st_size != ff_pkt->statp.st_size) {
88 -            Jmsg(jcr, M_SAVED, 0, _("%s      st_size  differ. Cat: %s File: %s\n"), fname,
89 -                 edit_uint64((uint64_t)statc.st_size, ed1),
90 -                 edit_uint64((uint64_t)ff_pkt->statp.st_size, ed2));
91 -            stat = true;
92 -         }
93 -         break;
94 -//      case 'a':                /* access time */
95 -//         if (statc.st_atime != ff_pkt->statp.st_atime) {
96 -//            Jmsg(jcr, M_SAVED, 0, _("%s      st_atime differs\n"), fname);
97 -//            stat = true;
98 -//         }
99 -//         break;
100 -      case 'm':
101 -         if (statc.st_mtime != ff_pkt->statp.st_mtime) {
102 -            Jmsg(jcr, M_SAVED, 0, _("%s      st_mtime differs\n"), fname);
103 -            stat = true;
104 -         }
105 -         break;
106 -      case 'c':                /* ctime */
107 -         if (statc.st_ctime != ff_pkt->statp.st_ctime) {
108 -            Jmsg(jcr, M_SAVED, 0, _("%s      st_ctime differs\n"), fname);
109 -            stat = true;
110 -         }
111 -         break;
112 -      case 'd':                /* file size decrease */
113 -         if (statc.st_size > ff_pkt->statp.st_size) {
114 -            Jmsg(jcr, M_SAVED, 0, _("%s      st_size  decrease. Cat: %s File: %s\n"), fname,
115 -                 edit_uint64((uint64_t)statc.st_size, ed1),
116 -                 edit_uint64((uint64_t)ff_pkt->statp.st_size, ed2));
117 -            stat = true;
118 -         }
119 -         break;
120 -      case '5':                /* compare MD5 */
121 -         Dmsg1(500, "set Do_MD5 for %s\n", ff_pkt->fname);
122 -//       *do_Digest = CRYPTO_DIGEST_MD5;
123 -         break;
124 -      case '1':                 /* compare SHA1 */
125 -//       *do_Digest = CRYPTO_DIGEST_SHA1;
126 -         break;
127 -      case ':':
128 -      case 'V':
129 -      default:
130 -         break;
131 -      }
132 +   if (elt->mtime != ff_pkt->statp.st_mtime) {
133 +     Jmsg(jcr, M_SAVED, 0, _("%s      st_mtime differs\n"), fname);
134 +     stat = true;
135 +   } else if (elt->ctime != ff_pkt->statp.st_ctime) {
136 +     Jmsg(jcr, M_SAVED, 0, _("%s      st_ctime differs\n"), fname);
137 +     stat = true;
138     }
139 +
140     accurate_mark_file_as_seen(elt);
141     Dmsg2(500, "accurate %s = %i\n", fname, stat);
142  
143 @@ -215,8 +123,11 @@
144  {
145     BSOCK *dir = jcr->dir_bsock;
146     int len;
147 +   struct stat statp;
148 +   int32_t LinkFIc;
149     uint64_t nb;
150     CurFile *elt=NULL;
151 +   char *lstat;
152  
153     if (jcr->accurate==false || job_canceled(jcr) || jcr->JobLevel==L_FULL) {
154        return true;
155 @@ -246,10 +157,13 @@
156           elt->fname  = (char *) elt+sizeof(CurFile);
157           memcpy(elt->fname, dir->msg, dir->msglen);
158           elt->fname[dir->msglen]='\0';
159 -         elt->lstat = elt->fname + len + 1;
160 -         elt->seen=0;
161 +         lstat = elt->fname + len + 1;
162 +         decode_stat(lstat, &statp, &LinkFIc); /* decode catalog stat */
163 +         elt->ctime = statp.st_ctime;
164 +         elt->mtime = statp.st_mtime;
165 +         elt->seen = 0;
166           jcr->file_list->insert(elt->fname, elt); 
167 -         Dmsg2(500, "add fname=%s lstat=%s\n", elt->fname, elt->lstat);
168 +         Dmsg2(500, "add fname=%s lstat=%s\n", elt->fname, lstat);
169        }
170     }
171  
172 @@ -280,9 +194,10 @@
173  
174     foreach_htable (elt, jcr->file_list) {
175        if (!accurate_file_has_been_seen(elt)) { /* already seen */
176 -         Dmsg3(500, "deleted fname=%s lstat=%s seen=%i\n", elt->fname, elt->lstat, elt->seen);
177 +         Dmsg2(500, "deleted fname=%s seen=%i\n", elt->fname, elt->seen);
178           ff_pkt->fname = elt->fname;
179 -         decode_stat(elt->lstat, &ff_pkt->statp, &ff_pkt->LinkFI); /* decode catalog stat */
180 +         ff_pkt->statp.st_mtime = elt->mtime;
181 +         ff_pkt->statp.st_ctime = elt->ctime;
182           encode_and_send_attributes(jcr, ff_pkt, stream);
183        }
184  //      Free(elt->fname);