https://github.com/apache/pulsar/pull/25329

# PIP-462: Remove Etcd metadata store backend

## Motivation

Apache Pulsar supports multiple metadata store backends through the
pluggable `MetadataStore` interface introduced in PIP-45. One of these
backends is Etcd, implemented via the `jetcd` client library. While
the Etcd backend has been available since the metadata store
abstraction was introduced, it has seen very limited adoption in
production environments.

Maintaining Etcd support imposes several costs on the project:

1. **Dependency burden**: The `jetcd-core` library pulls in a large
transitive dependency tree (gRPC, Netty, Vert.x, and others) that
conflicts with dependencies used elsewhere in Pulsar. This required
creating a dedicated shading module (`jetcd-core-shaded`) with
relocations for `io.vertx` and `io.netty` packages.

2. **Distribution size**: The shaded jetcd JAR and its transitive
dependencies increase both the Pulsar tarball and Docker image size
significantly, even for users who never use Etcd.

3. **Library maintenance concerns**: The `jetcd` library is not
actively maintained, making it increasingly risky to depend on for a
production metadata backend. Security patches and compatibility
updates may lag behind.

4. **Maintenance overhead**: The `EtcdMetadataStore` implementation,
`EtcdSessionWatcher`, and associated test infrastructure must be
maintained, tested, and considered in every metadata store interface
change.

5. **Strategic direction**: Both ZooKeeper and Oxia are fully
supported and battle-tested metadata store backends. Oxia is a
purpose-built metadata store designed for Pulsar with superior
operational characteristics, and the community's future efforts are
focused there. Maintaining a third, unused backend dilutes this focus.

Given that Etcd is not used in production deployments, adds
significant distribution size, relies on a poorly maintained client
library, and competes for attention with the strategically preferred
Oxia backend, removing it simplifies the project and reduces the
maintenance surface area.

## Goals

### In Scope

- Remove the `EtcdMetadataStore` and `EtcdSessionWatcher`
implementation classes from `pulsar-metadata`
- Remove the `EtcdMetadataStoreProvider` registration from
`MetadataStoreFactoryImpl`
- Remove the `jetcd-core-shaded` shading module entirely
- Remove `jetcd-core` and `jetcd-test` dependency declarations from
the root `pom.xml`
- Remove Etcd-specific tests (`EtcdMetadataStoreTest`)
- Remove or update any documentation references to Etcd as a supported backend
- Provide a clear error message if a user configures an `etcd:`
metadata store URL, guiding them to use ZooKeeper or Oxia instead

### Out of Scope

- Changes to ZooKeeper or Oxia metadata store implementations
- Changes to the `MetadataStore` interface or plugin system

## High Level Design

The removal is a straightforward deletion of code and dependencies:

1. **Implementation removal**: Delete `EtcdMetadataStore.java` and
`EtcdSessionWatcher.java` from `pulsar-metadata`.

2. **Provider deregistration**: Remove the Etcd provider from
`MetadataStoreFactoryImpl`. Add a check that produces a clear error
message when an `etcd:` URL is configured, informing operators that
Etcd is no longer supported and recommending ZooKeeper or Oxia.

3. **Module removal**: Delete the `jetcd-core-shaded` module and
remove it from the root `pom.xml` modules list.

4. **Dependency cleanup**: Remove `jetcd-core`, `jetcd-test`, and
`jetcd-core-shaded` dependency declarations from the root `pom.xml`
dependency management section. Remove these dependencies from
`pulsar-metadata/pom.xml`.

5. **Test removal**: Delete `EtcdMetadataStoreTest.java`.

## Detailed Design

### Implementation Classes

The following source files will be deleted:
- 
`pulsar-metadata/src/main/java/org/apache/pulsar/metadata/impl/EtcdMetadataStore.java`
(includes inner `EtcdMetadataStoreProvider` class)
- 
`pulsar-metadata/src/main/java/org/apache/pulsar/metadata/impl/EtcdSessionWatcher.java`

### Factory Update

In `MetadataStoreFactoryImpl`, the Etcd provider registration will be
removed from `loadProviders()`. A runtime check will be added so that
if a user configures `metadataStoreUrl=etcd:...`, the broker fails
fast with a clear error:

```
Etcd metadata store backend has been removed in Pulsar 5.0.
Please use ZooKeeper (zk:) or Oxia (oxia:) as your metadata store.
See PIP-462 for details.
```

### Module Removal

The `jetcd-core-shaded/` directory will be deleted entirely, and the
`<module>jetcd-core-shaded</module>` entry will be removed from the
root `pom.xml`.

### Dependency Removal

The following entries will be removed from the root `pom.xml`:

>From `<dependencyManagement>`:
- `io.etcd:jetcd-core`
- `io.etcd:jetcd-test`
- `org.apache.pulsar:jetcd-core-shaded`

>From `pulsar-metadata/pom.xml`:
- `org.apache.pulsar:jetcd-core-shaded` (compile dependency)
- `io.etcd:jetcd-test` (test dependency)

### Test Removal

The following test file will be deleted:
- 
`pulsar-metadata/src/test/java/org/apache/pulsar/metadata/impl/EtcdMetadataStoreTest.java`

## Public-facing Changes

### Configuration

The `metadataStoreUrl` and `configurationMetadataStoreUrl`
configuration keys will no longer accept `etcd:` URLs. Attempting to
start a broker, proxy, or other Pulsar component with an Etcd metadata
URL will result in a clear error message at startup.

### Binary Protocol

No changes.

### CLI

No changes. CLI tools that accept metadata store URLs (e.g., `pulsar
initialize-cluster-metadata`) will reject `etcd:` URLs with a
descriptive error.

### Metrics

No changes.

## General Notes

The `MetadataStore` plugin system (PIP-45) remains fully intact. If
there is community interest in continuing Etcd support, it can be
maintained as an external plugin outside the core Pulsar repository,
without any changes to the Pulsar codebase.

### Related PIPs

- PIP-45: Pluggable metadata interface (introduced the MetadataStore
abstraction and Etcd backend)
- PIP-454: Metadata Store Migration Framework (provides migration path
for users needing to switch backends)



--
Matteo Merli
<[email protected]>

Reply via email to