Apache Storm 3.2.0 Released

The Apache Storm community is pleased to announce that version 3.2.0 has been released and is available from the downloads page.

This release adds a Prometheus reporter for the V2 topology metrics, pluggable tuple tracing with an OpenTelemetry tracer, and an opt-in virtual threads flag for the Thrift server handler pools on Java 25. It also resolves three security issues (see the Security Fixes below), adds a strict deserialization mode with a typed exception for tuples with unknown task or stream ids, and removes several long-deprecated APIs and settings (see the Upgrade Notes below). All users of earlier 3.x releases are strongly encouraged to upgrade. As with 3.0.0, Java 25 is required to run Apache Storm 3.x, and the Java API remains backwards-compatible with Storm 2.x, apart from the removals listed in the Upgrade Notes.

The Storm 2.x line has reached end of life and no longer receives security fixes. Users still on 2.x should treat the issues below as unpatched there and migrate to 3.x, where they are fixed in 3.2.0.

Two of the security fixes change behaviour that users may rely on (the Logviewer no longer follows symbolic links, and DRPC and the UI deny a doAsUser request that has no authenticated user); please read the mitigations below before upgrading.

🙏 Thanks

Special thanks are due to all those who have contributed to Apache Storm -- whether through direct code contributions, documentation, bug reports, security reports, or helping other users on the mailing lists. Your efforts are much appreciated.

📋 Changes in this Release - Storm 3.2.0

Issues and pull requests addressed in the 3.2.0 release of Storm. Documentation for this release is available at the Apache Storm project site.

🔒 Security Fixes

CVE-2026-94125 - Apache Storm Nimbus: Supervisor Page Discloses Worker Placement of Other Users' Topologies

Versions Affected: 2.0.0 before 3.2.0.

Description: Nimbus returns the worker placement of every topology running on a supervisor, including the host, port, owner and resource assignment of topologies the caller is not authorized to read. In a multi-tenant cluster, an authenticated user who is allowed to access Nimbus can learn where the workers of other users' topologies run.

Mitigation: Upgrade to 3.2.0, where the supervisor page omits the workers of topologies the caller is not allowed to read. Admins and users with read access see the same page as before.

🏅 Credit: kta1kri, independent researcher, reported this issue.

CVE-2026-124495 - Apache Storm Logviewer: Logviewer Follows Worker Symlinks Across Topology ACLs

Versions Affected: 3.0.0 before 3.2.0.

Description: When workers run as the topology owner, the Logviewer serves files that a worker has placed in its own log directory as links to other files. A user who is allowed to submit topologies can read the worker logs of other users' topologies, and other files the Logviewer process can read.

Mitigation: Upgrade to 3.2.0, where the Logviewer no longer follows symbolic links below the worker log root, and worker files must be direct children of a port directory (topologyId/port/file). Deeper paths, which the old download code still served, now answer 404.

🏅 Credit: Javier García Herrera reported this issue.

CVE-2026-124496 - Apache Storm DRPC: DRPC HTTP doAsUser Bypasses the Impersonation Authorizer

Versions Affected: 3.0.0 before 3.2.0.

Description: The DRPC HTTP endpoint lets an authenticated client act as another user without applying the configured impersonation authorizer. An authenticated user can execute DRPC functions that are restricted to another user.

Mitigation: Upgrade to 3.2.0, where DRPC checks the impersonation authorizer for these requests, and the host lists in nimbus.impersonation.acl apply to HTTP requests as well. A request with doAsUser but no authenticated user is now denied with 401 by DRPC and the UI. Behind a reverse proxy, host lists match the proxy's address; see docs/SECURITY.md.

🏅 Credit: Javier García Herrera reported this issue.

