Skip to content

HDDS-3128. Add ozone debug commands for Kerberos#9868

Merged
adoroszlai merged 20 commits intoapache:masterfrom
navinko:HDDS-3128
Apr 16, 2026
Merged

HDDS-3128. Add ozone debug commands for Kerberos#9868
adoroszlai merged 20 commits intoapache:masterfrom
navinko:HDDS-3128

Conversation

@navinko
Copy link
Copy Markdown
Contributor

@navinko navinko commented Mar 5, 2026

What changes were proposed in this pull request?

HDDS-3128. Add support for kdiag and kerbname commands to ozone script

  • This PR introduces two new subcommands under ozone debug kerberos to assist with Kerberos related troubleshooting in secure Ozone clusters.
  • Added changes for verifying how Kerberos principals map to local Unix users and collecting kerberos diagnostic which is useful when debugging and troubleshooting in secure clusters.
  • Implemented two subcommand 'daignose' and 'translate-principal' under ozone debug kerberos and multiple probe ,each one doing special job of getting configs and doing validation.
  • Once the 'daignose' subcommand executed successfully it will present diagnostic summary with 'PASS', 'WARN' & 'FAIL'
  • translate-principal will show the local user mapped with principal for auth_to_local rules.
  • Injected fault and validated o/ps
    • FAULT-1: Invalid KRB5_CONFIG
    • FAULT-2: Revoked execute permission
    • FAULT-3: krb5.conf with empty contents
    • FAULT-4: Updated /etc with permission

1: ozone debug kerberos translate-principal .. one or many .
This command translates Kerberos principals to local user names using the configured hadoop.security.auth_to_local rules.
Features:

Displays the active auth_to_local rule
Supports multiple principals in a single invocation
Provides clear error messages for malformed principals
Helps diagnose identity mapping issues

2: ozone debug kerberos diagnose
This command provides Kerberos diagnostics for Ozone clusters similar to hadoop kdiag.
Features:

It validates and shows below diagnostics.
Host Information
Environment Variables
JVM Kerberos Properties
Kerberos Configuration
Kerberos kinit Command
Kerberos Ticket presence
Principal Mapping
Keytab Validation
Security Configuration
Authorization Configuration
HTTP Kerberos Authentication
== Diagnostic Summary ==
PASS : pass count
WARN : warn count
FAIL : failure count

  • Fixed spotbugs + PMD issues and removed leftover configs.

What is the link to the Apache JIRA

https://issues.apache.org/jira/browse/HDDS-3128

How was this patch tested?

Copy link
Copy Markdown
Contributor

@adoroszlai adoroszlai left a comment

Choose a reason for hiding this comment

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

Thanks @navinko for working on this. I think we should add these new commands under ozone debug, not at the top-level. Also, please implement as a picocli @Command. See VersionDebug as an example. KDiag would need to be copied to Ozone and adapted.

@navinko
Copy link
Copy Markdown
Contributor Author

navinko commented Mar 5, 2026

I think we should add these new commands under ozone debug, not at the top-level. Also, please implement as a picocli @Command. See VersionDebug as an example. KDiag would need to be copied to Ozone and adapted.

Hi @adoroszlai Thank you for reviewing . I have one doubt

KDiag would need to be copied to Ozone and adapted.
Does it mean keeping the wrapper and reuse Hadoop KDiag and append Ozone diagnostics or copy the KDiag implementation into Ozone and extend it further ?

@adoroszlai
Copy link
Copy Markdown
Contributor

adoroszlai commented Mar 5, 2026

KDiag would need to be copied to Ozone and adapted.

Does it mean keeping the wrapper and reuse Hadoop KDiag and append Ozone diagnostics or copy the KDiag implementation into Ozone and extend it further ?

The latter (copy to Ozone, change to use picocli instead of its own argument parsing, replace Hadoop-specific variables/properties with Ozone-specific ones, etc.).

@navinko
Copy link
Copy Markdown
Contributor Author

navinko commented Mar 6, 2026

