From a09ca2aaed2250edab5631fba7ceeea51de3eb3b Mon Sep 17 00:00:00 2001 From: Siegfried Weber Date: Thu, 5 Nov 2026 15:17:30 +0100 Subject: [PATCH 1/4] feat: Collect the containerdebug logs --- CHANGELOG.md | 7 + .../pages/usage_guide/log_aggregation.adoc | 8 + .../build/properties/product_logging/mod.rs | 2 + .../product_logging/vector-test.yaml | 279 ++++++++++++++++++ .../properties/product_logging/vector.yaml | 87 ++++++ .../build/resource/statefulset.rs | 33 ++- ...zookeeper-vector-aggregator-values.yaml.j2 | 60 +++- 7 files changed, 458 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e1d2ca4db..8f4b26857 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,8 @@ All notable changes to this project will be documented in this file. ([#1086]). - BREAKING: Enable auto-purge feature for data directory cleanup ([#1068]). - Add `/ready` endpoint to the operator Deployment, which reports the CRD installation status ([#1090]). +- The logs of the `containerdebug` process are now collected by the Vector agent and forwarded to + the Vector aggregator ([#1106]). ### Changed @@ -49,6 +51,10 @@ All notable changes to this project will be documented in this file. See [our internal issue](https://github.com/stackabletech/hdfs-operator/issues/626) and [the fix](https://github.com/kube-rs/kube/pull/2042) for details ([#1070]). - The operator now watches all resources that it creates and early-exits the reconcile action when the cluster is marked for deletion ([#1079]). +- The `containerdebug` process writes its log file again. The operator set + `CONTAINERDEBUG_LOG_DIRECTORY`, which containerdebug stopped reading in its version 0.2.0 when it + moved to `stackable-telemetry`; the directory is now set via `FILE_LOG_DIRECTORY`. The file is + rotated hourly and at most two files are kept, because rotation is opt-in ([#1106]). [#1053]: https://github.com/stackabletech/zookeeper-operator/pull/1053 [#1060]: https://github.com/stackabletech/zookeeper-operator/pull/1060 @@ -68,6 +74,7 @@ All notable changes to this project will be documented in this file. [#1100]: https://github.com/stackabletech/zookeeper-operator/pull/1100 [#1101]: https://github.com/stackabletech/zookeeper-operator/pull/1101 [#1102]: https://github.com/stackabletech/zookeeper-operator/pull/1102 +[#1106]: https://github.com/stackabletech/zookeeper-operator/pull/1106 ## [26.7.0] - 2026-07-21 diff --git a/docs/modules/zookeeper/pages/usage_guide/log_aggregation.adoc b/docs/modules/zookeeper/pages/usage_guide/log_aggregation.adoc index cc9a529e4..877aa40e0 100644 --- a/docs/modules/zookeeper/pages/usage_guide/log_aggregation.adoc +++ b/docs/modules/zookeeper/pages/usage_guide/log_aggregation.adoc @@ -26,4 +26,12 @@ spec: replicas: 1 ---- +NOTE: The logs of the xref:concepts:observability/containerdebug.adoc[`containerdebug` process] are collected as well. +They are labelled `container: containerdebug`, although no such Kubernetes container exists. +The process runs in the background of the `zookeeper` container. +The label comes from `/stackable/log/containerdebug`, the directory which the operator sets with the `FILE_LOG_DIRECTORY` environment variable and from which the Vector agent derives the container name. +Overriding `FILE_LOG_DIRECTORY` with `envOverrides` therefore changes how these logs are aggregated. +The agent only collects files one level below `/stackable/log`, so a sibling directory such as `/stackable/log/zookeeper` relabels the events instead of dropping them, while any deeper or shallower path stops the aggregation. +A path outside `/stackable/log` also leaves the size-capped log volume. + Further information on how to configure logging, can be found in xref:concepts:logging.adoc[]. diff --git a/rust/operator-binary/src/zk_controller/build/properties/product_logging/mod.rs b/rust/operator-binary/src/zk_controller/build/properties/product_logging/mod.rs index 400cba6f0..93d2828da 100644 --- a/rust/operator-binary/src/zk_controller/build/properties/product_logging/mod.rs +++ b/rust/operator-binary/src/zk_controller/build/properties/product_logging/mod.rs @@ -80,5 +80,7 @@ mod tests { // ZooKeeper's logback writes log4j-format XML to `*.log4j.xml`, so the `files_log4j` // source matches it. assert!(content.contains("files_log4j")); + assert!(content.contains("files_tracing_rs")); + assert!(content.contains("*.tracing-rs.json")); } } diff --git a/rust/operator-binary/src/zk_controller/build/properties/product_logging/vector-test.yaml b/rust/operator-binary/src/zk_controller/build/properties/product_logging/vector-test.yaml index 14f36d8c6..4c558d3bc 100644 --- a/rust/operator-binary/src/zk_controller/build/properties/product_logging/vector-test.yaml +++ b/rust/operator-binary/src/zk_controller/build/properties/product_logging/vector-test.yaml @@ -137,6 +137,285 @@ tests: "timestamp": t'2025-10-02T09:27:28.582Z' } + assert_eq!(expected_log_event, .) + - name: Test tracing-rs log + inputs: + - type: log + insert_at: processed_files_tracing_rs + log_fields: + file: /stackable/log/containerdebug/containerdebug.2026-11-02-14.tracing-rs.json + message: '{"timestamp":"2026-11-02T14:49:28.028922Z","level":"INFO","fields":{"message":"found disk","disk.name":"overlay"},"target":"containerdebug::system_information::disk"}' + pod: test-zk-server-default-0 + source_type: file + timestamp: 2026-11-02T14:49:29.473487331Z + outputs: + - extract_from: extended_logs + expected_event_count: 1 + conditions: + - type: vrl + source: | + expected_log_event = { + "cluster": "test-zk", + "container": "containerdebug", + "file": "containerdebug.2026-11-02-14.tracing-rs.json", + "level": "INFO", + "logger": "containerdebug::system_information::disk", + "message": "found disk\n\ndisk.name=overlay", + "timestamp": t'2026-11-02T14:49:28.028922Z', + "namespace": "default", + "pod": "test-zk-server-default-0", + "role": "server", + "roleGroup": "default" + } + + assert_eq!(expected_log_event, .) + - name: Test unparsable tracing-rs log + inputs: + - type: log + insert_at: processed_files_tracing_rs + log_fields: + file: /stackable/log/containerdebug/containerdebug.2026-11-02-14.tracing-rs.json + message: '{ unparsable' + pod: test-zk-server-default-0 + source_type: file + timestamp: 2026-11-02T14:49:29.473487331Z + outputs: + - extract_from: extended_logs + expected_event_count: 1 + conditions: + - type: vrl + source: | + expected_log_event = { + "cluster": "test-zk", + "container": "containerdebug", + "errors": [ + .errors[0] + ], + "file": "containerdebug.2026-11-02-14.tracing-rs.json", + "level": "INFO", + "logger": "", + "message": "{ unparsable", + "timestamp": .timestamp, + "namespace": "default", + "pod": "test-zk-server-default-0", + "role": "server", + "roleGroup": "default" + } + + assert_eq!(expected_log_event, .) + + # The remainder of the message contains character offsets into + # the VRL source, so only the stable prefix is asserted. + assert!(starts_with!(.errors[0], "JSON not parsable: ")) + - name: Test tracing-rs log which is not a JSON object + inputs: + - type: log + insert_at: processed_files_tracing_rs + log_fields: + file: /stackable/log/containerdebug/containerdebug.2026-11-02-14.tracing-rs.json + message: 'false' + pod: test-zk-server-default-0 + source_type: file + timestamp: 2026-11-02T14:49:29.473487331Z + outputs: + - extract_from: extended_logs + expected_event_count: 1 + conditions: + - type: vrl + source: | + expected_log_event = { + "cluster": "test-zk", + "container": "containerdebug", + "errors": [ + "Parsed event is not a JSON object." + ], + "file": "containerdebug.2026-11-02-14.tracing-rs.json", + "level": "INFO", + "logger": "", + "message": "false", + "timestamp": .timestamp, + "namespace": "default", + "pod": "test-zk-server-default-0", + "role": "server", + "roleGroup": "default" + } + + assert_eq!(expected_log_event, .) + - name: Test tracing-rs log with invalid fields + inputs: + - type: log + insert_at: processed_files_tracing_rs + log_fields: + file: /stackable/log/containerdebug/containerdebug.2026-11-02-14.tracing-rs.json + message: '{"timestamp":"unparsable","level":"INVALID","fields":"none","target":null}' + pod: test-zk-server-default-0 + source_type: file + timestamp: 2026-11-02T14:49:29.473487331Z + outputs: + - extract_from: extended_logs + expected_event_count: 1 + conditions: + - type: vrl + source: | + expected_log_event = { + "cluster": "test-zk", + "container": "containerdebug", + "errors": [ + .errors[0], + "Logger/target not found.", + "Level \"INVALID\" unknown, using \"INFO\" instead.", + "Fields are not an object." + ], + "file": "containerdebug.2026-11-02-14.tracing-rs.json", + "level": "INFO", + "logger": "", + "message": "{\"timestamp\":\"unparsable\",\"level\":\"INVALID\",\"fields\":\"none\",\"target\":null}", + "timestamp": .timestamp, + "namespace": "default", + "pod": "test-zk-server-default-0", + "role": "server", + "roleGroup": "default" + } + + assert_eq!(expected_log_event, .) + + # The remainder of the message contains character offsets into + # the VRL source, so only the stable prefix is asserted. + assert!(starts_with!(.errors[0], "Timestamp not parsable, using current time instead: ")) + - name: Test tracing-rs log without a timestamp + inputs: + - type: log + insert_at: processed_files_tracing_rs + log_fields: + file: /stackable/log/containerdebug/containerdebug.2026-11-02-14.tracing-rs.json + message: '{"level":"INFO","fields":{"message":"found disk"},"target":"containerdebug::system_information::disk"}' + pod: test-zk-server-default-0 + source_type: file + timestamp: 2026-11-02T14:49:29.473487331Z + outputs: + - extract_from: extended_logs + expected_event_count: 1 + conditions: + - type: vrl + source: | + expected_log_event = { + "cluster": "test-zk", + "container": "containerdebug", + "errors": [ + "Timestamp not found, using current time instead." + ], + "file": "containerdebug.2026-11-02-14.tracing-rs.json", + "level": "INFO", + "logger": "containerdebug::system_information::disk", + "message": "found disk", + "timestamp": .timestamp, + "namespace": "default", + "pod": "test-zk-server-default-0", + "role": "server", + "roleGroup": "default" + } + + assert_eq!(expected_log_event, .) + + # The current time is used and not the timestamp which the file + # source attached to the event. The latter reaches the transform + # as a string, whereas now() yields a timestamp. + assert!(is_timestamp(.timestamp)) + - name: Test tracing-rs log without a message but with other fields + inputs: + - type: log + insert_at: processed_files_tracing_rs + log_fields: + file: /stackable/log/containerdebug/containerdebug.2026-11-02-14.tracing-rs.json + message: '{"timestamp":"2026-11-02T14:49:28.028922Z","level":"INFO","fields":{"disk.name":"overlay"},"target":"containerdebug::system_information::disk"}' + pod: test-zk-server-default-0 + source_type: file + timestamp: 2026-11-02T14:49:29.473487331Z + outputs: + - extract_from: extended_logs + expected_event_count: 1 + conditions: + - type: vrl + source: | + expected_log_event = { + "cluster": "test-zk", + "container": "containerdebug", + "file": "containerdebug.2026-11-02-14.tracing-rs.json", + "level": "INFO", + "logger": "containerdebug::system_information::disk", + "message": "disk.name=overlay", + "timestamp": t'2026-11-02T14:49:28.028922Z', + "namespace": "default", + "pod": "test-zk-server-default-0", + "role": "server", + "roleGroup": "default" + } + + assert_eq!(expected_log_event, .) + - name: Test tracing-rs log with a message which is not a string + inputs: + - type: log + insert_at: processed_files_tracing_rs + log_fields: + file: /stackable/log/containerdebug/containerdebug.2026-11-02-14.tracing-rs.json + message: '{"timestamp":"2026-11-02T14:49:28.028922Z","level":"INFO","fields":{"message":42,"disk.name":"overlay"},"target":"containerdebug::system_information::disk"}' + pod: test-zk-server-default-0 + source_type: file + timestamp: 2026-11-02T14:49:29.473487331Z + outputs: + - extract_from: extended_logs + expected_event_count: 1 + conditions: + - type: vrl + source: | + expected_log_event = { + "cluster": "test-zk", + "container": "containerdebug", + "file": "containerdebug.2026-11-02-14.tracing-rs.json", + "level": "INFO", + "logger": "containerdebug::system_information::disk", + "message": "disk.name=overlay\nmessage=42", + "timestamp": t'2026-11-02T14:49:28.028922Z', + "namespace": "default", + "pod": "test-zk-server-default-0", + "role": "server", + "roleGroup": "default" + } + + assert_eq!(expected_log_event, .) + - name: Test tracing-rs log without any fields + inputs: + - type: log + insert_at: processed_files_tracing_rs + log_fields: + file: /stackable/log/containerdebug/containerdebug.2026-11-02-14.tracing-rs.json + message: '{"timestamp":"2026-11-02T14:49:28.028922Z","level":"INFO","fields":{},"target":"containerdebug::system_information::disk"}' + pod: test-zk-server-default-0 + source_type: file + timestamp: 2026-11-02T14:49:29.473487331Z + outputs: + - extract_from: extended_logs + expected_event_count: 1 + conditions: + - type: vrl + source: | + expected_log_event = { + "cluster": "test-zk", + "container": "containerdebug", + "errors": [ + "Message not found." + ], + "file": "containerdebug.2026-11-02-14.tracing-rs.json", + "level": "INFO", + "logger": "containerdebug::system_information::disk", + "message": "", + "timestamp": t'2026-11-02T14:49:28.028922Z', + "namespace": "default", + "pod": "test-zk-server-default-0", + "role": "server", + "roleGroup": "default" + } + assert_eq!(expected_log_event, .) - name: Test Vector internal logs inputs: diff --git a/rust/operator-binary/src/zk_controller/build/properties/product_logging/vector.yaml b/rust/operator-binary/src/zk_controller/build/properties/product_logging/vector.yaml index 1d4e04b04..fea1f94e1 100644 --- a/rust/operator-binary/src/zk_controller/build/properties/product_logging/vector.yaml +++ b/rust/operator-binary/src/zk_controller/build/properties/product_logging/vector.yaml @@ -30,6 +30,12 @@ sources: condition_pattern: ^ Vec { @@ -186,10 +192,15 @@ pub fn build_server_rolegroup_statefulset( &SERVER_JVMFLAGS, construct_non_heap_jvm_args(rolegroup_config), ) + // The directory must be exactly one level below the log directory, because the Vector + // agent derives the container name from that path segment. .with_value( - &CONTAINERDEBUG_LOG_DIRECTORY, - format!("{STACKABLE_LOG_DIR}/containerdebug"), + &FILE_LOG_DIRECTORY, + concatcp!(STACKABLE_LOG_DIR, "/containerdebug"), ) + // Rotation is opt-in, so without these the file would grow unbounded. + .with_value(&FILE_LOG_ROTATION_PERIOD, "hourly") + .with_value(&FILE_LOG_MAX_FILES, "2") .merge(rolegroup_config.env_overrides.clone()); // Build the `data` PVC and the container resource requirements from the merged config. @@ -280,6 +291,7 @@ pub fn build_server_rolegroup_statefulset( {COMMON_BASH_TRAP_FUNCTIONS} {remove_vector_shutdown_file_command} prepare_signal_handlers + mkdir --parents \"$FILE_LOG_DIRECTORY\" containerdebug --output={STACKABLE_LOG_DIR}/containerdebug-state.json --loop & bin/zkServer.sh start-foreground {STACKABLE_RW_CONFIG_DIR}/{zoo_cfg} & wait_for_termination $! @@ -368,6 +380,9 @@ pub fn build_server_rolegroup_statefulset( .context(AddVolumeSnafu)? .add_empty_dir_volume( &*LOG_VOLUME_NAME, + // Only the log files listed here are budgeted. The `containerdebug` files in this + // volume are rotated by time, not by size, so they have no budget; raising + // `FILE_LOG_LEVEL` via `envOverrides` can therefore evict the Pod. Some(product_logging::framework::calculate_log_volume_size_limit( &[ properties::product_logging::MAX_ZK_LOG_FILES_SIZE, @@ -486,7 +501,9 @@ mod tests { let _ = *ZOOCFGDIR; let _ = *ZK_SERVER_HEAP; let _ = *SERVER_JVMFLAGS; - let _ = *CONTAINERDEBUG_LOG_DIRECTORY; + let _ = *FILE_LOG_DIRECTORY; + let _ = *FILE_LOG_MAX_FILES; + let _ = *FILE_LOG_ROTATION_PERIOD; } /// Builds the `default` server StatefulSet for `yaml` and returns the ConfigMap name mounted by @@ -601,19 +618,19 @@ mod tests { } /// The user-supplied `envOverrides` must be merged in after all operator-set environment - /// variables, so that they can override any of them. `CONTAINERDEBUG_LOG_DIRECTORY` is used + /// variables, so that they can override any of them. `FILE_LOG_DIRECTORY` is used /// as the example here because it is set unconditionally by the operator. #[test] fn env_overrides_override_operator_set_env_vars() { let env = env_with_override( ZOOKEEPER_CONTAINER_NAME.as_ref(), - &CONTAINERDEBUG_LOG_DIRECTORY, + &FILE_LOG_DIRECTORY, "/custom/log/dir", ); let containerdebug: Vec<_> = env .iter() - .filter(|env_var| env_var.name == "CONTAINERDEBUG_LOG_DIRECTORY") + .filter(|env_var| env_var.name == "FILE_LOG_DIRECTORY") .collect(); assert_eq!( containerdebug.len(), diff --git a/tests/templates/kuttl/logging/zookeeper-vector-aggregator-values.yaml.j2 b/tests/templates/kuttl/logging/zookeeper-vector-aggregator-values.yaml.j2 index 866b7e23a..c63499f8c 100644 --- a/tests/templates/kuttl/logging/zookeeper-vector-aggregator-values.yaml.j2 +++ b/tests/templates/kuttl/logging/zookeeper-vector-aggregator-values.yaml.j2 @@ -22,41 +22,63 @@ customConfig: transforms: validEvents: type: filter - inputs: [vector] + inputs: + - vector condition: is_null(.errors) filteredAutomaticLogConfigPrepare: type: filter - inputs: [validEvents] + inputs: + - validEvents condition: |- .pod == "test-zk-server-automatic-log-config-0" && .container == "prepare" + filteredAutomaticLogConfigContainerdebug: + type: filter + inputs: + - validEvents + condition: >- + .pod == "test-zk-server-automatic-log-config-0" && + .container == "containerdebug" filteredAutomaticLogConfigVector: type: filter - inputs: [validEvents] + inputs: + - validEvents condition: |- .pod == "test-zk-server-automatic-log-config-0" && .container == "vector" filteredAutomaticLogConfigZookeeper: type: filter - inputs: [validEvents] + inputs: + - validEvents condition: |- .pod == "test-zk-server-automatic-log-config-0" && .container == "zookeeper" filteredCustomLogConfigPrepare: type: filter - inputs: [validEvents] + inputs: + - validEvents condition: |- .pod == "test-zk-server-custom-log-config-0" && .container == "prepare" + filteredCustomLogConfigContainerdebug: + type: filter + inputs: + - validEvents + condition: >- + .pod == "test-zk-server-custom-log-config-0" && + .container == "containerdebug" filteredCustomLogConfigVector: type: filter - inputs: [validEvents] + inputs: + - validEvents condition: |- .pod == "test-zk-server-custom-log-config-0" && .container == "vector" filteredCustomLogConfigZookeeper: type: filter - inputs: [validEvents] + inputs: + - validEvents condition: |- .pod == "test-zk-server-custom-log-config-0" && .container == "zookeeper" filteredInvalidEvents: type: filter - inputs: [vector] + inputs: + - vector condition: |- .timestamp == from_unix_timestamp!(0) || is_null(.level) || @@ -64,11 +86,29 @@ customConfig: is_null(.message) sinks: test: - inputs: [filtered*] + inputs: + - filtered* type: blackhole + # Shows all events received from the agents. This sink is intentional and + # not a debugging leftover: if a "filtered*" transform gathers no event, + # then the assertion only reports a count, whereas this log shows which + # pod and container names actually arrived. A failure in CI cannot be + # reproduced by enabling this afterwards, so it is kept enabled at the + # price of the log volume. + stdout: + inputs: + - vector + type: console + encoding: + codec: json + buffer: + # Avoid back pressure from a stalling stdout. The test should not + # fail because of a sink which only aids debugging. + when_full: drop_newest {% if lookup('env', 'VECTOR_AGGREGATOR') %} aggregator: - inputs: [vector] + inputs: + - vector type: vector routing: endpoints: From 251a57e893d9ca5fe6779c3b42908cf00a5ff5e6 Mon Sep 17 00:00:00 2001 From: Siegfried Weber Date: Mon, 9 Nov 2026 18:28:24 +0100 Subject: [PATCH 2/4] chore: Apply findings from other operators --- .../properties/product_logging/vector.yaml | 2 +- .../build/resource/statefulset.rs | 3 +- tests/templates/kuttl/smoke/14-assert.yaml.j2 | 174 ++++++++++++++++++ 3 files changed, 177 insertions(+), 2 deletions(-) diff --git a/rust/operator-binary/src/zk_controller/build/properties/product_logging/vector.yaml b/rust/operator-binary/src/zk_controller/build/properties/product_logging/vector.yaml index fea1f94e1..7c8789859 100644 --- a/rust/operator-binary/src/zk_controller/build/properties/product_logging/vector.yaml +++ b/rust/operator-binary/src/zk_controller/build/properties/product_logging/vector.yaml @@ -122,7 +122,6 @@ transforms: } } - # Extends the processed files with the fields "container" and "file" # Transforms the tracing-rs JSON logs written by the containerdebug process processed_files_tracing_rs: inputs: @@ -203,6 +202,7 @@ transforms: } } + # Extends the processed files with the fields "container" and "file" extended_logs_files: inputs: - processed_files_stdout diff --git a/rust/operator-binary/src/zk_controller/build/resource/statefulset.rs b/rust/operator-binary/src/zk_controller/build/resource/statefulset.rs index 908da807c..26c19b07d 100644 --- a/rust/operator-binary/src/zk_controller/build/resource/statefulset.rs +++ b/rust/operator-binary/src/zk_controller/build/resource/statefulset.rs @@ -291,13 +291,14 @@ pub fn build_server_rolegroup_statefulset( {COMMON_BASH_TRAP_FUNCTIONS} {remove_vector_shutdown_file_command} prepare_signal_handlers - mkdir --parents \"$FILE_LOG_DIRECTORY\" + mkdir --parents \"${file_log_directory}\" || true containerdebug --output={STACKABLE_LOG_DIR}/containerdebug-state.json --loop & bin/zkServer.sh start-foreground {STACKABLE_RW_CONFIG_DIR}/{zoo_cfg} & wait_for_termination $! {create_vector_shutdown_file_command} ", zoo_cfg = ConfigFileName::ZooCfg, + file_log_directory = FILE_LOG_DIRECTORY.as_ref(), remove_vector_shutdown_file_command = remove_vector_shutdown_file_command(STACKABLE_LOG_DIR), create_vector_shutdown_file_command = diff --git a/tests/templates/kuttl/smoke/14-assert.yaml.j2 b/tests/templates/kuttl/smoke/14-assert.yaml.j2 index a5193cfde..7ea98d27b 100644 --- a/tests/templates/kuttl/smoke/14-assert.yaml.j2 +++ b/tests/templates/kuttl/smoke/14-assert.yaml.j2 @@ -176,6 +176,12 @@ commands: condition_pattern: ^ Date: Mon, 9 Nov 2026 18:28:51 +0100 Subject: [PATCH 3/4] chore: Upgrade serde-saphyr --- Cargo.lock | 6 +++--- Cargo.nix | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fd9161007..189bf0366 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2818,12 +2818,12 @@ dependencies = [ [[package]] name = "serde-saphyr" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f4dc2714fc5632417a6e979602d7044bad8f2880c63fc7217087180acec31b6" +checksum = "d43fb82d550b07e6f929a58d7d0935182602f48ddead875f5ee313c41c8f07fe" dependencies = [ "annotate-snippets", - "base64 0.23.1", + "base64 0.22.1", "encoding_rs_io", "granit-parser", "nohash-hasher", diff --git a/Cargo.nix b/Cargo.nix index 5fc9ecbfa..3bb68ba84 100644 --- a/Cargo.nix +++ b/Cargo.nix @@ -9680,10 +9680,10 @@ rec { }; "serde-saphyr" = rec { crateName = "serde-saphyr"; - version = "2.1.0"; + version = "2.1.1"; edition = "2024"; crateBin = []; - sha256 = "1diixjn80w882xrgqqqci3rdifj4f0nn0yg9lqbj8qy59xqw4k9z"; + sha256 = "1zh7iwfc84z3brgqgbfyips049hq6l4pv3d557wyc1qbalnvhgyl"; libName = "serde_saphyr"; license = "MIT OR Apache-2.0"; dependencies = [ @@ -9694,7 +9694,7 @@ rec { } { name = "base64"; - packageId = "base64 0.23.1"; + packageId = "base64 0.22.1"; optional = true; } { From 411fe3297c0370643f328a2a27ccf0207c1ce490 Mon Sep 17 00:00:00 2001 From: Siegfried Weber Date: Tue, 10 Nov 2026 11:46:32 +0100 Subject: [PATCH 4/4] chore: Revert downgrade of base64 --- Cargo.lock | 2 +- Cargo.nix | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 189bf0366..8c0115e46 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2823,7 +2823,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d43fb82d550b07e6f929a58d7d0935182602f48ddead875f5ee313c41c8f07fe" dependencies = [ "annotate-snippets", - "base64 0.22.1", + "base64 0.23.1", "encoding_rs_io", "granit-parser", "nohash-hasher", diff --git a/Cargo.nix b/Cargo.nix index 3bb68ba84..5f15a3c30 100644 --- a/Cargo.nix +++ b/Cargo.nix @@ -9694,7 +9694,7 @@ rec { } { name = "base64"; - packageId = "base64 0.22.1"; + packageId = "base64 0.23.1"; optional = true; } {