Accepting request 816339 from home:sjamgade:branches:science:machinelearning
- added patch01 another cleanup mechanism based on age of file OBS-URL: https://build.opensuse.org/request/show/816339 OBS-URL: https://build.opensuse.org/package/show/devel:tools:building/ccache?expand=0&rev=90
This commit is contained in:
parent
5745ebd3b8
commit
f9a61759fe
172
0001-Add-another-cleanup-mechanism-evict-older-than.patch
Normal file
172
0001-Add-another-cleanup-mechanism-evict-older-than.patch
Normal file
@ -0,0 +1,172 @@
|
|||||||
|
From f0e72e01a3ca6accc0a9fbdc9f4ed2100ad343e7 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Sumit Jamgade <sjamgade@suse.com>
|
||||||
|
Date: Mon, 22 Jun 2020 12:52:33 +0200
|
||||||
|
Subject: [PATCH] Add another cleanup mechanism - evict-older-than
|
||||||
|
|
||||||
|
The argument adds another mechanism to control contents of cache directory. And
|
||||||
|
is based on the LRU tracking behaviour.
|
||||||
|
|
||||||
|
As of now there is no way for ccache to eliminate files which were
|
||||||
|
are no longer needed. As a result these files stay and are kept around until
|
||||||
|
either max_files/max_size is reached.
|
||||||
|
|
||||||
|
If a particular project is being built regularly but for some reason is allowed
|
||||||
|
to grow in size, then under such circumstances using the LRU mechanism to control
|
||||||
|
cache size, lends as perfect solution.
|
||||||
|
|
||||||
|
The argument takes a parameter N and performs a cleanup.
|
||||||
|
While performing cleanup the oldest file in ccache can
|
||||||
|
only be N seconds old. However this cleanup will not take max_files and
|
||||||
|
max_old into consideration
|
||||||
|
---
|
||||||
|
src/ccache.c | 43 ++++++++++++++++++++++++++++---------------
|
||||||
|
src/ccache.h | 1 +
|
||||||
|
src/cleanup.c | 16 +++++++++++++++-
|
||||||
|
test/suites/cleanup.bash | 11 +++++++++++
|
||||||
|
4 files changed, 55 insertions(+), 16 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/ccache.c b/src/ccache.c
|
||||||
|
index 0e66468..71f9730 100644
|
||||||
|
--- a/src/ccache.c
|
||||||
|
+++ b/src/ccache.c
|
||||||
|
@@ -64,6 +64,8 @@ static const char USAGE_TEXT[] =
|
||||||
|
" (normally not needed as this is done\n"
|
||||||
|
" automatically)\n"
|
||||||
|
" -C, --clear clear the cache completely (except configuration)\n"
|
||||||
|
+ " -e, --evict-older-than N delete files older than N seconds (this will not\n"
|
||||||
|
+ " take max_files, max_size into consideration)\n"
|
||||||
|
" -F, --max-files=N set maximum number of files in cache to N (use 0\n"
|
||||||
|
" for no limit)\n"
|
||||||
|
" -M, --max-size=SIZE set maximum size of cache to SIZE (use 0 for no\n"
|
||||||
|
@@ -4164,25 +4166,26 @@ ccache_main_options(int argc, char *argv[])
|
||||||
|
PRINT_STATS,
|
||||||
|
};
|
||||||
|
static const struct option options[] = {
|
||||||
|
- {"cleanup", no_argument, 0, 'c'},
|
||||||
|
- {"clear", no_argument, 0, 'C'},
|
||||||
|
- {"dump-manifest", required_argument, 0, DUMP_MANIFEST},
|
||||||
|
- {"get-config", required_argument, 0, 'k'},
|
||||||
|
- {"hash-file", required_argument, 0, HASH_FILE},
|
||||||
|
- {"help", no_argument, 0, 'h'},
|
||||||
|
- {"max-files", required_argument, 0, 'F'},
|
||||||
|
- {"max-size", required_argument, 0, 'M'},
|
||||||
|
- {"print-stats", no_argument, 0, PRINT_STATS},
|
||||||
|
- {"set-config", required_argument, 0, 'o'},
|
||||||
|
- {"show-config", no_argument, 0, 'p'},
|
||||||
|
- {"show-stats", no_argument, 0, 's'},
|
||||||
|
- {"version", no_argument, 0, 'V'},
|
||||||
|
- {"zero-stats", no_argument, 0, 'z'},
|
||||||
|
+ {"cleanup", no_argument, 0, 'c'},
|
||||||
|
+ {"clear", no_argument, 0, 'C'},
|
||||||
|
+ {"evice-older-than", required_argument, 0, 'C'},
|
||||||
|
+ {"dump-manifest", required_argument, 0, DUMP_MANIFEST},
|
||||||
|
+ {"get-config", required_argument, 0, 'k'},
|
||||||
|
+ {"hash-file", required_argument, 0, HASH_FILE},
|
||||||
|
+ {"help", no_argument, 0, 'h'},
|
||||||
|
+ {"max-files", required_argument, 0, 'F'},
|
||||||
|
+ {"max-size", required_argument, 0, 'M'},
|
||||||
|
+ {"print-stats", no_argument, 0, PRINT_STATS},
|
||||||
|
+ {"set-config", required_argument, 0, 'o'},
|
||||||
|
+ {"show-config", no_argument, 0, 'p'},
|
||||||
|
+ {"show-stats", no_argument, 0, 's'},
|
||||||
|
+ {"version", no_argument, 0, 'V'},
|
||||||
|
+ {"zero-stats", no_argument, 0, 'z'},
|
||||||
|
{0, 0, 0, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
int c;
|
||||||
|
- while ((c = getopt_long(argc, argv, "cCk:hF:M:po:sVz", options, NULL))
|
||||||
|
+ while ((c = getopt_long(argc, argv, "cCe:k:hF:M:po:sVz", options, NULL))
|
||||||
|
!= -1) {
|
||||||
|
switch (c) {
|
||||||
|
case DUMP_MANIFEST:
|
||||||
|
@@ -4223,6 +4226,16 @@ ccache_main_options(int argc, char *argv[])
|
||||||
|
printf("Cleared cache\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
+ case 'e': // --evict-older-than
|
||||||
|
+ initialize();
|
||||||
|
+ int32_t seconds = atoi(optarg);
|
||||||
|
+ if (seconds < 0) {
|
||||||
|
+ fatal("seconds cannot be negative: %d", seconds);
|
||||||
|
+ }
|
||||||
|
+ clean_old(conf, (time_t)seconds);
|
||||||
|
+ printf("Cleared cache\n");
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
case 'h': // --help
|
||||||
|
fputs(USAGE_TEXT, stdout);
|
||||||
|
x_exit(0);
|
||||||
|
diff --git a/src/ccache.h b/src/ccache.h
|
||||||
|
index 0d6be60..3f6c44b 100644
|
||||||
|
--- a/src/ccache.h
|
||||||
|
+++ b/src/ccache.h
|
||||||
|
@@ -247,6 +247,7 @@ void exitfn_call(void);
|
||||||
|
void clean_up_dir(struct conf *conf, const char *dir, double limit_multiple);
|
||||||
|
void clean_up_all(struct conf *conf);
|
||||||
|
void wipe_all(struct conf *conf);
|
||||||
|
+void clean_old(struct conf *conf, time_t max_old);
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// execute.c
|
||||||
|
diff --git a/src/cleanup.c b/src/cleanup.c
|
||||||
|
index 0b66caf..6f650b3 100644
|
||||||
|
--- a/src/cleanup.c
|
||||||
|
+++ b/src/cleanup.c
|
||||||
|
@@ -31,6 +31,7 @@ static uint64_t cache_size;
|
||||||
|
static size_t files_in_cache;
|
||||||
|
static uint64_t cache_size_threshold;
|
||||||
|
static size_t files_in_cache_threshold;
|
||||||
|
+static time_t oldest_mtime_threshold;
|
||||||
|
|
||||||
|
// File comparison function that orders files in mtime order, oldest first.
|
||||||
|
static int
|
||||||
|
@@ -124,7 +125,9 @@ sort_and_clean(void)
|
||||||
|
if ((cache_size_threshold == 0
|
||||||
|
|| cache_size <= cache_size_threshold)
|
||||||
|
&& (files_in_cache_threshold == 0
|
||||||
|
- || files_in_cache <= files_in_cache_threshold)) {
|
||||||
|
+ || files_in_cache <= files_in_cache_threshold)
|
||||||
|
+ && (oldest_mtime_threshold == 0
|
||||||
|
+ || oldest_mtime_threshold <= files[i]->mtime)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -268,3 +271,14 @@ void wipe_all(struct conf *conf)
|
||||||
|
// Fix the counters.
|
||||||
|
clean_up_all(conf);
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+//clean all files older than (now-max_old) secs
|
||||||
|
+void clean_old(struct conf *conf, time_t max_old)
|
||||||
|
+{
|
||||||
|
+ oldest_mtime_threshold = time(NULL) - max_old;
|
||||||
|
+ for (int i = 0; i <= 0xF; i++) {
|
||||||
|
+ char *dname = format("%s/%1x", conf->cache_dir, i);
|
||||||
|
+ clean_up_dir(conf, dname, 0.0);
|
||||||
|
+ free(dname);
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
diff --git a/test/suites/cleanup.bash b/test/suites/cleanup.bash
|
||||||
|
index a907ac4..cac4f9c 100644
|
||||||
|
--- a/test/suites/cleanup.bash
|
||||||
|
+++ b/test/suites/cleanup.bash
|
||||||
|
@@ -228,4 +228,15 @@ SUITE_cleanup() {
|
||||||
|
$CCACHE -c >/dev/null
|
||||||
|
expect_file_count 1 '.nfs*' $CCACHE_DIR
|
||||||
|
expect_stat 'files in cache' 30
|
||||||
|
+
|
||||||
|
+ # -------------------------------------------------------------------------
|
||||||
|
+ TEST "cleanup of files older than n seconds"
|
||||||
|
+
|
||||||
|
+ prepare_cleanup_test_dir $CCACHE_DIR/a
|
||||||
|
+
|
||||||
|
+ touch $CCACHE_DIR/a/now.result
|
||||||
|
+ $CCACHE -F 0 -M 0 >/dev/null
|
||||||
|
+ $CCACHE -e 10 >/dev/null
|
||||||
|
+ expect_file_count 1 '*.result' $CCACHE_DIR
|
||||||
|
+ expect_stat 'files in cache' 1
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.16.4
|
||||||
|
|
@ -1,3 +1,9 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Mon Jun 22 12:00:57 UTC 2020 - Sumit Jamgade <sjamgade@suse.com>
|
||||||
|
|
||||||
|
- added patch01
|
||||||
|
another cleanup mechanism based on age of file
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Sun Jun 7 10:07:00 UTC 2020 - Martin Pluskal <mpluskal@suse.com>
|
Sun Jun 7 10:07:00 UTC 2020 - Martin Pluskal <mpluskal@suse.com>
|
||||||
|
|
||||||
|
@ -25,6 +25,7 @@ URL: https://ccache.dev/
|
|||||||
Source0: https://github.com/ccache/ccache/releases/download/v%{version}/ccache-%{version}.tar.xz#/%{name}-%{version}.tar.xz
|
Source0: https://github.com/ccache/ccache/releases/download/v%{version}/ccache-%{version}.tar.xz#/%{name}-%{version}.tar.xz
|
||||||
Source1: https://github.com/ccache/ccache/releases/download/v%{version}/ccache-%{version}.tar.xz.asc#/%{name}-%{version}.tar.xz.asc
|
Source1: https://github.com/ccache/ccache/releases/download/v%{version}/ccache-%{version}.tar.xz.asc#/%{name}-%{version}.tar.xz.asc
|
||||||
Source2: %{name}.keyring
|
Source2: %{name}.keyring
|
||||||
|
Patch0: 0001-Add-another-cleanup-mechanism-evict-older-than.patch
|
||||||
BuildRequires: zlib-devel
|
BuildRequires: zlib-devel
|
||||||
Provides: distcc:%{_bindir}/ccache
|
Provides: distcc:%{_bindir}/ccache
|
||||||
|
|
||||||
@ -36,6 +37,7 @@ Objective-C++.
|
|||||||
|
|
||||||
%prep
|
%prep
|
||||||
%setup -q
|
%setup -q
|
||||||
|
%patch0 -p1
|
||||||
|
|
||||||
%build
|
%build
|
||||||
%configure \
|
%configure \
|
||||||
|
Loading…
Reference in New Issue
Block a user