Skip to content

Commit

Permalink
contrib: add qatzstd compressor (envoyproxy#32166)
Browse files Browse the repository at this point in the history
Signed-off-by: giantcroc <[email protected]>
  • Loading branch information
GiantCroc authored Mar 17, 2024
1 parent 0dede36 commit 9e447bf
Show file tree
Hide file tree
Showing 41 changed files with 909 additions and 72 deletions.
1 change: 1 addition & 0 deletions api/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ proto_library(
visibility = ["//visibility:public"],
deps = [
"//contrib/envoy/extensions/compression/qatzip/compressor/v3alpha:pkg",
"//contrib/envoy/extensions/compression/qatzstd/compressor/v3alpha:pkg",
"//contrib/envoy/extensions/filters/http/checksum/v3alpha:pkg",
"//contrib/envoy/extensions/filters/http/dynamo/v3:pkg",
"//contrib/envoy/extensions/filters/http/golang/v3alpha:pkg",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# DO NOT EDIT. This file is generated by tools/proto_format/proto_sync.py.

load("@envoy_api//bazel:api_build_system.bzl", "api_proto_package")

licenses(["notice"]) # Apache 2

api_proto_package(
deps = ["@com_github_cncf_xds//udpa/annotations:pkg"],
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
syntax = "proto3";

package envoy.extensions.compression.qatzstd.compressor.v3alpha;

import "google/protobuf/wrappers.proto";

import "udpa/annotations/status.proto";
import "validate/validate.proto";

option java_package = "io.envoyproxy.envoy.extensions.compression.qatzstd.compressor.v3alpha";
option java_outer_classname = "QatzstdProto";
option java_multiple_files = true;
option go_package = "github.com/envoyproxy/go-control-plane/contrib/envoy/extensions/compression/qatzstd/compressor/v3alpha";
option (udpa.annotations.file_status).package_version_status = ACTIVE;

// [#protodoc-title: Qatzstd Compressor]
// Qatzstd :ref:`configuration overview <config_qatzstd>`.
// [#extension: envoy.compression.qatzstd.compressor]

// [#next-free-field: 8]
message Qatzstd {
// Reference to http://facebook.github.io/zstd/zstd_manual.html
enum Strategy {
DEFAULT = 0;
FAST = 1;
DFAST = 2;
GREEDY = 3;
LAZY = 4;
LAZY2 = 5;
BTLAZY2 = 6;
BTOPT = 7;
BTULTRA = 8;
BTULTRA2 = 9;
}

// Set compression parameters according to pre-defined compression level table.
// Note that exact compression parameters are dynamically determined,
// depending on both compression level and source content size (when known).
// Value 0 means default, and default level is 3.
//
// Setting a level does not automatically set all other compression parameters
// to default. Setting this will however eventually dynamically impact the compression
// parameters which have not been manually set. The manually set
// ones will 'stick'.
google.protobuf.UInt32Value compression_level = 1 [(validate.rules).uint32 = {lte: 22 gte: 1}];

// A 32-bits checksum of content is written at end of frame. If not set, defaults to false.
bool enable_checksum = 2;

// The higher the value of selected strategy, the more complex it is,
// resulting in stronger and slower compression.
//
// Special: value 0 means "use default strategy".
Strategy strategy = 3 [(validate.rules).enum = {defined_only: true}];

// Value for compressor's next output buffer. If not set, defaults to 4096.
google.protobuf.UInt32Value chunk_size = 5 [(validate.rules).uint32 = {lte: 65536 gte: 4096}];

// Enable QAT to accelerate Zstd compression or not. If not set, defaults to false.
//
// This is useful in the case that users want to enable QAT for a period of time and disable QAT for another period of time,
// they don't have to change the config too much or prepare for another config that has software zstd compressor and just changing the value of this filed.
bool enable_qat_zstd = 6;

// Fallback to software for Qatzstd when input size is less than this value.
// Valid only ``enable_qat_zstd`` is ``true``. 0 means no fallback at all. If not set, defaults to 4000.
google.protobuf.UInt32Value qat_zstd_fallback_threshold = 7
[(validate.rules).uint32 = {lte: 65536 gte: 0}];
}
1 change: 1 addition & 0 deletions api/versioning/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ proto_library(
visibility = ["//visibility:public"],
deps = [
"//contrib/envoy/extensions/compression/qatzip/compressor/v3alpha:pkg",
"//contrib/envoy/extensions/compression/qatzstd/compressor/v3alpha:pkg",
"//contrib/envoy/extensions/config/v3alpha:pkg",
"//contrib/envoy/extensions/filters/http/checksum/v3alpha:pkg",
"//contrib/envoy/extensions/filters/http/dynamo/v3:pkg",
Expand Down
13 changes: 13 additions & 0 deletions bazel/foreign_cc/qatzstd.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
diff --git a/src/Makefile b/src/Makefile
index 1abf10d..c5fa3a6 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -54,7 +54,7 @@ ifneq ($(ICP_ROOT), )
endif
else
QATFLAGS = -DINTREE
- LDFLAGS = -lqat
+ LDFLAGS += -lqat
ifneq ($(ENABLE_USDM_DRV), 0)
QATFLAGS += -DENABLE_USDM_DRV
LDFLAGS += -lusdm
9 changes: 9 additions & 0 deletions bazel/repositories.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,7 @@ def envoy_dependencies(skip_targets = []):
_com_github_intel_ipp_crypto_crypto_mb_fips()
_com_github_intel_qatlib()
_com_github_intel_qatzip()
_com_github_qat_zstd()
_com_github_lz4_lz4()
_com_github_jbeder_yaml_cpp()
_com_github_libevent_libevent()
Expand Down Expand Up @@ -585,6 +586,14 @@ def _com_github_intel_qatzip():
build_file_content = BUILD_ALL_CONTENT,
)

def _com_github_qat_zstd():
external_http_archive(
name = "com_github_qat_zstd",
build_file_content = BUILD_ALL_CONTENT,
patch_args = ["-p1"],
patches = ["@envoy//bazel/foreign_cc:qatzstd.patch"],
)

def _com_github_lz4_lz4():
external_http_archive(
name = "com_github_lz4_lz4",
Expand Down
17 changes: 16 additions & 1 deletion bazel/repository_locations.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -446,7 +446,7 @@ REPOSITORY_LOCATIONS_SPEC = dict(
urls = ["https://github.com/intel/qatlib/archive/refs/tags/{version}.tar.gz"],
use_category = ["dataplane_ext"],
release_date = "2024-02-20",
extensions = ["envoy.tls.key_providers.qat", "envoy.compression.qatzip.compressor"],
extensions = ["envoy.tls.key_providers.qat", "envoy.compression.qatzip.compressor", "envoy.compression.qatzstd.compressor"],
cpe = "N/A",
license = "BSD-3-Clause",
license_url = "https://github.com/intel/qatlib/blob/{version}/LICENSE",
Expand All @@ -466,6 +466,21 @@ REPOSITORY_LOCATIONS_SPEC = dict(
license = "BSD-3-Clause",
license_url = "https://github.com/intel/QATzip/blob/v{version}/LICENSE",
),
com_github_qat_zstd = dict(
project_name = "QAT-ZSTD-Plugin",
project_desc = "Intel® QuickAssist Technology ZSTD Plugin (QAT ZSTD Plugin)",
project_url = "https://github.com/intel/QAT-ZSTD-Plugin/",
version = "0.1.0",
sha256 = "74c5bfbb3b0c6f1334e128ee0b43958d1d34751a4762e54e8f970c443e445f33",
strip_prefix = "QAT-ZSTD-Plugin-{version}",
urls = ["https://github.com/intel/QAT-ZSTD-Plugin/archive/refs/tags/v{version}.tar.gz"],
use_category = ["dataplane_ext"],
extensions = [
"envoy.compression.qatzstd.compressor",
],
release_date = "2023-09-08",
cpe = "N/A",
),
com_github_luajit_luajit = dict(
project_name = "LuaJIT",
project_desc = "Just-In-Time compiler for Lua",
Expand Down
3 changes: 3 additions & 0 deletions changelogs/current.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,9 @@ new_features:
change: |
added support for :ref:`%UPSTREAM_CONNECTION_ID% <config_access_log_format_upstream_connection_id>` for the upstream connection
identifier.
- area: compression
change: |
Added Qatzstd :ref:`compressor <envoy_v3_api_msg_extensions.compression.qatzstd.compressor.v3alpha.Qatzstd>`.
- area: aws_lambda
change: |
Added :ref:`host_rewrite <envoy_v3_api_field_extensions.filters.http.aws_lambda.v3.Config.host_rewrite>` config to be used
Expand Down
2 changes: 2 additions & 0 deletions contrib/all_contrib_extensions.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ ARM64_SKIP_CONTRIB_TARGETS = [
"envoy.tls.key_providers.qat",
"envoy.network.connection_balance.dlb",
"envoy.compression.qatzip.compressor",
"envoy.compression.qatzstd.compressor",
]
PPC_SKIP_CONTRIB_TARGETS = [
"envoy.tls.key_providers.cryptomb",
Expand All @@ -26,6 +27,7 @@ PPC_SKIP_CONTRIB_TARGETS = [
"envoy.network.connection_balance.dlb",
"envoy.regex_engines.hyperscan",
"envoy.compression.qatzip.compressor",
"envoy.compression.qatzstd.compressor",
]

FIPS_LINUX_X86_SKIP_CONTRIB_TARGETS = [
Expand Down
1 change: 1 addition & 0 deletions contrib/contrib_build_config.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ CONTRIB_EXTENSIONS = {
#

"envoy.compression.qatzip.compressor": "//contrib/qat/compression/qatzip/compressor/source:config",
"envoy.compression.qatzstd.compressor": "//contrib/qat/compression/qatzstd/compressor/source:config",

#
# HTTP filters
Expand Down
5 changes: 5 additions & 0 deletions contrib/extensions_metadata.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,11 @@ envoy.compression.qatzip.compressor:
- envoy.compression.compressor
security_posture: robust_to_untrusted_downstream_and_upstream
status: alpha
envoy.compression.qatzstd.compressor:
categories:
- envoy.compression.compressor
security_posture: robust_to_untrusted_downstream_and_upstream
status: alpha
envoy.filters.http.squash:
categories:
- envoy.filters.http
Expand Down
6 changes: 5 additions & 1 deletion contrib/qat/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,16 @@ configure_make(
configure_options = [
"--disable-fast-crc-in-assembler",
"--disable-systemd",
"--disable-shared",
"--with-pic",
"--enable-shared",
"--enable-static",
"--enable-samples=no",
],
lib_source = "@com_github_intel_qatlib//:all",
out_shared_libs = [
"libqat.so",
"libusdm.so",
],
out_static_libs = [
"libqat.a",
"libusdm.a",
Expand Down
69 changes: 69 additions & 0 deletions contrib/qat/compression/qatzstd/compressor/source/BUILD
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
load("@rules_foreign_cc//foreign_cc:defs.bzl", "make")
load(
"//bazel:envoy_build_system.bzl",
"envoy_cc_contrib_extension",
"envoy_cc_library",
"envoy_contrib_package",
)

licenses(["notice"]) # Apache 2

envoy_contrib_package()

make(
name = "qat-zstd",
build_data = ["@com_github_qat_zstd//:all"],
env = select({
"//bazel:clang_build": {
"CFLAGS": "-Wno-error=unused-parameter -Wno-error=unused-command-line-argument -I$$EXT_BUILD_DEPS/qatlib/include -I$$EXT_BUILD_DEPS/zstd/include",
},
"//conditions:default": {
"CFLAGS": "-I$$EXT_BUILD_DEPS/qatlib/include -I$$EXT_BUILD_DEPS/zstd/include",
},
}),
includes = [],
lib_source = "@com_github_qat_zstd//:all",
out_static_libs = ["libqatseqprod.a"],
tags = ["skip_on_windows"],
target_compatible_with = [
"@platforms//os:linux",
"@platforms//cpu:x86_64",
],
targets = [
"ENABLE_USDM_DRV=1",
"install",
],
deps = [
"//contrib/qat:qatlib",
"//external:zstd",
],
)

envoy_cc_library(
name = "compressor_lib",
srcs = ["qatzstd_compressor_impl.cc"],
hdrs = ["qatzstd_compressor_impl.h"],
deps = [
":qat-zstd",
"//envoy/compression/compressor:compressor_interface",
"//envoy/server:factory_context_interface",
"//source/common/buffer:buffer_lib",
"//source/common/compression/zstd/common:zstd_base_lib",
"//source/common/compression/zstd/compressor:compressor_base",
],
)

envoy_cc_contrib_extension(
name = "config",
srcs = ["config.cc"],
hdrs = ["config.h"],
deps = [
":compressor_lib",
":qat-zstd",
"//envoy/event:dispatcher_interface",
"//envoy/thread_local:thread_local_interface",
"//source/common/http:headers_lib",
"//source/extensions/compression/common/compressor:compressor_factory_base_lib",
"@envoy_api//contrib/envoy/extensions/compression/qatzstd/compressor/v3alpha:pkg_cc_proto",
],
)
81 changes: 81 additions & 0 deletions contrib/qat/compression/qatzstd/compressor/source/config.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
#include "contrib/qat/compression/qatzstd/compressor/source/config.h"

namespace Envoy {
namespace Extensions {
namespace Compression {
namespace Qatzstd {
namespace Compressor {

QatzstdCompressorFactory::QatzstdCompressorFactory(
const envoy::extensions::compression::qatzstd::compressor::v3alpha::Qatzstd& qatzstd,
ThreadLocal::SlotAllocator& tls)
: compression_level_(
PROTOBUF_GET_WRAPPED_OR_DEFAULT(qatzstd, compression_level, ZSTD_CLEVEL_DEFAULT)),
enable_checksum_(qatzstd.enable_checksum()), strategy_(qatzstd.strategy()),
chunk_size_(PROTOBUF_GET_WRAPPED_OR_DEFAULT(qatzstd, chunk_size, ZSTD_CStreamOutSize())),
enable_qat_zstd_(qatzstd.enable_qat_zstd()),
qat_zstd_fallback_threshold_(PROTOBUF_GET_WRAPPED_OR_DEFAULT(
qatzstd, qat_zstd_fallback_threshold, DefaultQatZstdFallbackThreshold)),
tls_slot_(nullptr) {
if (enable_qat_zstd_) {
tls_slot_ = ThreadLocal::TypedSlot<QatzstdThreadLocal>::makeUnique(tls);
tls_slot_->set([](Event::Dispatcher&) { return std::make_shared<QatzstdThreadLocal>(); });
}
}

QatzstdCompressorFactory::QatzstdThreadLocal::QatzstdThreadLocal()
: initialized_(false), sequenceProducerState_(nullptr) {}

QatzstdCompressorFactory::QatzstdThreadLocal::~QatzstdThreadLocal() {
if (initialized_) {
/* Free sequence producer state */
QZSTD_freeSeqProdState(sequenceProducerState_);
/* Stop QAT device, please call this function when
you won't use QAT anymore or before the process exits */
QZSTD_stopQatDevice();
}
}

void* QatzstdCompressorFactory::QatzstdThreadLocal::GetQATSession() {
// The session must be initialized only once in every worker thread.
if (!initialized_) {

int status = QZSTD_startQatDevice();
// RELEASE_ASSERT(status == QZSTD_OK, "failed to initialize hardware");
if (status != QZSTD_OK) {
ENVOY_LOG(warn, "Failed to initialize qat hardware");
} else {
ENVOY_LOG(debug, "Initialize qat hardware successful");
}
sequenceProducerState_ = QZSTD_createSeqProdState();
initialized_ = true;
}

return sequenceProducerState_;
}

Envoy::Compression::Compressor::CompressorPtr QatzstdCompressorFactory::createCompressor() {
return std::make_unique<QatzstdCompressorImpl>(
compression_level_, enable_checksum_, strategy_, chunk_size_, enable_qat_zstd_,
qat_zstd_fallback_threshold_, enable_qat_zstd_ ? tls_slot_->get()->GetQATSession() : nullptr);
}

Envoy::Compression::Compressor::CompressorFactoryPtr
QatzstdCompressorLibraryFactory::createCompressorFactoryFromProtoTyped(
const envoy::extensions::compression::qatzstd::compressor::v3alpha::Qatzstd& proto_config,
Server::Configuration::FactoryContext& context) {
return std::make_unique<QatzstdCompressorFactory>(proto_config,
context.serverFactoryContext().threadLocal());
}

/**
* Static registration for the zstd compressor library. @see NamedCompressorLibraryConfigFactory.
*/
REGISTER_FACTORY(QatzstdCompressorLibraryFactory,
Envoy::Compression::Compressor::NamedCompressorLibraryConfigFactory);

} // namespace Compressor
} // namespace Qatzstd
} // namespace Compression
} // namespace Extensions
} // namespace Envoy
Loading

0 comments on commit 9e447bf

Please sign in to comment.