commit ee75b3f

default  ·  2022-11-25 12:51:56 +0000 UTC
parent 2d7c327
In purge_server(), don't purge objects with 2 (or more) hard links.

This way, an object can be protected from the purge by creating
a hard link to it.
1 files changed,  +8, -7
M data.c
M data.c
+8, -7
 1@@ -1492,11 +1492,13 @@ d_char *dequeue(snac *snac, char *fn)
 2 }
 3 
 4 
 5-static void _purge_file(const char *fn, int days)
 6+static void _purge_file(const char *fn, int days, int n_link)
 7+/* purge fn if it's older than days and has less than n_link hard links */
 8 {
 9     time_t mt = time(NULL) - days * 24 * 3600;
10+    int nl;
11 
12-    if (mtime(fn) < mt) {
13+    if (mtime_nl(fn, &nl) < mt && nl < n_link) {
14         /* older than the minimum time: delete it */
15         unlink(fn);
16         srv_debug(1, xs_fmt("purged %s", fn));
17@@ -1514,7 +1516,7 @@ static void _purge_subdir(snac *snac, const char *subdir, int days)
18 
19         p = list;
20         while (xs_list_iter(&p, &v))
21-            _purge_file(v, days);
22+            _purge_file(v, days, XS_ALL);
23     }
24 }
25 
26@@ -1523,7 +1525,6 @@ void purge_server(void)
27 /* purge global server data */
28 {
29     int tpd = xs_number_get(xs_dict_get(srv_config, "timeline_purge_days"));
30-//    int lpd = xs_number_get(xs_dict_get(srv_config, "local_purge_days"));
31     xs *spec = xs_fmt("%s/object/??", srv_basedir);
32     xs *dirs = xs_glob(spec, 0, 0);
33     char *p, *v;
34@@ -1536,7 +1537,7 @@ void purge_server(void)
35 
36         p2 = files;
37         while (xs_list_iter(&p2, &v2)) {
38-            _purge_file(v2, tpd);
39+            _purge_file(v2, tpd, 2);
40         }
41     }
42 }
43@@ -1559,8 +1560,6 @@ void purge_user(snac *snac)
44 void purge_all(void)
45 /* purge all users */
46 {
47-    purge_server();
48-
49     snac snac;
50     xs *list = user_list();
51     char *p, *uid;
52@@ -1572,4 +1571,6 @@ void purge_all(void)
53             user_free(&snac);
54         }
55     }
56+
57+    purge_server();
58 }