KDiag would need to be copied to Ozone and adapted.

Does it mean keeping the wrapper and reuse Hadoop KDiag and append Ozone diagnostics or copy the KDiag implementation into Ozone and extend it further ?

The latter (copy to Ozone, change to use picocli instead of its own argument parsing, replace Hadoop-specific variables/properties with Ozone-specific ones, etc.).

Thank you , I will update the PR shortly.

@navinko navinko marked this pull request as draft March 6, 2026 14:57
@navinko navinko marked this pull request as ready for review March 12, 2026 19:05
@navinko navinko requested a review from adoroszlai March 12, 2026 19:07
@navinko
Copy link
Copy Markdown
Contributor Author

navinko commented Mar 14, 2026

Hi @adoroszlai
The review suggestions incorporated. Kindly review the PR once you get some time.

Copy link
Copy Markdown
Contributor

@adoroszlai adoroszlai left a comment

Choose a reason for hiding this comment

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

Thanks @navinko for updating the patch. I'll need some time for the review.

Copy link
Copy Markdown
Contributor

@adoroszlai adoroszlai left a comment

Choose a reason for hiding this comment

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

Thanks @navinko for updating the patch, and sorry for the delay in review.

In addition to inline comments, I have the following suggestions:

  • create a grouping subcommand ozone debug kerberos (class: KerberosSubcommands)
  • move the two new subcommands under ozone debug kerberos as
    • kerbname => ozone debug kerberos translate-principal
    • kdiag => ozone debug kerberos diagnose
  • move all classes to a single package org.apache.hadoop.ozone.debug.kerberos (no need for separate authtolocal and kdiag packages)

Comment on lines +37 to +45
print(conf, "ozone.acl.enabled");
print(conf, "ozone.acl.authorizer.class");
print(conf, "hadoop.security.authorization");
print(conf, "ozone.om.security.client.protocol.acl");

print(conf, "hdds.security.client.datanode.container.protocol.acl");
print(conf, "hdds.security.client.scm.container.protocol.acl");
print(conf, "hdds.security.client.scm.block.protocol.acl");
print(conf, "hdds.security.client.scm.certificate.protocol.acl");
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Please use constants from HddsConfigKeys, OzoneConfigKeys etc. where available.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

there were few fields not available and i tried avoiding cyclic dependency , used as it is string .

Comment on lines +50 to +52
String value = conf.get(key);
System.out.println(key + " = "
+ (value == null ? "(unset)" : value));
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Please reuse code across various probes. The same logic also appears in HttpAuthProbe, OzonePrincipalProbe and SecurityConfigProbe. Maybe a parent class ConfigProbe?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Thanks @adoroszlai tried incorporation suggestions.


String name();

boolean run() throws Exception;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think test() would be a better name.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

updated

