Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

cache: add support for zstd --adapt #1772

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 8 additions & 3 deletions packages/cache/RELEASES.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
# @actions/cache Releases

### 3.3.0

- Add support for zstd adapt mode. [#1772](https://github.com/actions/toolkit/pull/1772)
- Unlock zstd long mode. [#1772](https://github.com/actions/toolkit/pull/1772)

### 3.2.4

- Updated `isGhes` check to include `.ghe.com` and `.ghe.localhost` as accepted hosts

### 3.2.3

- Fixed a bug that mutated path arguments to `getCacheVersion` [#1378](https://github.com/actions/toolkit/pull/1378)
Expand Down Expand Up @@ -160,11 +165,11 @@
### 0.2.1

- Fix to await async function getCompressionMethod

### 0.2.0

- Fixes issues with the zstd compression algorithm on Windows and Ubuntu 16.04 [#469](https://github.com/actions/toolkit/pull/469)

### 0.1.0

- Initial release
19 changes: 5 additions & 14 deletions packages/cache/__tests__/tar.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,10 +71,7 @@ test('zstd extract tar', async () => {
]
.concat(IS_WINDOWS ? ['--force-local'] : [])
.concat(IS_MAC ? ['--delay-directory-restore'] : [])
.concat([
'--use-compress-program',
IS_WINDOWS ? '"zstd -d --long=30"' : 'unzstd --long=30'
])
.concat(['--use-compress-program', '"zstd -d --long=30"'])
.join(' '),
undefined,
{
Expand Down Expand Up @@ -231,10 +228,7 @@ test('zstd create tar', async () => {
]
.concat(IS_WINDOWS ? ['--force-local'] : [])
.concat(IS_MAC ? ['--delay-directory-restore'] : [])
.concat([
'--use-compress-program',
IS_WINDOWS ? '"zstd -T0 --long=30"' : 'zstdmt --long=30'
])
.concat(['--use-compress-program', '"zstd -T0 --adapt --long=30"'])
.join(' '),
undefined, // args
{
Expand Down Expand Up @@ -292,7 +286,7 @@ test('zstd create tar with windows BSDtar', async () => {
expect(execMock).toHaveBeenNthCalledWith(
2,
[
'zstd -T0 --long=30 --force -o',
'zstd -T0 --adapt --long=30 --force -o',
CacheFilename.Zstd.replace(/\\/g, '/'),
TarFilename.replace(/\\/g, '/')
].join(' '),
Expand Down Expand Up @@ -365,10 +359,7 @@ test('zstd list tar', async () => {
]
.concat(IS_WINDOWS ? ['--force-local'] : [])
.concat(IS_MAC ? ['--delay-directory-restore'] : [])
.concat([
'--use-compress-program',
IS_WINDOWS ? '"zstd -d --long=30"' : 'unzstd --long=30'
])
.concat(['--use-compress-program', '"zstd -d --long=30"'])
.join(' '),
undefined,
{
Expand Down Expand Up @@ -442,7 +433,7 @@ test('zstdWithoutLong list tar', async () => {
]
.concat(IS_WINDOWS ? ['--force-local'] : [])
.concat(IS_MAC ? ['--delay-directory-restore'] : [])
.concat(['--use-compress-program', IS_WINDOWS ? '"zstd -d"' : 'unzstd'])
.concat(['--use-compress-program', '"zstd -d"'])
.join(' '),
undefined,
{
Expand Down
8 changes: 6 additions & 2 deletions packages/cache/src/internal/cacheUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -102,10 +102,14 @@ export async function getCompressionMethod(): Promise<CompressionMethod> {
const version = semver.clean(versionOutput)
core.debug(`zstd version: ${version}`)

if (versionOutput === '') {
if (version === null) {
return CompressionMethod.Gzip
} else {
} else if (semver.lt(version, '1.3.2')) {
return CompressionMethod.ZstdWithoutLong
} else if (semver.lt(version, '1.3.6')) {
return CompressionMethod.ZstdWithoutAdapt
} else {
return CompressionMethod.Zstd
Comment on lines -105 to +112
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should also fix this bug, as it seems we have not actually been able to use long mode yet.

}
}

Expand Down
5 changes: 4 additions & 1 deletion packages/cache/src/internal/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,11 @@ export enum CacheFilename {
export enum CompressionMethod {
Gzip = 'gzip',
// Long range mode was added to zstd in v1.3.2.
// This enum is for earlier version of zstd that does not have --long support
// https://github.com/facebook/zstd/releases/tag/v1.3.2
ZstdWithoutLong = 'zstd-without-long',
// Adapt mode was added to zstd in v1.3.6.
// https://github.com/facebook/zstd/releases/tag/v1.3.6
ZstdWithoutAdapt = 'zstd-without-adapt',
Zstd = 'zstd'
}

Expand Down
25 changes: 13 additions & 12 deletions packages/cache/src/internal/tar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,6 @@ async function getDecompressionProgram(
archivePath: string
): Promise<string[]> {
// -d: Decompress.
// unzstd is equivalent to 'zstd -d'
// --long=#: Enables long distance matching with # bits. Maximum is 30 (1GB) on 32-bit OS and 31 (2GB) on 64-bit.
// Using 30 here because we also support 32-bit self-hosted runners.
const BSD_TAR_ZSTD =
Expand All @@ -187,26 +186,23 @@ async function getDecompressionProgram(
TarFilename,
archivePath.replace(new RegExp(`\\${path.sep}`, 'g'), '/')
]
: [
'--use-compress-program',
IS_WINDOWS ? '"zstd -d --long=30"' : 'unzstd --long=30'
]
: ['--use-compress-program', '"zstd -d --long=30"']
case CompressionMethod.ZstdWithoutLong:
return BSD_TAR_ZSTD
? [
'zstd -d --force -o',
TarFilename,
archivePath.replace(new RegExp(`\\${path.sep}`, 'g'), '/')
]
: ['--use-compress-program', IS_WINDOWS ? '"zstd -d"' : 'unzstd']
: ['--use-compress-program', '"zstd -d"']
default:
return ['-z']
}
}

// Used for creating the archive
// -T#: Compress using # working thread. If # is 0, attempt to detect and use the number of physical CPU cores.
// zstdmt is equivalent to 'zstd -T0'
// --adapt: Dynamically adapt compression level to I/O conditions.
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

// --long=#: Enables long distance matching with # bits. Maximum is 30 (1GB) on 32-bit OS and 31 (2GB) on 64-bit.
// Using 30 here because we also support 32-bit self-hosted runners.
// Long range mode is added to zstd in v1.3.2 release, so we will not use --long in older version of zstd.
Expand All @@ -223,22 +219,27 @@ async function getCompressionProgram(
case CompressionMethod.Zstd:
return BSD_TAR_ZSTD
? [
'zstd -T0 --long=30 --force -o',
'zstd -T0 --adapt --long=30 --force -o',
cacheFileName.replace(new RegExp(`\\${path.sep}`, 'g'), '/'),
TarFilename
]
: [
'--use-compress-program',
IS_WINDOWS ? '"zstd -T0 --long=30"' : 'zstdmt --long=30'
: ['--use-compress-program', '"zstd -T0 --adapt --long=30"']
case CompressionMethod.ZstdWithoutAdapt:
return BSD_TAR_ZSTD
? [
'zstd -T0 --long=30 --force -o',
cacheFileName.replace(new RegExp(`\\${path.sep}`, 'g'), '/'),
TarFilename
]
: ['--use-compress-program', '"zstd -T0 --long=30"']
case CompressionMethod.ZstdWithoutLong:
return BSD_TAR_ZSTD
? [
'zstd -T0 --force -o',
cacheFileName.replace(new RegExp(`\\${path.sep}`, 'g'), '/'),
TarFilename
]
: ['--use-compress-program', IS_WINDOWS ? '"zstd -T0"' : 'zstdmt']
: ['--use-compress-program', '"zstd -T0"']
default:
return ['-z']
}
Expand Down
Loading