⚠️ Upgrade Notes

  • [#9171] - Formally mark Pacemaker subsystem and configs for removal (#8994)

    Pacemaker is now formally marked for removal. The Pacemaker classes in storm-client and storm-server (for example Pacemaker, PacemakerServer, PacemakerClient) and the constants Config.PACEMAKER_SERVERS, Config.PACEMAKER_PORT, Config.PACEMAKER_CLIENT_MAX_THREADS, Config.PACEMAKER_AUTH_METHOD, Config.PACEMAKER_THRIFT_MESSAGE_SIZE_MAX, DaemonConfig.PACEMAKER_MAX_THREADS and DaemonConfig.PACEMAKER_CHILDOPTS are now deprecated for removal (@Deprecated(forRemoval = true)). Behavior is unchanged. Code that references them gets compiler removal warnings. Plan to stop using Pacemaker before a future release removes it.

  • [#9170] - Remove deprecated NIMBUS_SUPERVISOR_TIMEOUT_SECS and defaults entry (#8994)

    nimbus.supervisor.timeout.secs removed. The constant DaemonConfig.NIMBUS_SUPERVISOR_TIMEOUT_SECS ("nimbus.supervisor.timeout.secs"), deprecated since 3.1.0, and its entry in conf/defaults.yaml are gone. Nothing read this value: Nimbus detects a dead supervisor through its ephemeral ZooKeeper node. Remove the setting from storm.yaml, and change any code that references the constant.

  • [#9169] - Remove obsolete deprecated client Config keys (#8994)
    • Removed Configuration Keys:
      • storm.metrics.reporters: Deprecated in 2.3.0 and has now been removed. Topologies must configure worker metrics reporters using topology.metrics.reporters. Nimbus logs a warning if storm.metrics.reporters is still passed.
      • blobstore.hdfs.principal and blobstore.hdfs.keytab: Deprecated in 2.2.0 and have now been removed.
        • Action Required: Cluster operators and topology authors who previously relied on blobstore.hdfs.principal or blobstore.hdfs.keytab for HDFS Kerberos authentication must migrate their configuration to storm.hdfs.login.principal and storm.hdfs.login.keytab. Setting only the legacy blobstore.hdfs.* keys will log a warning and will no longer perform the Kerberos login.
  • [#9168] - Remove legacy ZooKeeper backpressure cluster state methods and config (#8994)

    Config.TOPOLOGY_BACKPRESSURE_ENABLE removed. The public constant Config.TOPOLOGY_BACKPRESSURE_ENABLE ("topology.backpressure.enable"), marked for removal since 2.0.0, is gone. The key is now ignored, and Nimbus logs a warning when a submitted topology sets it. Worker backpressure is handled automatically, in-process.

    Cluster state methods removed. IStormClusterState and StormClusterStateImpl no longer have backpressureTopologies, topologyBackpressure, setupBackpressure, removeBackpressure and removeWorkerBackpressure. Code that calls them must be changed.

    <storm.zookeeper.root>/backpressure znodes. Nimbus no longer creates these znodes, and no longer removes them when it cleans up a topology, so leftovers from older versions stay in ZooKeeper. One exception: when storm.nimbus.zookeeper.acls.check or storm.nimbus.zookeeper.acls.fixup is true and ZooKeeper authentication is configured, Nimbus still deletes the entries of topologies that no longer exist under that path at startup. Otherwise operators can delete the subtree in zkCli with deleteall <storm.zookeeper.root>/backpressure (default /storm/backpressure).

  • [#9167] - Remove deprecated BlowfishTupleSerializer (#8994)

    BlowfishTupleSerializer removed. The class org.apache.storm.security.serialization.BlowfishTupleSerializer, deprecated since 2.8.6, is gone, along with its constant SECRET_KEY (topology.tuple.serializer.blowfish.key). Blowfish has a 64-bit block size that is vulnerable to birthday attacks (Sweet32). Topologies and code that register or reference it must stop doing so. To encrypt tuples between workers, use TLS transport encryption (storm.messaging.netty.tls.enable, see docs/SECURITY.md). Nimbus still masks topology.tuple.serializer.blowfish.key if an old stored config contains it.

✨ Enhancements

  • [#9251] - Call getLogHandler in ShellUtilsTest failure tests
  • [#9194] - Run the Zstd compression level round-trip test
  • [#9189] - Print PR upgrade notes in the generated release notes
  • [#9186] - Restore two test annotations lost in the JUnit 5 migration
  • [#9178] - Fix the indentation the checkstyle auto-fix gets wrong
  • [#9173] - Classify surviving deprecated APIs in storm-server, external modules, and utilities (#8994)
  • [#9172] - Classify surviving deprecated storm-client APIs with forRemoval decisions (#8994)
  • [#9171] - Formally mark Pacemaker subsystem and configs for removal (#8994)
  • [#9170] - Remove deprecated NIMBUS_SUPERVISOR_TIMEOUT_SECS and defaults entry (#8994)
  • [#9169] - Remove obsolete deprecated client Config keys (#8994)
  • [#9168] - Remove legacy ZooKeeper backpressure cluster state methods and config (#8994)
  • [#9167] - Remove deprecated BlowfishTupleSerializer (#8994)
  • [#9158] - Add a Prometheus reporter for the V2 topology metrics
  • [#9154] - Add pluggable tuple tracing with an OpenTelemetry tracer
  • [#9152] - Fix the integration test cluster and window test expectations
  • [#9097] - Add an opt-in virtual threads flag for the Thrift server handler pools on Java 25
  • [#9094] - Throw a typed exception for tuples with unknown task or stream ids and add a deserialization strict mode
  • [#9093] - Log at error level when the kafka spout gives up on a tuple; document max-retry give-up semantics
  • [#9017] - Add checkstyle auto-fix tooling

📖 Documentation

  • [#9156] - Fix class names in the codebase, cgroup, metrics and Kafka docs

🐛 Bug fixing

  • [#9187] - Fix the worker-launcher build with gcc 15 and glibc 2.43
  • [#9183] - Apply the impersonation authorizer to DRPC requests
  • [#9182] - Serve only worker files that resolve inside the log root
  • [#9175] - Deliver upstream feedback to remote tasks and stop spurious "No remote destination available" warnings
  • [#9159] - Make strict deserialization mode fatal for IOException-wrapped failures
  • [#9153] - Fix supervisor crash on transient ZK connection loss
  • [#9095] - Only list workers of readable topologies on the supervisor page
  • [#9084] - Drop unexpected Pacemaker frames instead of terminating the daemon; mark Pacemaker as deprecated

📦 Dependency upgrades

  • [#9258] - Bump com.google.errorprone:error_prone_annotations from 2.50.0 to 2.52.0
  • [#9257] - Bump org.jacoco:jacoco-maven-plugin from 0.8.15 to 0.8.16
  • [#9256] - Bump org.apache.thrift:libthrift from 0.24.0 to 0.25.0
  • [#9255] - Bump org.ow2.asm:asm from 9.10.1 to 9.11.1
  • [#9254] - Bump com.fasterxml.jackson.core:jackson-databind from 2.22.2 to 2.22.4
  • [#9253] - Bump com.google.code.gson:gson from 2.14.0 to 2.15.0
  • [#9248] - Bump systeminformation from 5.31.17 to 5.33.19
  • [#9247] - Bump qs from 6.15.2 to 6.17.1
  • [#9245] - Bump express from 5.2.1 to 5.3.0
  • [#9244] - Bump start-server-and-test from 3.0.12 to 3.0.13
  • [#9243] - Bump datatables.net from 3.1.2 to 3.1.4
  • [#9242] - Bump vis-data from 8.0.5 to 8.0.6
  • [#9241] - Bump webpack from 5.111.1 to 5.112.2
  • [#9240] - Bump datatables.net-bs5 from 3.1.2 to 3.1.4
  • [#9239] - Bump cytoscape from 3.34.3 to 3.34.4
  • [#9238] - Bump cypress from 16.1.1 to 16.2.1
  • [#9237] - Bump datatables.net-dt from 3.1.2 to 3.1.4
  • [#9236] - Bump js-yaml from 5.4.2 to 5.5.0
  • [#9235] - Bump io.netty:netty-bom from 4.2.17.Final to 4.2.19.Final
  • [#9234] - Bump vis-network from 10.1.2 to 10.1.4
  • [#9232] - Bump groovy.version from 4.0.33 to 6.0.0
  • [#9230] - Bump com.fasterxml.woodstox:woodstox-core from 7.2.2 to 7.3.0
  • [#9228] - Bump jetty.version from 12.1.12 to 12.1.14
  • [#9226] - Bump com.google.guava:guava from 33.7.1-jre to 33.7.2-jre
  • [#9225] - Bump com.fasterxml.jackson:jackson-bom from 2.22.2 to 2.22.4
  • [#9223] - Bump com.esotericsoftware:kryo from 5.6.2 to 5.7.1
  • [#9222] - Bump byte-buddy.version from 1.18.12 to 1.18.16
  • [#9221] - Bump io.opentelemetry:opentelemetry-bom from 1.66.0 to 1.67.0
  • [#9219] - Bump spring.version from 7.0.9 to 7.0.10
  • [#9218] - Bump surefire.version from 3.6.0 to 3.6.1
  • [#9213] - Bump com.github.luben:zstd-jni from 1.5.7-15 to 1.5.7-25
  • [#9212] - Bump org.apache.hbase:hbase-client from 2.6.6-hadoop3 to 2.6.7-hadoop3
  • [#9211] - Bump org.apache.maven:maven-resolver-provider from 3.9.16 to 3.10.0
  • [#9209] - Bump redis.clients:jedis from 8.0.1 to 8.0.2
  • [#9208] - Bump storm.kafka.client.version from 4.3.1 to 4.4.0
  • [#9204] - Bump com.github.ben-manes.caffeine:caffeine from 3.2.4 to 3.3.1
  • [#9202] - Bump org.xerial.snappy:snappy-java from 1.1.10.8 to 1.1.10.12
  • [#9200] - Bump org.rocksdb:rocksdbjni from 10.10.1.1 to 11.8.1
  • [#9199] - Bump zookeeper.version from 3.9.5 to 3.9.7
  • [#9198] - Bump activemq.version from 6.3.1 to 6.4.0
  • [#9197] - Bump prometheus.client.version from 1.8.0 to 1.10.0
  • [#9196] - Bump commons-codec:commons-codec from 1.22.1 to 1.23.0
  • [#9195] - Bump org.apache.maven.plugins:maven-surefire-report-plugin from 3.5.6 to 3.6.1
  • [#9193] - Bump serialize-javascript from 7.0.5 to 7.1.4
  • [#9192] - Bump fast-uri from 3.1.7 to 3.1.9
  • [#9185] - Bump follow-redirects from 1.16.0 to 1.16.1
  • [#9166] - Bump joi from 18.2.5 to 18.2.9
  • [#9165] - Bump proxy-addr from 2.0.7 to 2.0.8
  • [#9164] - Bump postcss-selector-parser from 7.1.5 to 7.1.6
  • [#9163] - Bump source-map-js from 1.2.1 to 1.2.2
  • [#9151] - Bump surefire from 3.5.6 to 3.6.0
  • [#9150] - Bump iceberg from 1.11.0 to 1.12.0
  • [#9149] - Bump org.apache:apache parent from 39 to 40
  • [#9148] - Bump storm-webapp npm dependencies
  • [#9139] - Bump com.puppycrawl.tools:checkstyle from 14.0.0 to 14.3.0
  • [#9138] - Bump org.yaml:snakeyaml from 2.6 to 2.7
  • [#9132] - Bump mockito.version from 5.23.0 to 5.24.0
  • [#9119] - Bump io.github.git-commit-id:git-commit-id-maven-plugin from 10.0.0 to 10.0.1
  • [#9116] - Bump org.codehaus.mojo:exec-maven-plugin from 3.6.3 to 3.6.4
  • [#9114] - Bump org.codehaus.mojo:taglist-maven-plugin from 3.2.2 to 3.2.3
  • [#9112] - Bump org.apache.maven.plugins:maven-compiler-plugin from 3.15.0 to 3.16.0
  • [#9111] - Bump org.apache.commons:commons-lang3 from 3.20.0 to 3.21.0
  • [#9108] - Bump slf4j.version from 2.0.18 to 2.0.20
  • [#9107] - Bump bouncycastle.version from 1.85 to 1.86
  • [#9106] - Bump org.codehaus.mojo:build-helper-maven-plugin from 3.6.1 to 3.6.2
  • [#9100] - Bump netty-tcnative.version from 2.0.82.Final to 2.0.84.Final
  • [#9083] - Bump uuid to 13.0.1