String realm = KerberosUtil.getDefaultRealm();
System.out.println("Default realm = " + realm);
} catch (Exception e) {
System.out.println("WARNING: Unable to determine default realm");
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think warnings and errors should be printed to System.err.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

used error stream , was using out only ealier .

@Override
public Void call() throws Exception {
System.out.println("-- Kerberos Principal Translation --");
OzoneConfiguration conf = new OzoneConfiguration();
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Let KerbNameDebug extends AbstractSubcommand, then configuration can be obtained via getOzoneConf(). It allows setting specific properties, as well as alternative config files.

The same applies to OzoneKDiag.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Thanks @adoroszlai tried incorporation suggestions.


@Override
public boolean run() {
System.out.println("-- Authorization Configuration --");
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

All DiagnosticProbe implementations have name() that could be automatically printed instead of duplicating the title in run().

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

renamed to test.

System.out.println("PASS : " + pass);
System.out.println("WARN : " + warn);
System.out.println("FAIL : " + fail);
return null;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

We may want to set non-zero exit code if there are any failures. I think it can be done by using Callable<Integer> instead of Callable<Void>.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Thanks @adoroszlai tried incorporation suggestions.

Comment on lines +62 to +63
warn++;
System.out.println("[WARN] " + probe.name());
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I tried introducing problems, e.g. by making kinit non-executable, removing permissions from /etc/krb5.conf, etc. The probes returned false, which resulted only in warnings. But the system is non-functional with this setup. Shouldn't it give errors instead of warnings?

-- Kerberos kinit Command --
Executable kinit must be available on PATH
PATH = /opt/hadoop/libexec:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/jdk-21.0.2/bin:/opt/hadoop/bin
kinit not found on PATH
[WARN] Kerberos kinit Command

-- Kerberos Ticket --
ERROR checking kerberos credentials: Can't get Kerberos realm
[WARN] Kerberos Ticket

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

fixed .

Copy link
Copy Markdown
Contributor

@adoroszlai adoroszlai left a comment

Choose a reason for hiding this comment

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

Thanks @navinko for updating the patch.

Comment on lines +39 to +41
@MetaInfServices(DebugSubcommand.class)
public class TranslatePrincipalSubcommand extends AbstractSubcommand
implements Callable<Void>, DebugSubcommand {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Please remove leftover references to DebugSubcommand (now translate-principal is under KerberosSubcommand).

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I am really sorry ,my bad:)
I am still working on the pr din't realised it is not draft anymore.

Will update the PR shortly.

@navinko navinko marked this pull request as draft April 6, 2026 19:17
@navinko
Copy link
Copy Markdown
Contributor Author

navinko commented Apr 7, 2026

Thanks @navinko for updating the patch, and sorry for the delay in review.

In addition to inline comments, I have the following suggestions:

  • create a grouping subcommand ozone debug kerberos (class: KerberosSubcommands)

  • move the two new subcommands under ozone debug kerberos as

    • kerbname => ozone debug kerberos translate-principal
    • kdiag => ozone debug kerberos diagnose
  • move all classes to a single package org.apache.hadoop.ozone.debug.kerberos (no need for separate authtolocal and kdiag packages)

Thanks @adoroszlai tried incorporation suggestions.

@navinko
Copy link
Copy Markdown
Contributor Author

navinko commented Apr 7, 2026

Hi @adoroszlai thank you for reviewing and suggestions .
The changes has been updated and tried incorporating . Please do review once you get some time.

@navinko navinko marked this pull request as ready for review April 7, 2026 15:08
Copy link
Copy Markdown
Contributor

@adoroszlai adoroszlai left a comment

Choose a reason for hiding this comment

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

Thanks a lot @navinko for updating the patch, LGTM. Let's give others some time to take a look.

@adoroszlai adoroszlai dismissed their stale review April 7, 2026 15:13

patch updated

@adoroszlai adoroszlai requested a review from ChenSammi April 7, 2026 15:14
@adoroszlai
Copy link
Copy Markdown
Contributor

@Gargi-jais11 would you like to take a look?

@Gargi-jais11
Copy link
Copy Markdown
Contributor

@Gargi-jais11 would you like to take a look?

Sure @adoroszlai will take a look into this.

Copy link
Copy Markdown
Contributor

@Gargi-jais11 Gargi-jais11 left a comment

Choose a reason for hiding this comment

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

Thanks @navinko for working on the patch. This will really be helpful change.
Please find inline comments.

Comment on lines +67 to +68
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(buffer, StandardCharsets.UTF_8));
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

A BufferedWriter is created that wraps the ByteArrayOutputStream buffer. writer is created and closed in finally — that's it. The stream that actually captures probe output is PrintStream ps. Only ps is ever used.
BufferWriter is a dead code and can be remove Line 67-68 and Line 89.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

My bad , din't realise while fixing spotbugs issues. Fixed now.

Comment on lines +61 to +66
} catch (Exception e) {
System.err.println("ERROR: Failed to translate principal "
+ principal + " : " + e.getMessage());
}
}
return null;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This subcommand impliments Callable<Void> and always returns null (exit code 0), even when a principal fails t o translates.
It should be Callable<Integer> and return a non-zero code if any principal translation fails — consistent with how DiagnoseSubcommand which returns 1 on failures.

