diff options
author | Henry Kleynhans <hkleynhans@fb.com> | 2021-10-12 09:56:16 +0100 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2021-10-14 22:37:43 +0100 |
commit | 3579782a4415685063b28ba00e39271309106917 (patch) | |
tree | 853a7ee5a9f097405e82940e2ed800dce91795e8 /scripts/sstate-cache-management.sh | |
parent | ca8ef6bc38b8bfd772ff19931b49a076de5c1ec4 (diff) | |
download | poky-3579782a4415685063b28ba00e39271309106917.tar.gz |
sstate: Switch to ZStandard compressor support
This patch switches the compressor from Gzip to ZStandard for ssate cache
files.
Zstandard compression provides a significant improvement in
decompression speed as well as improvement in compression speed and disk
usage over the 'tgz' format in use. Furthermore, its configurable
compression level offers a trade-off between time spent compressing
sstate cache files and disk space used by those files. The reduced disk
usage also contributes to saving network traffic for those sharing their
sstate cache with others.
Zstandard should therefore be a good choice when:
* disk space is at a premium
* network speed / resources are limited
* the CI server can sstate packages can be created at high compression
* less CPU on the build server should be used for sstate decompression
(From OE-Core rev: 0710e98f40ec7394567ede1f88f7c7bae306b925)
Signed-off-by: Henry Kleynhans <hkleynhans@fb.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'scripts/sstate-cache-management.sh')
-rwxr-xr-x | scripts/sstate-cache-management.sh | 40 |
1 files changed, 20 insertions, 20 deletions
diff --git a/scripts/sstate-cache-management.sh b/scripts/sstate-cache-management.sh index f1706a2229..d39671f7c6 100755 --- a/scripts/sstate-cache-management.sh +++ b/scripts/sstate-cache-management.sh | |||
@@ -114,7 +114,7 @@ echo_error () { | |||
114 | # * Add .done/.siginfo to the remove list | 114 | # * Add .done/.siginfo to the remove list |
115 | # * Add destination of symlink to the remove list | 115 | # * Add destination of symlink to the remove list |
116 | # | 116 | # |
117 | # $1: output file, others: sstate cache file (.tgz) | 117 | # $1: output file, others: sstate cache file (.tar.zst) |
118 | gen_rmlist (){ | 118 | gen_rmlist (){ |
119 | local rmlist_file="$1" | 119 | local rmlist_file="$1" |
120 | shift | 120 | shift |
@@ -131,13 +131,13 @@ gen_rmlist (){ | |||
131 | dest="`readlink -e $i`" | 131 | dest="`readlink -e $i`" |
132 | if [ -n "$dest" ]; then | 132 | if [ -n "$dest" ]; then |
133 | echo $dest >> $rmlist_file | 133 | echo $dest >> $rmlist_file |
134 | # Remove the .siginfo when .tgz is removed | 134 | # Remove the .siginfo when .tar.zst is removed |
135 | if [ -f "$dest.siginfo" ]; then | 135 | if [ -f "$dest.siginfo" ]; then |
136 | echo $dest.siginfo >> $rmlist_file | 136 | echo $dest.siginfo >> $rmlist_file |
137 | fi | 137 | fi |
138 | fi | 138 | fi |
139 | fi | 139 | fi |
140 | # Add the ".tgz.done" and ".siginfo.done" (may exist in the future) | 140 | # Add the ".tar.zst.done" and ".siginfo.done" (may exist in the future) |
141 | base_fn="${i##/*/}" | 141 | base_fn="${i##/*/}" |
142 | t_fn="$base_fn.done" | 142 | t_fn="$base_fn.done" |
143 | s_fn="$base_fn.siginfo.done" | 143 | s_fn="$base_fn.siginfo.done" |
@@ -188,10 +188,10 @@ remove_duplicated () { | |||
188 | total_files=`find $cache_dir -name 'sstate*' | wc -l` | 188 | total_files=`find $cache_dir -name 'sstate*' | wc -l` |
189 | # Save all the sstate files in a file | 189 | # Save all the sstate files in a file |
190 | sstate_files_list=`mktemp` || exit 1 | 190 | sstate_files_list=`mktemp` || exit 1 |
191 | find $cache_dir -name 'sstate:*:*:*:*:*:*:*.tgz*' >$sstate_files_list | 191 | find $cache_dir -iname 'sstate:*:*:*:*:*:*:*.tar.zst*' >$sstate_files_list |
192 | 192 | ||
193 | echo "Figuring out the suffixes in the sstate cache dir ... " | 193 | echo "Figuring out the suffixes in the sstate cache dir ... " |
194 | sstate_suffixes="`sed 's%.*/sstate:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^_]*_\([^:]*\)\.tgz.*%\1%g' $sstate_files_list | sort -u`" | 194 | sstate_suffixes="`sed 's%.*/sstate:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^_]*_\([^:]*\)\.tar\.zst.*%\1%g' $sstate_files_list | sort -u`" |
195 | echo "Done" | 195 | echo "Done" |
196 | echo "The following suffixes have been found in the cache dir:" | 196 | echo "The following suffixes have been found in the cache dir:" |
197 | echo $sstate_suffixes | 197 | echo $sstate_suffixes |
@@ -200,10 +200,10 @@ remove_duplicated () { | |||
200 | # Using this SSTATE_PKGSPEC definition it's 6th colon separated field | 200 | # Using this SSTATE_PKGSPEC definition it's 6th colon separated field |
201 | # SSTATE_PKGSPEC = "sstate:${PN}:${PACKAGE_ARCH}${TARGET_VENDOR}-${TARGET_OS}:${PV}:${PR}:${SSTATE_PKGARCH}:${SSTATE_VERSION}:" | 201 | # SSTATE_PKGSPEC = "sstate:${PN}:${PACKAGE_ARCH}${TARGET_VENDOR}-${TARGET_OS}:${PV}:${PR}:${SSTATE_PKGARCH}:${SSTATE_VERSION}:" |
202 | for arch in $all_archs; do | 202 | for arch in $all_archs; do |
203 | grep -q ".*/sstate:[^:]*:[^:]*:[^:]*:[^:]*:$arch:[^:]*:[^:]*\.tgz$" $sstate_files_list | 203 | grep -q ".*/sstate:[^:]*:[^:]*:[^:]*:[^:]*:$arch:[^:]*:[^:]*\.tar\.zst$" $sstate_files_list |
204 | [ $? -eq 0 ] && ava_archs="$ava_archs $arch" | 204 | [ $? -eq 0 ] && ava_archs="$ava_archs $arch" |
205 | # ${builder_arch}_$arch used by toolchain sstate | 205 | # ${builder_arch}_$arch used by toolchain sstate |
206 | grep -q ".*/sstate:[^:]*:[^:]*:[^:]*:[^:]*:${builder_arch}_$arch:[^:]*:[^:]*\.tgz$" $sstate_files_list | 206 | grep -q ".*/sstate:[^:]*:[^:]*:[^:]*:[^:]*:${builder_arch}_$arch:[^:]*:[^:]*\.tar\.zst$" $sstate_files_list |
207 | [ $? -eq 0 ] && ava_archs="$ava_archs ${builder_arch}_$arch" | 207 | [ $? -eq 0 ] && ava_archs="$ava_archs ${builder_arch}_$arch" |
208 | done | 208 | done |
209 | echo "Done" | 209 | echo "Done" |
@@ -219,13 +219,13 @@ remove_duplicated () { | |||
219 | continue | 219 | continue |
220 | fi | 220 | fi |
221 | # Total number of files including .siginfo and .done files | 221 | # Total number of files including .siginfo and .done files |
222 | total_files_suffix=`grep ".*/sstate:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:_]*_$suffix\.tgz.*" $sstate_files_list | wc -l 2>/dev/null` | 222 | total_files_suffix=`grep ".*/sstate:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:_]*_$suffix\.tar\.zst.*" $sstate_files_list | wc -l 2>/dev/null` |
223 | total_tgz_suffix=`grep ".*/sstate:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:_]*_$suffix\.tgz$" $sstate_files_list | wc -l 2>/dev/null` | 223 | total_archive_suffix=`grep ".*/sstate:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:_]*_$suffix\.tar\.zst$" $sstate_files_list | wc -l 2>/dev/null` |
224 | # Save the file list to a file, some suffix's file may not exist | 224 | # Save the file list to a file, some suffix's file may not exist |
225 | grep ".*/sstate:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:_]*_$suffix\.tgz.*" $sstate_files_list >$list_suffix 2>/dev/null | 225 | grep ".*/sstate:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:_]*_$suffix\.tar\.zst.*" $sstate_files_list >$list_suffix 2>/dev/null |
226 | local deleted_tgz=0 | 226 | local deleted_archives=0 |
227 | local deleted_files=0 | 227 | local deleted_files=0 |
228 | for ext in tgz tgz.siginfo tgz.done; do | 228 | for ext in tar.zst tar.zst.siginfo tar.zst.done; do |
229 | echo "Figuring out the sstate:xxx_$suffix.$ext ... " | 229 | echo "Figuring out the sstate:xxx_$suffix.$ext ... " |
230 | # Uniq BPNs | 230 | # Uniq BPNs |
231 | file_names=`for arch in $ava_archs ""; do | 231 | file_names=`for arch in $ava_archs ""; do |
@@ -268,19 +268,19 @@ remove_duplicated () { | |||
268 | done | 268 | done |
269 | done | 269 | done |
270 | done | 270 | done |
271 | deleted_tgz=`cat $rm_list.* 2>/dev/null | grep ".tgz$" | wc -l` | 271 | deleted_archives=`cat $rm_list.* 2>/dev/null | grep "\.tar\.zst$" | wc -l` |
272 | deleted_files=`cat $rm_list.* 2>/dev/null | wc -l` | 272 | deleted_files=`cat $rm_list.* 2>/dev/null | wc -l` |
273 | [ "$deleted_files" -gt 0 -a $debug -gt 0 ] && cat $rm_list.* | 273 | [ "$deleted_files" -gt 0 -a $debug -gt 0 ] && cat $rm_list.* |
274 | echo "($deleted_tgz out of $total_tgz_suffix .tgz files for $suffix suffix will be removed or $deleted_files out of $total_files_suffix when counting also .siginfo and .done files)" | 274 | echo "($deleted_archives out of $total_archives_suffix .tar.zst files for $suffix suffix will be removed or $deleted_files out of $total_files_suffix when counting also .siginfo and .done files)" |
275 | let total_deleted=$total_deleted+$deleted_files | 275 | let total_deleted=$total_deleted+$deleted_files |
276 | done | 276 | done |
277 | deleted_tgz=0 | 277 | deleted_archives=0 |
278 | rm_old_list=$remove_listdir/sstate-old-filenames | 278 | rm_old_list=$remove_listdir/sstate-old-filenames |
279 | find $cache_dir -name 'sstate-*.tgz' >$rm_old_list | 279 | find $cache_dir -name 'sstate-*.tar.zst' >$rm_old_list |
280 | [ -s "$rm_old_list" ] && deleted_tgz=`cat $rm_old_list | grep ".tgz$" | wc -l` | 280 | [ -s "$rm_old_list" ] && deleted_archives=`cat $rm_old_list | grep "\.tar\.zst$" | wc -l` |
281 | [ -s "$rm_old_list" ] && deleted_files=`cat $rm_old_list | wc -l` | 281 | [ -s "$rm_old_list" ] && deleted_files=`cat $rm_old_list | wc -l` |
282 | [ -s "$rm_old_list" -a $debug -gt 0 ] && cat $rm_old_list | 282 | [ -s "$rm_old_list" -a $debug -gt 0 ] && cat $rm_old_list |
283 | echo "($deleted_tgz .tgz files with old sstate-* filenames will be removed or $deleted_files when counting also .siginfo and .done files)" | 283 | echo "($deleted_archives or .tar.zst files with old sstate-* filenames will be removed or $deleted_files when counting also .siginfo and .done files)" |
284 | let total_deleted=$total_deleted+$deleted_files | 284 | let total_deleted=$total_deleted+$deleted_files |
285 | 285 | ||
286 | rm -f $list_suffix | 286 | rm -f $list_suffix |
@@ -289,7 +289,7 @@ remove_duplicated () { | |||
289 | read_confirm | 289 | read_confirm |
290 | if [ "$confirm" = "y" -o "$confirm" = "Y" ]; then | 290 | if [ "$confirm" = "y" -o "$confirm" = "Y" ]; then |
291 | for list in `ls $remove_listdir/`; do | 291 | for list in `ls $remove_listdir/`; do |
292 | echo "Removing $list.tgz (`cat $remove_listdir/$list | wc -w` files) ... " | 292 | echo "Removing $list.tar.zst archive (`cat $remove_listdir/$list | wc -w` files) ... " |
293 | # Remove them one by one to avoid the argument list too long error | 293 | # Remove them one by one to avoid the argument list too long error |
294 | for i in `cat $remove_listdir/$list`; do | 294 | for i in `cat $remove_listdir/$list`; do |
295 | rm -f $verbose $i | 295 | rm -f $verbose $i |
@@ -322,7 +322,7 @@ rm_by_stamps (){ | |||
322 | find $cache_dir -type f -name 'sstate*' | sort -u -o $cache_list | 322 | find $cache_dir -type f -name 'sstate*' | sort -u -o $cache_list |
323 | 323 | ||
324 | echo "Figuring out the suffixes in the sstate cache dir ... " | 324 | echo "Figuring out the suffixes in the sstate cache dir ... " |
325 | local sstate_suffixes="`sed 's%.*/sstate:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^_]*_\([^:]*\)\.tgz.*%\1%g' $cache_list | sort -u`" | 325 | local sstate_suffixes="`sed 's%.*/sstate:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^_]*_\([^:]*\)\.tar\.zst.*%\1%g' $cache_list | sort -u`" |
326 | echo "Done" | 326 | echo "Done" |
327 | echo "The following suffixes have been found in the cache dir:" | 327 | echo "The following suffixes have been found in the cache dir:" |
328 | echo $sstate_suffixes | 328 | echo $sstate_suffixes |