Copy link
Copy Markdown
Contributor Author

@navinko navinko Apr 10, 2026

Choose a reason for hiding this comment

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

Thanks @Gargi-jais11 I just fixed it. I initially thought to keep it simpler since we are not doing many things here but keeping it consistent with diagnose design overall will be great .

Comment on lines +95 to +106
if (output.contains("ERROR:")) {
fail++;
out().println("[FAIL] " + probe.name());
} else if (!valid) {
warn++;
out().println("[WARN] " + probe.name());
} else {
pass++;
out().println("[PASS] " + probe.name());
}
out().println();
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Right now FAIL is infferred with output.contains("ERROR:") while WARN/PASS use probe.test()’s boolean return. Those two signals can disagree (e.g. a probe prints ERROR: but still returns success, or the opposite).
It is better to have one source of truth and drop the string scan.

Right Approach would be:
step1: create them as an enum

public enum ProbeResult {
  PASS,   // probe ran cleanly, everything looks healthy
  WARN,   // probe ran, something is misconfigured but not broken
  FAIL    // probe detected a critical problem
}

Step2: Update the DiagnosticProbe interface to:

  ProbeResult test(OzoneConfiguration conf) throws Exception;  // was: boolean

step3: then you can Update DiagnoseSubcommand — remove the string scan entirely and use the Enum created
step4: Update probes to return ProbeResult explicitly
Here are examples of all three cases:

Purely informational probe (was always return true) — EnvironmentProbe
WARN probe (suboptimal but not broken) — AuthorizationProbe
FAIL probe (critical, system broken) — KerberosConfigProbe
A probe with both WARN and FAIL paths — KerberosTicketProbe

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Used enum and updated the code.


try {
UserGroupInformation.setConfiguration(conf);
String authType = conf.getTrimmed("hadoop.security.authentication");
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Please use constant here: HADOOP_SECURITY_AUTHENTICATION

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

fixed

*
* The probe does NOT attempt to perform a login (kinit), Instead it reports
* the current state so operators can diagnose security issues.
* Checks the current Kerberos authentication state of the process.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Nit: Duplicate this can be removed.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Removed.

Comment on lines +87 to +88
// Force Kerberos failure
System.setProperty("java.security.krb5.conf", "/invalid/path");
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think you need to update the comment as java.security.krb5.conf is for jvm kerberos probe to fail and accordingly assertion should check for -- JVM Kerberos Properties -- not Kerberos configuration.
DiagnoseSubcommand prints a banner for every probe:
So "-- Kerberos Configuration --" is always printed when that probe runs, whether it PASS, WARN, or FAIL.
Asserting that string only proves “this section appeared,” not that KerberosConfigProbe was the thing that failed.
So: the test works for “something Kerberos-related failed,” but the intent and assertions don’t match what really broke.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Updated the comment , although the failure case i was testing for KerberosConfigProbe ,thats is why i was checking "-- Kerberos Configuration --
Now updated it to -- JVM Kerberos Properties --

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

That's fine you could have also done it either way.

boolean valid = true;

// Print relevant configs
print(conf, OzoneConfigKeys.OZONE_ACL_ENABLED);
Copy link
Copy Markdown
Contributor

@Gargi-jais11 Gargi-jais11 Apr 8, 2026

Choose a reason for hiding this comment

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

We should also add "ozone.authorization.enabled" in the authorisation probe,since this acts as a master switch to enable/disable authorization checks in Ozone(admin privilege checks and ACL checks).

Suggested change
print(conf, OzoneConfigKeys.OZONE_ACL_ENABLED);
print(conf, OzoneConfigKeys.OZONE_AUTHORIZATION_ENABLED);
print(conf, OzoneConfigKeys.OZONE_ACL_ENABLED);

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

thanks it make sense , added.

@navinko
Copy link
Copy Markdown
Contributor Author

navinko commented Apr 11, 2026

Thanks @Gargi-jais11 for the review, tried addressing review suggestions.
Once you get sometime please review .

@navinko navinko requested a review from Gargi-jais11 April 11, 2026 18:12
Copy link
Copy Markdown
Contributor

@Gargi-jais11 Gargi-jais11 left a comment

Choose a reason for hiding this comment

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

Thanks @navinko for updating the patch. Just few more minor comments.

Comment on lines +65 to +66
warn("Ozone security is disabled (ozone.security.enabled=false). "
+ "Authorization checks are not enforced in non-secure mode.");
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Instead of hardcoding please use the constants for key and value:

"Ozone security is disabled (" + OZONE_SECURITY_ENABLED_KEY + "=" +  OZONE_SECURITY_ENABLED_KEY_DEFAULT + ". Authorization checks are not enforced in non-secure mode."

OzoneConfigKeys.OZONE_AUTHORIZATION_ENABLED, true);

if (!ozoneAuthEnabled) {
warn("Ozone authorization is disabled (ozone.authorization.enabled=false). "
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Similarly use the constants for ozone.authorization.enabled and its default value.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Thanks @Gargi-jais11
Updated the changes .

@navinko navinko requested a review from Gargi-jais11 April 13, 2026 14:14
@adoroszlai adoroszlai changed the title HDDS-3128. Add support for kdiag and kerbname commands to ozone script HDDS-3128. Add ozone debug commands for Kerberos Apr 13, 2026
Copy link
Copy Markdown
Contributor

@Gargi-jais11 Gargi-jais11 left a comment

Choose a reason for hiding this comment

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

Thanks @navinko for updating the patch. LGTM!
Please document this tool as well. Is there any tracking jira for documenting this new tool added?

@navinko
Copy link
Copy Markdown
Contributor Author

navinko commented Apr 14, 2026

Thanks @navinko for updating the patch. LGTM! Please document this tool as well. Is there any tracking jira for documenting this new tool added?

Thanks @Gargi-jais11
I have created https://issues.apache.org/jira/browse/HDDS-14991


// Read rule
String rules = conf.getTrimmed(
"hadoop.security.auth_to_local", "DEFAULT");
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Can use CommonConfigurationKeysPublic.HADOOP_SECURITY_AUTH_TO_LOCAL.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

changed.

Comment on lines +119 to +120
public static final String HDDS_SCM_HTTP_AUTH_TYPE = "hdds.scm.http.auth.type";

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Just noticed that this is a duplicate of:

public static final String HDDS_SCM_HTTP_AUTH_TYPE =
HDDS_SCM_HTTP_AUTH_CONFIG_PREFIX + "type";

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

My bad , removed and reused exiting.


// Validate Ozone ACLs enforcement
boolean ozoneAclEnabled = conf.getBoolean(
OzoneConfigKeys.OZONE_ACL_ENABLED, false);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Suggested change
OzoneConfigKeys.OZONE_ACL_ENABLED, false);
OzoneConfigKeys.OZONE_ACL_ENABLED, OzoneConfigKeys.OZONE_ACL_ENABLED_DEFAULT);

Copy link
Copy Markdown
Contributor Author

@navinko navinko Apr 14, 2026

Choose a reason for hiding this comment

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

updated.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Thanks @adoroszlai ,
I have just updated the changes.

@navinko navinko requested a review from adoroszlai April 16, 2026 14:10
Copy link
Copy Markdown
Contributor

@adoroszlai adoroszlai left a comment

Choose a reason for hiding this comment

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

Thanks @navinko for the reminder that the patch is updated.

@adoroszlai adoroszlai merged commit 191c01c into apache:master Apr 16, 2026
46 checks passed
@adoroszlai
Copy link
Copy Markdown
Contributor

Thanks @navinko for the patch, @Gargi-jais11 for the review.

@navinko
Copy link
Copy Markdown
Contributor Author

navinko commented Apr 16, 2026

Thanks @navinko for the patch, @Gargi-jais11 for the review.

Thank you so much @adoroszlai , @Gargi-jais11 for your continued support through the review process and for getting this PR merged.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants