You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by lh...@apache.org on 2026/06/23 21:44:09 UTC
(pulsar-site) branch main updated (3749fafa616 -> 7effc9f983f)
This is an automated email from the ASF dual-hosted git repository.
lhotari pushed a change to branch main
in repository https://gitbox.apache.org/repos/asf/pulsar-site.git
from 3749fafa616 Blog: Announcing Apache Pulsar 5.0.0-M1 (preview release) (#1178)
new 58108c679bd add rest-apidoc for 5.0.0-M1
new 891c6f8c91a Generate Javadoc from the Gradle build for Pulsar 5.0.0+/master
new 56268c15e10 Publish V5 client Javadoc and link types from the V5 doc
new cec920754f8 Link V5 client method calls in the java-v5 doc to their Javadoc
new 38dd851e683 add reference for 5.0.0-M1
new ae5c2ecb974 Add 5.0.x to static/reference/index.html
new a0ac084cce5 Update 5.0.x to .htaccess redirect
new 01ddfe8c829 Add 5.0.x to DocsVersionDropdownNavbarItem.js
new 4bfbe8df6e0 Document pulsar-admin migration and scalable-topics commands
new 1c4d81762c5 Add release notes for 5.0.0-M1
new 0d8b637e0e7 Show 5.0.0-M1 as a milestone release on the download page
new c93844b3cbf Fix link
new 6738b7bdb69 Add version tokens for V5 client and current milestone
new 1a5b9955667 Add versioned_docs for 5.0.x
new 9c21b03327f Update internal links in blog post
new 7effc9f983f Add links to the blog post
The 16 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
blog/2026-06-23-announcing-apache-pulsar-5-0-m1.md | 6 +-
client-libraries/java-migrate-to-v5.md | 4 +-
client-libraries/java-setup.md | 12 +-
client-libraries/java-v5.md | 30 +-
data/release-java.js | 7 +
data/release-pulsar.js | 9 +
docusaurus.config.ts | 4 +-
release-notes/versioned/client-java-5.0.0-M1.md | 40 +
release-notes/versioned/pulsar-5.0.0-M1.md | 427 ++++++++
releases.json | 1 +
src/components/SupportedVersionsTable.tsx | 52 +-
src/components/downloads.tsx | 102 +-
src/config/pulsarVariables.ts | 58 ++
src/pages/download.mdx | 34 +-
src/theme/DocsVersionDropdownNavbarItem.js | 5 +
static/.htaccess | 2 +-
static/openapi/{master => 5.0.0-M1}/openapi.json | 0
.../{master => 5.0.0-M1}/openapifunctions.json | 0
.../{master => 5.0.0-M1}/openapilookup.json | 0
.../{master => 5.0.0-M1}/openapipackages.json | 0
.../openapi/{master => 5.0.0-M1}/openapisink.json | 0
.../{master => 5.0.0-M1}/openapisource.json | 0
.../{master => 5.0.0-M1}/openapitransactions.json | 0
.../openapi/{master => 5.0.0-M1/v2}/openapi.json | 0
.../{master => 5.0.0-M1/v2}/openapilookup.json | 0
.../{master => 5.0.0-M1/v3}/openapifunctions.json | 0
.../{master => 5.0.0-M1/v3}/openapipackages.json | 0
.../{master => 5.0.0-M1/v3}/openapisink.json | 0
.../{master => 5.0.0-M1/v3}/openapisource.json | 0
.../v3}/openapitransactions.json | 0
static/reference/{2.10.x => 5.0.x}/README.md | 0
static/reference/{3.0.x => 5.0.x}/_sidebar.md | 2 +
.../{2.10.x => 5.0.x}/bookkeeper/README.md | 0
.../{3.0.x => 5.0.x}/bookkeeper/bookkeeper.md | 0
static/reference/{2.10.x => 5.0.x}/cli.md | 0
static/reference/{3.1.x => 5.0.x}/client/README.md | 0
.../client/client-configuration-client.md | 4 +-
.../client/client-configuration-consumer.md | 0
.../client/client-configuration-producer.md | 0
.../client/client-configuration-reader.md | 0
static/reference/{3.0.x => 5.0.x}/config/README.md | 0
.../config/reference-configuration-bookkeeper.md | 0
.../config/reference-configuration-broker.md | 24 +-
.../config/reference-configuration-client.md | 4 +-
.../config/reference-configuration-log4j-shell.md | 0
.../config/reference-configuration-log4j.md | 0
.../config/reference-configuration-pulsar-proxy.md | 0
.../config/reference-configuration-standalone.md | 24 +-
.../config/reference-configuration-websocket.md | 0
.../config/reference-configuration-zookeeper.md | 0
.../{3.0.x => 5.0.x}/pulsar-admin/README.md | 0
.../{3.3.x => 5.0.x}/pulsar-admin/bookies.md | 0
.../{3.3.x => 5.0.x}/pulsar-admin/broker-stats.md | 0
.../{3.3.x => 5.0.x}/pulsar-admin/brokers.md | 0
.../{3.3.x => 5.0.x}/pulsar-admin/clusters.md | 0
.../pulsar-admin/functions-worker.md | 0
.../{3.3.x => 5.0.x}/pulsar-admin/functions.md | 0
.../pulsar-admin/migration.md} | 30 +-
.../{4.2.x => 5.0.x}/pulsar-admin/namespaces.md | 0
.../pulsar-admin/ns-isolation-policy.md | 0
.../{3.3.x => 5.0.x}/pulsar-admin/packages.md | 0
.../{3.3.x => 5.0.x}/pulsar-admin/proxy-stats.md | 0
.../pulsar-admin/resource-quotas.md | 0
.../pulsar-admin/resourcegroups.md | 0
.../5.0.x/pulsar-admin/scalable-topics.md | 1090 ++++++++++++++++++++
.../{4.0.x => 5.0.x}/pulsar-admin/schemas.md | 0
.../{3.3.x => 5.0.x}/pulsar-admin/sinks.md | 0
.../{3.3.x => 5.0.x}/pulsar-admin/sources.md | 0
.../{3.3.x => 5.0.x}/pulsar-admin/tenants.md | 0
.../{4.2.x => 5.0.x}/pulsar-admin/topicPolicies.md | 0
.../{4.1.x => 5.0.x}/pulsar-admin/topics.md | 0
.../{3.3.x => 5.0.x}/pulsar-admin/transactions.md | 0
.../{3.0.x => 5.0.x}/pulsar-client/README.md | 0
.../{next => 5.0.x}/pulsar-client/pulsar-client.md | 0
.../{2.10.x => 5.0.x}/pulsar-daemon/README.md | 0
.../pulsar-daemon/pulsar-daemon.md | 0
.../{3.0.x => 5.0.x}/pulsar-perf/README.md | 0
.../{next => 5.0.x}/pulsar-perf/pulsar-perf.md | 0
.../{2.11.x => 5.0.x}/pulsar-shell/README.md | 0
.../{3.0.x => 5.0.x}/pulsar-shell/pulsar-shell.md | 0
.../reference/{2.10.x => 5.0.x}/pulsar/README.md | 0
.../{3.3.x => 5.0.x}/pulsar/broker-tool.md | 0
static/reference/{3.3.x => 5.0.x}/pulsar/broker.md | 0
.../{4.0.x => 5.0.x}/pulsar/compact-topic.md | 0
.../pulsar/delete-cluster-metadata.md | 0
.../{3.3.x => 5.0.x}/pulsar/functions-worker.md | 0
.../pulsar/initialize-cluster-metadata.md | 1 +
.../pulsar/initialize-namespace.md | 0
.../initialize-transaction-coordinator-metadata.md | 0
static/reference/{3.3.x => 5.0.x}/pulsar/proxy.md | 0
.../reference/{next => 5.0.x}/pulsar/standalone.md | 0
static/reference/{4.0.x => 5.0.x}/pulsar/tokens.md | 0
.../reference/{3.3.x => 5.0.x}/pulsar/version.md | 0
.../reference/{3.3.x => 5.0.x}/pulsar/websocket.md | 0
static/reference/index.html | 3 +-
static/reference/next/_sidebar.md | 2 +
.../pulsar-admin/migration.md} | 30 +-
.../reference/next/pulsar-admin/scalable-topics.md | 1090 ++++++++++++++++++++
static/swagger/restApiVersions.json | 19 +
tools/pytools/lib/execute/javadoc_generator.py | 140 ++-
.../lib/execute/pulsar_admin_clidoc_generator.py | 6 +
{docs => versioned_docs/version-5.0.x}/about.md | 0
.../version-5.0.x}/adaptors-kafka.md | 0
.../version-5.0.x}/adaptors-spark.md | 0
.../version-5.0.x}/adaptors-storm.md | 0
.../version-5.0.x}/admin-api-brokers.md | 0
.../version-5.0.x}/admin-api-clusters.md | 0
.../version-5.0.x}/admin-api-features.md | 0
.../version-5.0.x}/admin-api-functions.md | 0
.../version-5.0.x}/admin-api-namespaces.md | 0
.../admin-api-non-partitioned-topics.md | 0
.../admin-api-non-persistent-topics.md | 0
.../version-5.0.x}/admin-api-overview.md | 0
.../version-5.0.x}/admin-api-packages.md | 0
.../version-5.0.x}/admin-api-partitioned-topics.md | 0
.../version-5.0.x}/admin-api-permissions.md | 0
.../version-5.0.x}/admin-api-persistent-topics.md | 0
.../version-5.0.x}/admin-api-scalable-topics.md | 0
.../version-5.0.x}/admin-api-schemas.md | 0
.../version-5.0.x}/admin-api-tenants.md | 0
.../version-5.0.x}/admin-api-tools.md | 0
.../version-5.0.x}/admin-api-topics.md | 0
.../version-5.0.x}/admin-api-transactions.md | 0
.../version-5.0.x}/admin-api-tutorial.md | 0
.../version-5.0.x}/admin-api-use-cases.md | 0
.../version-5.0.x}/admin-get-started.md | 0
.../administration-anti-affinity-namespaces.md | 0
.../version-5.0.x}/administration-dekaf-ui.md | 0
.../version-5.0.x}/administration-geo.md | 0
.../administration-isolation-bookie.md | 0
.../administration-isolation-broker.md | 0
.../version-5.0.x}/administration-isolation.md | 0
.../version-5.0.x}/administration-load-balance.md | 0
.../administration-metadata-store-migration.md | 0
.../administration-metadata-store.md | 0
.../version-5.0.x}/administration-proxy.md | 0
.../administration-pulsar-manager.md | 0
.../version-5.0.x}/administration-pulsar-shell.md | 0
.../version-5.0.x}/administration-stats.md | 0
.../version-5.0.x}/administration-upgrade.md | 0
.../version-5.0.x}/administration-zk-bk.md | 0
.../bookkeeper-metadata-serviceuri.md | 0
.../concepts-architecture-overview.md | 0
.../version-5.0.x}/concepts-authentication.md | 0
.../concepts-broker-load-balancing-benefits.md | 0
.../concepts-broker-load-balancing-concepts.md | 0
.../concepts-broker-load-balancing-features.md | 0
.../concepts-broker-load-balancing-migration.md | 0
.../concepts-broker-load-balancing-overview.md | 0
.../concepts-broker-load-balancing-quick-start.md | 0
.../concepts-broker-load-balancing-types.md | 0
.../concepts-broker-load-balancing-use-cases.md | 0
.../version-5.0.x}/concepts-clients.md | 0
.../concepts-cluster-level-failover.md | 0
.../version-5.0.x}/concepts-messaging.md | 0
.../version-5.0.x}/concepts-multi-tenancy.md | 0
.../concepts-multiple-advertised-listeners.md | 0
.../version-5.0.x}/concepts-overview.md | 0
.../version-5.0.x}/concepts-proxy-sni-routing.md | 0
.../version-5.0.x}/concepts-replication.md | 0
.../version-5.0.x}/concepts-scalable-topics.md | 0
.../version-5.0.x}/concepts-throttling.md | 0
.../version-5.0.x}/concepts-tiered-storage.md | 0
.../version-5.0.x}/concepts-topic-compaction.md | 0
.../version-5.0.x}/concepts-transactions.md | 0
.../version-5.0.x}/cookbooks-bookkeepermetadata.md | 0
.../version-5.0.x}/cookbooks-compaction.md | 0
.../version-5.0.x}/cookbooks-deduplication.md | 0
.../version-5.0.x}/cookbooks-encryption.md | 0
.../version-5.0.x}/cookbooks-message-queue.md | 0
.../version-5.0.x}/cookbooks-non-persistent.md | 0
.../version-5.0.x}/cookbooks-partitioned.md | 0
.../version-5.0.x}/cookbooks-retention-expiry.md | 0
.../version-5.0.x}/cookbooks-tiered-storage.md | 0
.../version-5.0.x}/deploy-aws.md | 0
.../deploy-bare-metal-multi-cluster.md | 0
.../version-5.0.x}/deploy-bare-metal.md | 0
.../version-5.0.x}/deploy-docker.md | 0
.../version-5.0.x}/deploy-ibm.md | 0
.../version-5.0.x}/deploy-kubernetes.md | 0
.../version-5.0.x}/deploy-monitoring.md | 0
.../version-5.0.x}/develop-load-manager.md | 0
.../version-5.0.x}/develop-plugin.md | 0
.../version-5.0.x}/develop-tools.md | 0
.../version-5.0.x}/developers-landing.md | 0
.../version-5.0.x}/developing-binary-protocol.md | 0
.../version-5.0.x}/functions-cli.md | 0
.../version-5.0.x}/functions-concepts.md | 0
.../version-5.0.x}/functions-debug-cli.md | 0
.../version-5.0.x}/functions-debug-localrun.md | 0
.../version-5.0.x}/functions-debug-log-topic.md | 0
.../version-5.0.x}/functions-debug-stderr.md | 0
.../version-5.0.x}/functions-debug-unit-test.md | 0
.../version-5.0.x}/functions-debug.md | 0
.../version-5.0.x}/functions-deploy-arguments.md | 0
.../functions-deploy-cluster-builtin.md | 0
.../functions-deploy-cluster-encryption.md | 0
.../functions-deploy-cluster-package.md | 0
.../functions-deploy-cluster-parallelism.md | 0
.../functions-deploy-cluster-resource.md | 0
.../version-5.0.x}/functions-deploy-cluster.md | 0
.../version-5.0.x}/functions-deploy-localrun.md | 0
.../version-5.0.x}/functions-deploy-trigger.md | 0
.../version-5.0.x}/functions-deploy.md | 0
.../version-5.0.x}/functions-develop-admin-api.md | 0
.../version-5.0.x}/functions-develop-api.md | 0
.../version-5.0.x}/functions-develop-log.md | 0
.../version-5.0.x}/functions-develop-metrics.md | 0
.../functions-develop-schema-registry.md | 0
.../version-5.0.x}/functions-develop-security.md | 0
.../version-5.0.x}/functions-develop-serde.md | 0
.../version-5.0.x}/functions-develop-state.md | 0
.../version-5.0.x}/functions-develop-tutorial.md | 0
.../functions-develop-user-defined-configs.md | 0
.../version-5.0.x}/functions-develop.md | 0
.../version-5.0.x}/functions-overview.md | 0
.../version-5.0.x}/functions-package-go.md | 0
.../version-5.0.x}/functions-package-java.md | 0
.../version-5.0.x}/functions-package-python.md | 0
.../version-5.0.x}/functions-package.md | 0
.../version-5.0.x}/functions-quickstart.md | 0
.../functions-runtime-java-options.md | 0
.../version-5.0.x}/functions-runtime-kubernetes.md | 0
.../version-5.0.x}/functions-runtime-process.md | 0
.../version-5.0.x}/functions-runtime-thread.md | 0
.../version-5.0.x}/functions-runtime.md | 0
.../version-5.0.x}/functions-worker-corun.md | 0
.../functions-worker-for-geo-replication.md | 0
.../functions-worker-run-separately.md | 0
.../version-5.0.x}/functions-worker-stateful.md | 0
.../functions-worker-temp-file-path.md | 0
.../functions-worker-troubleshooting.md | 0
.../version-5.0.x}/functions-worker.md | 0
.../version-5.0.x}/get-started-pulsar-admin.md | 0
.../getting-started-docker-compose.md | 0
.../version-5.0.x}/getting-started-docker.md | 0
.../version-5.0.x}/getting-started-helm.md | 0
.../version-5.0.x}/getting-started-home.md | 0
.../version-5.0.x}/getting-started-standalone.md | 0
.../version-5.0.x}/helm-deploy.md | 0
.../version-5.0.x}/helm-install.md | 0
.../version-5.0.x}/helm-overview.md | 0
.../version-5.0.x}/helm-prepare.md | 0
.../version-5.0.x}/helm-tools.md | 0
.../version-5.0.x}/helm-upgrade.md | 0
.../version-5.0.x}/how-to-landing.md | 0
.../install-deploy-upgrade-landing.md | 0
.../version-5.0.x}/io-aerospike-sink.md | 0
.../version-5.0.x}/io-aerospike.md | 0
.../version-5.0.x}/io-alluxio.md | 0
.../version-5.0.x}/io-azuredataexplorer-sink.md | 0
.../version-5.0.x}/io-canal-source.md | 0
.../version-5.0.x}/io-cassandra-sink.md | 0
.../version-5.0.x}/io-cassandra.md | 0
.../version-5.0.x}/io-cdc-canal.md | 0
.../version-5.0.x}/io-cdc-debezium.md | 0
{docs => versioned_docs/version-5.0.x}/io-cdc.md | 0
{docs => versioned_docs/version-5.0.x}/io-cli.md | 0
.../version-5.0.x}/io-connectors.md | 0
.../version-5.0.x}/io-debezium-source.md | 0
{docs => versioned_docs/version-5.0.x}/io-debug.md | 0
.../version-5.0.x}/io-develop.md | 0
.../version-5.0.x}/io-dynamodb-source.md | 0
.../version-5.0.x}/io-dynamodb.md | 0
.../version-5.0.x}/io-elasticsearch-sink.md | 0
.../version-5.0.x}/io-elasticsearch.md | 0
.../version-5.0.x}/io-file-source.md | 0
{docs => versioned_docs/version-5.0.x}/io-file.md | 0
.../version-5.0.x}/io-hbase-sink.md | 0
{docs => versioned_docs/version-5.0.x}/io-hbase.md | 0
{docs => versioned_docs/version-5.0.x}/io-hdfs.md | 0
.../version-5.0.x}/io-hdfs2-sink.md | 0
.../version-5.0.x}/io-hdfs3-sink.md | 0
.../version-5.0.x}/io-http-sink.md | 0
.../version-5.0.x}/io-influxdb-sink.md | 0
.../version-5.0.x}/io-influxdb.md | 0
.../version-5.0.x}/io-jdbc-sink.md | 0
{docs => versioned_docs/version-5.0.x}/io-jdbc.md | 0
.../version-5.0.x}/io-kafka-sink.md | 0
.../version-5.0.x}/io-kafka-source.md | 0
{docs => versioned_docs/version-5.0.x}/io-kafka.md | 0
.../version-5.0.x}/io-kinesis-sink.md | 0
.../version-5.0.x}/io-kinesis-source.md | 0
.../version-5.0.x}/io-kinesis.md | 0
.../version-5.0.x}/io-mongo-sink.md | 0
.../version-5.0.x}/io-mongo-source.md | 0
{docs => versioned_docs/version-5.0.x}/io-mongo.md | 0
.../version-5.0.x}/io-netty-source.md | 0
{docs => versioned_docs/version-5.0.x}/io-netty.md | 0
.../version-5.0.x}/io-nsq-source.md | 0
{docs => versioned_docs/version-5.0.x}/io-nsq.md | 0
.../version-5.0.x}/io-overview.md | 0
.../version-5.0.x}/io-quickstart.md | 0
.../version-5.0.x}/io-rabbitmq-sink.md | 0
.../version-5.0.x}/io-rabbitmq-source.md | 0
.../version-5.0.x}/io-rabbitmq.md | 0
.../version-5.0.x}/io-redis-sink.md | 0
{docs => versioned_docs/version-5.0.x}/io-redis.md | 0
.../version-5.0.x}/io-solr-sink.md | 0
{docs => versioned_docs/version-5.0.x}/io-solr.md | 0
{docs => versioned_docs/version-5.0.x}/io-tcp.md | 0
{docs => versioned_docs/version-5.0.x}/io-use.md | 0
.../version-5.0.x}/kubernetes-helm.md | 0
.../version-5.0.x}/performance-pulsar-perf.md | 0
.../version-5.0.x}/pulsar-api-overview.md | 0
.../version-5.0.x}/reference-cli-tools.md | 0
.../version-5.0.x}/reference-configuration.md | 0
.../version-5.0.x}/reference-connector-admin.md | 0
.../version-5.0.x}/reference-landing.md | 0
.../reference-metrics-opentelemetry.md | 0
.../version-5.0.x}/reference-metrics.md | 0
.../version-5.0.x}/reference-pulsar-admin.md | 0
.../version-5.0.x}/reference-rest-api-overview.md | 0
.../version-5.0.x}/reference-terminology.md | 0
.../schema-evolution-compatibility.md | 0
.../version-5.0.x}/schema-get-started.md | 0
.../version-5.0.x}/schema-manage.md | 0
.../version-5.0.x}/schema-overview.md | 0
.../version-5.0.x}/schema-understand.md | 0
.../version-5.0.x}/security-athenz.md | 0
.../version-5.0.x}/security-authorization.md | 0
.../version-5.0.x}/security-basic-auth.md | 0
.../version-5.0.x}/security-bouncy-castle.md | 0
.../version-5.0.x}/security-encryption.md | 0
.../version-5.0.x}/security-extending.md | 0
.../version-5.0.x}/security-jwt.md | 0
.../version-5.0.x}/security-kerberos.md | 0
.../version-5.0.x}/security-oauth2.md | 0
.../version-5.0.x}/security-openid-connect.md | 0
.../version-5.0.x}/security-overview.md | 0
.../version-5.0.x}/security-tls-authentication.md | 0
.../version-5.0.x}/security-tls-transport.md | 0
.../version-5.0.x}/security-token-admin.md | 0
.../version-5.0.x}/standalone-docker.md | 0
.../version-5.0.x}/standalone.md | 0
.../version-5.0.x}/tiered-storage-aliyun.md | 0
.../version-5.0.x}/tiered-storage-aws.md | 0
.../version-5.0.x}/tiered-storage-azure.md | 0
.../version-5.0.x}/tiered-storage-filesystem.md | 0
.../version-5.0.x}/tiered-storage-gcs.md | 0
.../version-5.0.x}/tiered-storage-overview.md | 0
.../version-5.0.x}/tiered-storage-s3.md | 0
.../version-5.0.x}/transaction-api.md | 0
.../version-5.0.x}/transaction-guarantee.md | 0
.../version-5.0.x}/tutorials-namespace.md | 0
.../version-5.0.x}/tutorials-produce-consume.md | 0
.../version-5.0.x}/tutorials-tenant.md | 0
.../version-5.0.x}/tutorials-topic.md | 0
.../version-5.0.x}/txn-advanced-features.md | 0
{docs => versioned_docs/version-5.0.x}/txn-how.md | 0
.../version-5.0.x}/txn-monitor.md | 0
{docs => versioned_docs/version-5.0.x}/txn-use.md | 0
{docs => versioned_docs/version-5.0.x}/txn-what.md | 0
{docs => versioned_docs/version-5.0.x}/txn-why.md | 0
.../version-5.0.x}/window-functions-context.md | 0
.../version-5.0.x-sidebars.json | 0
versions.json | 1 +
357 files changed, 3076 insertions(+), 187 deletions(-)
create mode 100644 release-notes/versioned/client-java-5.0.0-M1.md
create mode 100644 release-notes/versioned/pulsar-5.0.0-M1.md
copy static/openapi/{master => 5.0.0-M1}/openapi.json (100%)
copy static/openapi/{master => 5.0.0-M1}/openapifunctions.json (100%)
copy static/openapi/{master => 5.0.0-M1}/openapilookup.json (100%)
copy static/openapi/{master => 5.0.0-M1}/openapipackages.json (100%)
copy static/openapi/{master => 5.0.0-M1}/openapisink.json (100%)
copy static/openapi/{master => 5.0.0-M1}/openapisource.json (100%)
copy static/openapi/{master => 5.0.0-M1}/openapitransactions.json (100%)
copy static/openapi/{master => 5.0.0-M1/v2}/openapi.json (100%)
copy static/openapi/{master => 5.0.0-M1/v2}/openapilookup.json (100%)
copy static/openapi/{master => 5.0.0-M1/v3}/openapifunctions.json (100%)
copy static/openapi/{master => 5.0.0-M1/v3}/openapipackages.json (100%)
copy static/openapi/{master => 5.0.0-M1/v3}/openapisink.json (100%)
copy static/openapi/{master => 5.0.0-M1/v3}/openapisource.json (100%)
copy static/openapi/{master => 5.0.0-M1/v3}/openapitransactions.json (100%)
copy static/reference/{2.10.x => 5.0.x}/README.md (100%)
copy static/reference/{3.0.x => 5.0.x}/_sidebar.md (96%)
copy static/reference/{2.10.x => 5.0.x}/bookkeeper/README.md (100%)
copy static/reference/{3.0.x => 5.0.x}/bookkeeper/bookkeeper.md (100%)
copy static/reference/{2.10.x => 5.0.x}/cli.md (100%)
copy static/reference/{3.1.x => 5.0.x}/client/README.md (100%)
copy static/reference/{next => 5.0.x}/client/client-configuration-client.md (99%)
copy static/reference/{next => 5.0.x}/client/client-configuration-consumer.md (100%)
copy static/reference/{next => 5.0.x}/client/client-configuration-producer.md (100%)
copy static/reference/{next => 5.0.x}/client/client-configuration-reader.md (100%)
copy static/reference/{3.0.x => 5.0.x}/config/README.md (100%)
copy static/reference/{2.11.x => 5.0.x}/config/reference-configuration-bookkeeper.md (100%)
copy static/reference/{next => 5.0.x}/config/reference-configuration-broker.md (99%)
copy static/reference/{next => 5.0.x}/config/reference-configuration-client.md (99%)
copy static/reference/{2.11.x => 5.0.x}/config/reference-configuration-log4j-shell.md (100%)
copy static/reference/{2.11.x => 5.0.x}/config/reference-configuration-log4j.md (100%)
copy static/reference/{4.2.x => 5.0.x}/config/reference-configuration-pulsar-proxy.md (100%)
copy static/reference/{next => 5.0.x}/config/reference-configuration-standalone.md (99%)
copy static/reference/{4.2.x => 5.0.x}/config/reference-configuration-websocket.md (100%)
copy static/reference/{2.11.x => 5.0.x}/config/reference-configuration-zookeeper.md (100%)
copy static/reference/{3.0.x => 5.0.x}/pulsar-admin/README.md (100%)
copy static/reference/{3.3.x => 5.0.x}/pulsar-admin/bookies.md (100%)
copy static/reference/{3.3.x => 5.0.x}/pulsar-admin/broker-stats.md (100%)
copy static/reference/{3.3.x => 5.0.x}/pulsar-admin/brokers.md (100%)
copy static/reference/{3.3.x => 5.0.x}/pulsar-admin/clusters.md (100%)
copy static/reference/{3.3.x => 5.0.x}/pulsar-admin/functions-worker.md (100%)
copy static/reference/{3.3.x => 5.0.x}/pulsar-admin/functions.md (100%)
copy static/reference/{4.0.x/pulsar-admin/proxy-stats.md => 5.0.x/pulsar-admin/migration.md} (58%)
copy static/reference/{4.2.x => 5.0.x}/pulsar-admin/namespaces.md (100%)
copy static/reference/{3.3.x => 5.0.x}/pulsar-admin/ns-isolation-policy.md (100%)
copy static/reference/{3.3.x => 5.0.x}/pulsar-admin/packages.md (100%)
copy static/reference/{3.3.x => 5.0.x}/pulsar-admin/proxy-stats.md (100%)
copy static/reference/{3.3.x => 5.0.x}/pulsar-admin/resource-quotas.md (100%)
copy static/reference/{3.3.x => 5.0.x}/pulsar-admin/resourcegroups.md (100%)
create mode 100644 static/reference/5.0.x/pulsar-admin/scalable-topics.md
copy static/reference/{4.0.x => 5.0.x}/pulsar-admin/schemas.md (100%)
copy static/reference/{3.3.x => 5.0.x}/pulsar-admin/sinks.md (100%)
copy static/reference/{3.3.x => 5.0.x}/pulsar-admin/sources.md (100%)
copy static/reference/{3.3.x => 5.0.x}/pulsar-admin/tenants.md (100%)
copy static/reference/{4.2.x => 5.0.x}/pulsar-admin/topicPolicies.md (100%)
copy static/reference/{4.1.x => 5.0.x}/pulsar-admin/topics.md (100%)
copy static/reference/{3.3.x => 5.0.x}/pulsar-admin/transactions.md (100%)
copy static/reference/{3.0.x => 5.0.x}/pulsar-client/README.md (100%)
copy static/reference/{next => 5.0.x}/pulsar-client/pulsar-client.md (100%)
copy static/reference/{2.10.x => 5.0.x}/pulsar-daemon/README.md (100%)
copy static/reference/{3.0.x => 5.0.x}/pulsar-daemon/pulsar-daemon.md (100%)
copy static/reference/{3.0.x => 5.0.x}/pulsar-perf/README.md (100%)
copy static/reference/{next => 5.0.x}/pulsar-perf/pulsar-perf.md (100%)
copy static/reference/{2.11.x => 5.0.x}/pulsar-shell/README.md (100%)
copy static/reference/{3.0.x => 5.0.x}/pulsar-shell/pulsar-shell.md (100%)
copy static/reference/{2.10.x => 5.0.x}/pulsar/README.md (100%)
copy static/reference/{3.3.x => 5.0.x}/pulsar/broker-tool.md (100%)
copy static/reference/{3.3.x => 5.0.x}/pulsar/broker.md (100%)
copy static/reference/{4.0.x => 5.0.x}/pulsar/compact-topic.md (100%)
copy static/reference/{3.3.x => 5.0.x}/pulsar/delete-cluster-metadata.md (100%)
copy static/reference/{3.3.x => 5.0.x}/pulsar/functions-worker.md (100%)
copy static/reference/{4.2.x => 5.0.x}/pulsar/initialize-cluster-metadata.md (93%)
copy static/reference/{3.3.x => 5.0.x}/pulsar/initialize-namespace.md (100%)
copy static/reference/{3.3.x => 5.0.x}/pulsar/initialize-transaction-coordinator-metadata.md (100%)
copy static/reference/{3.3.x => 5.0.x}/pulsar/proxy.md (100%)
copy static/reference/{next => 5.0.x}/pulsar/standalone.md (100%)
copy static/reference/{4.0.x => 5.0.x}/pulsar/tokens.md (100%)
copy static/reference/{3.3.x => 5.0.x}/pulsar/version.md (100%)
copy static/reference/{3.3.x => 5.0.x}/pulsar/websocket.md (100%)
copy static/reference/{4.0.x/pulsar-admin/proxy-stats.md => next/pulsar-admin/migration.md} (58%)
create mode 100644 static/reference/next/pulsar-admin/scalable-topics.md
copy {docs => versioned_docs/version-5.0.x}/about.md (100%)
copy {docs => versioned_docs/version-5.0.x}/adaptors-kafka.md (100%)
copy {docs => versioned_docs/version-5.0.x}/adaptors-spark.md (100%)
copy {docs => versioned_docs/version-5.0.x}/adaptors-storm.md (100%)
copy {docs => versioned_docs/version-5.0.x}/admin-api-brokers.md (100%)
copy {docs => versioned_docs/version-5.0.x}/admin-api-clusters.md (100%)
copy {docs => versioned_docs/version-5.0.x}/admin-api-features.md (100%)
copy {docs => versioned_docs/version-5.0.x}/admin-api-functions.md (100%)
copy {docs => versioned_docs/version-5.0.x}/admin-api-namespaces.md (100%)
copy {docs => versioned_docs/version-5.0.x}/admin-api-non-partitioned-topics.md (100%)
copy {docs => versioned_docs/version-5.0.x}/admin-api-non-persistent-topics.md (100%)
copy {docs => versioned_docs/version-5.0.x}/admin-api-overview.md (100%)
copy {docs => versioned_docs/version-5.0.x}/admin-api-packages.md (100%)
copy {docs => versioned_docs/version-5.0.x}/admin-api-partitioned-topics.md (100%)
copy {docs => versioned_docs/version-5.0.x}/admin-api-permissions.md (100%)
copy {docs => versioned_docs/version-5.0.x}/admin-api-persistent-topics.md (100%)
copy {docs => versioned_docs/version-5.0.x}/admin-api-scalable-topics.md (100%)
copy {docs => versioned_docs/version-5.0.x}/admin-api-schemas.md (100%)
copy {docs => versioned_docs/version-5.0.x}/admin-api-tenants.md (100%)
copy {docs => versioned_docs/version-5.0.x}/admin-api-tools.md (100%)
copy {docs => versioned_docs/version-5.0.x}/admin-api-topics.md (100%)
copy {docs => versioned_docs/version-5.0.x}/admin-api-transactions.md (100%)
copy {docs => versioned_docs/version-5.0.x}/admin-api-tutorial.md (100%)
copy {docs => versioned_docs/version-5.0.x}/admin-api-use-cases.md (100%)
copy {docs => versioned_docs/version-5.0.x}/admin-get-started.md (100%)
copy {docs => versioned_docs/version-5.0.x}/administration-anti-affinity-namespaces.md (100%)
copy {docs => versioned_docs/version-5.0.x}/administration-dekaf-ui.md (100%)
copy {docs => versioned_docs/version-5.0.x}/administration-geo.md (100%)
copy {docs => versioned_docs/version-5.0.x}/administration-isolation-bookie.md (100%)
copy {docs => versioned_docs/version-5.0.x}/administration-isolation-broker.md (100%)
copy {docs => versioned_docs/version-5.0.x}/administration-isolation.md (100%)
copy {docs => versioned_docs/version-5.0.x}/administration-load-balance.md (100%)
copy {docs => versioned_docs/version-5.0.x}/administration-metadata-store-migration.md (100%)
copy {docs => versioned_docs/version-5.0.x}/administration-metadata-store.md (100%)
copy {docs => versioned_docs/version-5.0.x}/administration-proxy.md (100%)
copy {docs => versioned_docs/version-5.0.x}/administration-pulsar-manager.md (100%)
copy {docs => versioned_docs/version-5.0.x}/administration-pulsar-shell.md (100%)
copy {docs => versioned_docs/version-5.0.x}/administration-stats.md (100%)
copy {docs => versioned_docs/version-5.0.x}/administration-upgrade.md (100%)
copy {docs => versioned_docs/version-5.0.x}/administration-zk-bk.md (100%)
copy {docs => versioned_docs/version-5.0.x}/bookkeeper-metadata-serviceuri.md (100%)
copy {docs => versioned_docs/version-5.0.x}/concepts-architecture-overview.md (100%)
copy {docs => versioned_docs/version-5.0.x}/concepts-authentication.md (100%)
copy {docs => versioned_docs/version-5.0.x}/concepts-broker-load-balancing-benefits.md (100%)
copy {docs => versioned_docs/version-5.0.x}/concepts-broker-load-balancing-concepts.md (100%)
copy {docs => versioned_docs/version-5.0.x}/concepts-broker-load-balancing-features.md (100%)
copy {docs => versioned_docs/version-5.0.x}/concepts-broker-load-balancing-migration.md (100%)
copy {docs => versioned_docs/version-5.0.x}/concepts-broker-load-balancing-overview.md (100%)
copy {docs => versioned_docs/version-5.0.x}/concepts-broker-load-balancing-quick-start.md (100%)
copy {docs => versioned_docs/version-5.0.x}/concepts-broker-load-balancing-types.md (100%)
copy {docs => versioned_docs/version-5.0.x}/concepts-broker-load-balancing-use-cases.md (100%)
copy {docs => versioned_docs/version-5.0.x}/concepts-clients.md (100%)
copy {docs => versioned_docs/version-5.0.x}/concepts-cluster-level-failover.md (100%)
copy {docs => versioned_docs/version-5.0.x}/concepts-messaging.md (100%)
copy {docs => versioned_docs/version-5.0.x}/concepts-multi-tenancy.md (100%)
copy {docs => versioned_docs/version-5.0.x}/concepts-multiple-advertised-listeners.md (100%)
copy {docs => versioned_docs/version-5.0.x}/concepts-overview.md (100%)
copy {docs => versioned_docs/version-5.0.x}/concepts-proxy-sni-routing.md (100%)
copy {docs => versioned_docs/version-5.0.x}/concepts-replication.md (100%)
copy {docs => versioned_docs/version-5.0.x}/concepts-scalable-topics.md (100%)
copy {docs => versioned_docs/version-5.0.x}/concepts-throttling.md (100%)
copy {docs => versioned_docs/version-5.0.x}/concepts-tiered-storage.md (100%)
copy {docs => versioned_docs/version-5.0.x}/concepts-topic-compaction.md (100%)
copy {docs => versioned_docs/version-5.0.x}/concepts-transactions.md (100%)
copy {docs => versioned_docs/version-5.0.x}/cookbooks-bookkeepermetadata.md (100%)
copy {docs => versioned_docs/version-5.0.x}/cookbooks-compaction.md (100%)
copy {docs => versioned_docs/version-5.0.x}/cookbooks-deduplication.md (100%)
copy {docs => versioned_docs/version-5.0.x}/cookbooks-encryption.md (100%)
copy {docs => versioned_docs/version-5.0.x}/cookbooks-message-queue.md (100%)
copy {docs => versioned_docs/version-5.0.x}/cookbooks-non-persistent.md (100%)
copy {docs => versioned_docs/version-5.0.x}/cookbooks-partitioned.md (100%)
copy {docs => versioned_docs/version-5.0.x}/cookbooks-retention-expiry.md (100%)
copy {docs => versioned_docs/version-5.0.x}/cookbooks-tiered-storage.md (100%)
copy {docs => versioned_docs/version-5.0.x}/deploy-aws.md (100%)
copy {docs => versioned_docs/version-5.0.x}/deploy-bare-metal-multi-cluster.md (100%)
copy {docs => versioned_docs/version-5.0.x}/deploy-bare-metal.md (100%)
copy {docs => versioned_docs/version-5.0.x}/deploy-docker.md (100%)
copy {docs => versioned_docs/version-5.0.x}/deploy-ibm.md (100%)
copy {docs => versioned_docs/version-5.0.x}/deploy-kubernetes.md (100%)
copy {docs => versioned_docs/version-5.0.x}/deploy-monitoring.md (100%)
copy {docs => versioned_docs/version-5.0.x}/develop-load-manager.md (100%)
copy {docs => versioned_docs/version-5.0.x}/develop-plugin.md (100%)
copy {docs => versioned_docs/version-5.0.x}/develop-tools.md (100%)
copy {docs => versioned_docs/version-5.0.x}/developers-landing.md (100%)
copy {docs => versioned_docs/version-5.0.x}/developing-binary-protocol.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-cli.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-concepts.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-debug-cli.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-debug-localrun.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-debug-log-topic.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-debug-stderr.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-debug-unit-test.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-debug.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-deploy-arguments.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-deploy-cluster-builtin.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-deploy-cluster-encryption.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-deploy-cluster-package.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-deploy-cluster-parallelism.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-deploy-cluster-resource.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-deploy-cluster.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-deploy-localrun.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-deploy-trigger.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-deploy.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-develop-admin-api.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-develop-api.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-develop-log.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-develop-metrics.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-develop-schema-registry.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-develop-security.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-develop-serde.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-develop-state.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-develop-tutorial.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-develop-user-defined-configs.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-develop.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-overview.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-package-go.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-package-java.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-package-python.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-package.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-quickstart.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-runtime-java-options.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-runtime-kubernetes.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-runtime-process.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-runtime-thread.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-runtime.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-worker-corun.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-worker-for-geo-replication.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-worker-run-separately.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-worker-stateful.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-worker-temp-file-path.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-worker-troubleshooting.md (100%)
copy {docs => versioned_docs/version-5.0.x}/functions-worker.md (100%)
copy {docs => versioned_docs/version-5.0.x}/get-started-pulsar-admin.md (100%)
copy {docs => versioned_docs/version-5.0.x}/getting-started-docker-compose.md (100%)
copy {docs => versioned_docs/version-5.0.x}/getting-started-docker.md (100%)
copy {docs => versioned_docs/version-5.0.x}/getting-started-helm.md (100%)
copy {docs => versioned_docs/version-5.0.x}/getting-started-home.md (100%)
copy {docs => versioned_docs/version-5.0.x}/getting-started-standalone.md (100%)
copy {docs => versioned_docs/version-5.0.x}/helm-deploy.md (100%)
copy {docs => versioned_docs/version-5.0.x}/helm-install.md (100%)
copy {docs => versioned_docs/version-5.0.x}/helm-overview.md (100%)
copy {docs => versioned_docs/version-5.0.x}/helm-prepare.md (100%)
copy {docs => versioned_docs/version-5.0.x}/helm-tools.md (100%)
copy {docs => versioned_docs/version-5.0.x}/helm-upgrade.md (100%)
copy {docs => versioned_docs/version-5.0.x}/how-to-landing.md (100%)
copy {docs => versioned_docs/version-5.0.x}/install-deploy-upgrade-landing.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-aerospike-sink.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-aerospike.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-alluxio.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-azuredataexplorer-sink.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-canal-source.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-cassandra-sink.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-cassandra.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-cdc-canal.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-cdc-debezium.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-cdc.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-cli.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-connectors.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-debezium-source.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-debug.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-develop.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-dynamodb-source.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-dynamodb.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-elasticsearch-sink.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-elasticsearch.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-file-source.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-file.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-hbase-sink.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-hbase.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-hdfs.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-hdfs2-sink.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-hdfs3-sink.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-http-sink.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-influxdb-sink.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-influxdb.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-jdbc-sink.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-jdbc.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-kafka-sink.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-kafka-source.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-kafka.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-kinesis-sink.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-kinesis-source.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-kinesis.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-mongo-sink.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-mongo-source.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-mongo.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-netty-source.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-netty.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-nsq-source.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-nsq.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-overview.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-quickstart.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-rabbitmq-sink.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-rabbitmq-source.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-rabbitmq.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-redis-sink.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-redis.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-solr-sink.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-solr.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-tcp.md (100%)
copy {docs => versioned_docs/version-5.0.x}/io-use.md (100%)
copy {docs => versioned_docs/version-5.0.x}/kubernetes-helm.md (100%)
copy {docs => versioned_docs/version-5.0.x}/performance-pulsar-perf.md (100%)
copy {docs => versioned_docs/version-5.0.x}/pulsar-api-overview.md (100%)
copy {docs => versioned_docs/version-5.0.x}/reference-cli-tools.md (100%)
copy {docs => versioned_docs/version-5.0.x}/reference-configuration.md (100%)
copy {docs => versioned_docs/version-5.0.x}/reference-connector-admin.md (100%)
copy {docs => versioned_docs/version-5.0.x}/reference-landing.md (100%)
copy {docs => versioned_docs/version-5.0.x}/reference-metrics-opentelemetry.md (100%)
copy {docs => versioned_docs/version-5.0.x}/reference-metrics.md (100%)
copy {docs => versioned_docs/version-5.0.x}/reference-pulsar-admin.md (100%)
copy {docs => versioned_docs/version-5.0.x}/reference-rest-api-overview.md (100%)
copy {docs => versioned_docs/version-5.0.x}/reference-terminology.md (100%)
copy {docs => versioned_docs/version-5.0.x}/schema-evolution-compatibility.md (100%)
copy {docs => versioned_docs/version-5.0.x}/schema-get-started.md (100%)
copy {docs => versioned_docs/version-5.0.x}/schema-manage.md (100%)
copy {docs => versioned_docs/version-5.0.x}/schema-overview.md (100%)
copy {docs => versioned_docs/version-5.0.x}/schema-understand.md (100%)
copy {docs => versioned_docs/version-5.0.x}/security-athenz.md (100%)
copy {docs => versioned_docs/version-5.0.x}/security-authorization.md (100%)
copy {docs => versioned_docs/version-5.0.x}/security-basic-auth.md (100%)
copy {docs => versioned_docs/version-5.0.x}/security-bouncy-castle.md (100%)
copy {docs => versioned_docs/version-5.0.x}/security-encryption.md (100%)
copy {docs => versioned_docs/version-5.0.x}/security-extending.md (100%)
copy {docs => versioned_docs/version-5.0.x}/security-jwt.md (100%)
copy {docs => versioned_docs/version-5.0.x}/security-kerberos.md (100%)
copy {docs => versioned_docs/version-5.0.x}/security-oauth2.md (100%)
copy {docs => versioned_docs/version-5.0.x}/security-openid-connect.md (100%)
copy {docs => versioned_docs/version-5.0.x}/security-overview.md (100%)
copy {docs => versioned_docs/version-5.0.x}/security-tls-authentication.md (100%)
copy {docs => versioned_docs/version-5.0.x}/security-tls-transport.md (100%)
copy {docs => versioned_docs/version-5.0.x}/security-token-admin.md (100%)
copy {docs => versioned_docs/version-5.0.x}/standalone-docker.md (100%)
copy {docs => versioned_docs/version-5.0.x}/standalone.md (100%)
copy {docs => versioned_docs/version-5.0.x}/tiered-storage-aliyun.md (100%)
copy {docs => versioned_docs/version-5.0.x}/tiered-storage-aws.md (100%)
copy {docs => versioned_docs/version-5.0.x}/tiered-storage-azure.md (100%)
copy {docs => versioned_docs/version-5.0.x}/tiered-storage-filesystem.md (100%)
copy {docs => versioned_docs/version-5.0.x}/tiered-storage-gcs.md (100%)
copy {docs => versioned_docs/version-5.0.x}/tiered-storage-overview.md (100%)
copy {docs => versioned_docs/version-5.0.x}/tiered-storage-s3.md (100%)
copy {docs => versioned_docs/version-5.0.x}/transaction-api.md (100%)
copy {docs => versioned_docs/version-5.0.x}/transaction-guarantee.md (100%)
copy {docs => versioned_docs/version-5.0.x}/tutorials-namespace.md (100%)
copy {docs => versioned_docs/version-5.0.x}/tutorials-produce-consume.md (100%)
copy {docs => versioned_docs/version-5.0.x}/tutorials-tenant.md (100%)
copy {docs => versioned_docs/version-5.0.x}/tutorials-topic.md (100%)
copy {docs => versioned_docs/version-5.0.x}/txn-advanced-features.md (100%)
copy {docs => versioned_docs/version-5.0.x}/txn-how.md (100%)
copy {docs => versioned_docs/version-5.0.x}/txn-monitor.md (100%)
copy {docs => versioned_docs/version-5.0.x}/txn-use.md (100%)
copy {docs => versioned_docs/version-5.0.x}/txn-what.md (100%)
copy {docs => versioned_docs/version-5.0.x}/txn-why.md (100%)
copy {docs => versioned_docs/version-5.0.x}/window-functions-context.md (100%)
copy sidebars.json => versioned_sidebars/version-5.0.x-sidebars.json (100%)
(pulsar-site) 12/16: Fix link
Posted by lh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
lhotari pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/pulsar-site.git
commit c93844b3cbf4353927cb0d653d763f47f93144d8
Author: Lari Hotari <lh...@users.noreply.github.com>
AuthorDate: Tue Jun 23 23:56:17 2026 +0300
Fix link
---
src/pages/download.mdx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/pages/download.mdx b/src/pages/download.mdx
index 6181b541d32..ef3e00e3904 100644
--- a/src/pages/download.mdx
+++ b/src/pages/download.mdx
@@ -45,7 +45,7 @@ Pulsar is also available as a container image:
The container image can be used with Docker or Kubernetes:
-- [Run a standalone Pulsar cluster in Docker 📘](https://pulsar.apache.org/docs/next/getting-started-docker/)
+- [Run a standalone Pulsar cluster in Docker 📘](https://pulsar.apache.org/docs/getting-started-docker/)
- [Apache Pulsar Helm Chart](https://github.com/apache/pulsar-helm-chart/)
<CurrentPulsarDownloads/>
(pulsar-site) 08/16: Add 5.0.x to DocsVersionDropdownNavbarItem.js
Posted by lh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
lhotari pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/pulsar-site.git
commit 01ddfe8c829a2b79dc36cc843e01b25ac0f345a0
Author: Lari Hotari <lh...@users.noreply.github.com>
AuthorDate: Tue Jun 23 21:42:33 2026 +0300
Add 5.0.x to DocsVersionDropdownNavbarItem.js
---
src/theme/DocsVersionDropdownNavbarItem.js | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/src/theme/DocsVersionDropdownNavbarItem.js b/src/theme/DocsVersionDropdownNavbarItem.js
index 8ef2a24497b..e0f61b3cccf 100644
--- a/src/theme/DocsVersionDropdownNavbarItem.js
+++ b/src/theme/DocsVersionDropdownNavbarItem.js
@@ -17,6 +17,11 @@ const versions = [
label: "Next",
path: "/docs/next"
},
+ {
+ label: '5.0.x',
+ name: '5.0.x',
+ path: `/docs/5.0.x`,
+ },
{
label: '4.2.x',
name: '4.2.x',
(pulsar-site) 10/16: Add release notes for 5.0.0-M1
Posted by lh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
lhotari pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/pulsar-site.git
commit 1c4d81762c5c273b39582abc9072ca95be81c052
Author: Lari Hotari <lh...@users.noreply.github.com>
AuthorDate: Tue Jun 23 22:43:13 2026 +0300
Add release notes for 5.0.0-M1
---
data/release-java.js | 7 +
data/release-pulsar.js | 9 +
release-notes/versioned/client-java-5.0.0-M1.md | 40 +++
release-notes/versioned/pulsar-5.0.0-M1.md | 427 ++++++++++++++++++++++++
releases.json | 1 +
5 files changed, 484 insertions(+)
diff --git a/data/release-java.js b/data/release-java.js
index 02bfb58f738..de8b50d6c58 100644
--- a/data/release-java.js
+++ b/data/release-java.js
@@ -1,4 +1,11 @@
module.exports = [
+ {
+ "tagName": "v5.0.0-M1",
+ "vtag": "5.0.x",
+ "releaseNotes": "/release-notes/versioned/client-java-5.0.0-M1/",
+ "doc": "/docs/5.0.x/client-libraries-java",
+ "version": "v5.0.x"
+ },
{
"tagName": "v4.2.2",
"vtag": "4.2.x",
diff --git a/data/release-pulsar.js b/data/release-pulsar.js
index 8d38677adc5..a9e63c9f621 100644
--- a/data/release-pulsar.js
+++ b/data/release-pulsar.js
@@ -1,4 +1,13 @@
module.exports = [
+ {
+ "author": "lhotari",
+ "tagName": "v5.0.0-M1",
+ "publishedAt": "2026-06-23T14:11:26Z",
+ "vtag": "5.0.x",
+ "releaseNotes": "/release-notes/versioned/pulsar-5.0.0-M1/",
+ "doc": "/docs/5.0.x",
+ "version": "v5.0.x"
+ },
{
"author": "lhotari",
"tagName": "v4.2.2",
diff --git a/release-notes/versioned/client-java-5.0.0-M1.md b/release-notes/versioned/client-java-5.0.0-M1.md
new file mode 100644
index 00000000000..12b46fed1ed
--- /dev/null
+++ b/release-notes/versioned/client-java-5.0.0-M1.md
@@ -0,0 +1,40 @@
+---
+id: client-java-5.0.0-M1
+title: Client Java 5.0.0-M1
+sidebar_label: Client Java 5.0.0-M1
+---
+
+- [feat] PIP-466: Add V5 client API for scalable topics ([#25489](https://github.com/apache/pulsar/pull/25489))
+- [feat][client] Embed GraalVM native image config ([#25883](https://github.com/apache/pulsar/pull/25883))
+- [feat][client] PIP-475: V5 SDK consumes synthetic layouts for regular topics ([#25850](https://github.com/apache/pulsar/pull/25850))
+- [feat][client] PIP-468: V5 producer/consumer knob coverage + related client fixes ([#25588](https://github.com/apache/pulsar/pull/25588))
+- [fix][client] Apply Avro logical type conversions when decoding schema without classloader ([#25759](https://github.com/apache/pulsar/pull/25759))
+- [fix][client] Avoid closing reused ServiceUrlProvider in another PulsarClientImpl instance ([#25947](https://github.com/apache/pulsar/pull/25947))
+- [fix][client] Clean up unacked messages when unsubscribing a topic with ack timeout backoff ([#25916](https://github.com/apache/pulsar/pull/25916))
+- [fix][client] Fix exclusive V5 scalable topic producer initial segment claim race condition ([#25778](https://github.com/apache/pulsar/pull/25778))
+- [fix][client] Fix failed to close consumer because of the error: param memorySize is a negative value ([#25805](https://github.com/apache/pulsar/pull/25805))
+- [fix][client] Fix idle connection release ignoring V5 watch sessions ([#25697](https://github.com/apache/pulsar/pull/25697))
+- [fix][client] Fix OpenTelemetryProducerInterceptor not executing due to eligible check ([#25585](https://github.com/apache/pulsar/pull/25585))
+- [fix][client] Fix thread-safety and refactor MessageCryptoBc key management ([#25400](https://github.com/apache/pulsar/pull/25400))
+- [fix][client] Inject trace context into message properties for producer-consumer span correlation ([#25749](https://github.com/apache/pulsar/pull/25749))
+- [fix][client] Make ClientBuilder serializable ([#25730](https://github.com/apache/pulsar/pull/25730))
+- [fix][client] Match logical topic when removing unacked messages ([#25921](https://github.com/apache/pulsar/pull/25921))
+- [fix][client] PIP-468: V5 CheckpointConsumer consumer-group support ([#25622](https://github.com/apache/pulsar/pull/25622))
+- [fix][client] PIP-468: V5 client validates serviceUrl scheme ([#25720](https://github.com/apache/pulsar/pull/25720))
+- [fix][client] PIP-468: Wire V5 StreamConsumer to broker SubscriptionCoordinator ([#25612](https://github.com/apache/pulsar/pull/25612))
+- [fix][client] PIP-475: make async producer survive regular-to-scalable migration ([#25882](https://github.com/apache/pulsar/pull/25882))
+- [fix][client] Preserve equals in FieldParser map values ([#25907](https://github.com/apache/pulsar/pull/25907))
+- [fix][client] Prevent duplicate ServiceUrlProvider initialization ([#25899](https://github.com/apache/pulsar/pull/25899))
+- [fix][client] Reset higher-index states on recovery in SameAuthParamsLookupAutoClusterFailover ([#25826](https://github.com/apache/pulsar/pull/25826))
+- [fix][client] Stabilize scaleReceiverQueueHint against concurrent enqueue/take ([#25578](https://github.com/apache/pulsar/pull/25578))
+- [fix][client] Broker-side producer handle leak if closes a producer which state is regitering schema ([#25725](https://github.com/apache/pulsar/pull/25725))
+- [improve][client] Add SOCKS5 proxy support for PulsarAdmin and for PulsarClient HTTP lookups ([#25575](https://github.com/apache/pulsar/pull/25575))
+- [improve][client] Best-effort retry for individual/batch-index acks on send failure when ackReceiptEnabled=false ([#25525](https://github.com/apache/pulsar/pull/25525))
+- [improve][client] Clean up unacked message tracker when topics are removed in multi-topic consumers ([#25923](https://github.com/apache/pulsar/pull/25923))
+- [improve][client] Implement tls_client_auth for AuthenticationOAuth2 ([#25538](https://github.com/apache/pulsar/pull/25538))
+- [improve][client] In cases where there is a risk of message loss, adjust the log level to error ([#25854](https://github.com/apache/pulsar/pull/25854))
+- [improve][client] PIP-234: Support sharing the memory limit controller across multiple isolated Pulsar client instances ([#25477](https://github.com/apache/pulsar/pull/25477))
+- [improve][client] PIP-468: Make Backoff jitter configurable ([#25669](https://github.com/apache/pulsar/pull/25669))
+- [improve][client] PIP-468: Rename V5 ackTimeout to processingTimeout(ProcessingTimeoutPolicy) ([#25649](https://github.com/apache/pulsar/pull/25649))
+- [cleanup][client] Remove unused RetryUtil class ([#25934](https://github.com/apache/pulsar/pull/25934))
+- [fix] Client-v5: Retry producer send on AlreadyClosed across segment seal ([#25610](https://github.com/apache/pulsar/pull/25610))
diff --git a/release-notes/versioned/pulsar-5.0.0-M1.md b/release-notes/versioned/pulsar-5.0.0-M1.md
new file mode 100644
index 00000000000..5ae12aacb93
--- /dev/null
+++ b/release-notes/versioned/pulsar-5.0.0-M1.md
@@ -0,0 +1,427 @@
+---
+id: pulsar-5.0.0-M1
+title: Apache Pulsar 5.0.0-M1
+sidebar_label: Apache Pulsar 5.0.0-M1
+---
+
+#### 2026-06-23
+
+### Approved PIPs
+
+- [PIP-460: Scalable Topics (Topics v5)](https://github.com/apache/pulsar/blob/master/pip/pip-460.md)
+ - [PIP-466: New Java Client API (V5) with Scalable Topic Support](https://github.com/apache/pulsar/blob/master/pip/pip-466.md)
+ - [PIP-468: Scalable Topic Controller](https://github.com/apache/pulsar/blob/master/pip/pip-468.md)
+ - [PIP-473: Metadata-Driven Transactions for Scalable Topics](https://github.com/apache/pulsar/blob/master/pip/pip-473.md)
+ - [PIP-475: Regular-to-Scalable Topic Migration](https://github.com/apache/pulsar/blob/master/pip/pip-475.md)
+ - [PIP-483: Scalable Topic Auto Split/Merge](https://github.com/apache/pulsar/blob/master/pip/pip-483.md)
+- [PIP-463: Migrate Build System from Maven to Gradle](https://github.com/apache/pulsar/blob/master/pip/pip-463.md)
+- [PIP-465: Split IO Connectors into Separate Repository](https://github.com/apache/pulsar/blob/master/pip/pip-465.md)
+- [PIP-467: Adopt slog for structured logging across Pulsar](https://github.com/apache/pulsar/blob/master/pip/pip-467.md)
+- [PIP-469: Legacy-aware topic policies backend routing and metadata-store topic policies](https://github.com/apache/pulsar/blob/master/pip/pip-469.md)
+- [PIP-472: Migrate from javax.* to jakarta.* APIs](https://github.com/apache/pulsar/blob/master/pip/pip-472.md)
+
+### Library updates
+
+- [feat] Upgrade BookKeeper dependency to 4.18.0 ([#25886](https://github.com/apache/pulsar/pull/25886))
+- [fix][sec] Bump com.github.tomakehurst:wiremock-jre8-standalone from 2.33.2 to 2.35.1 ([#25789](https://github.com/apache/pulsar/pull/25789))
+- [fix][sec] Upgrade BouncyCastle to 1.84 (CVE-2026-5588, CVE-2026-0636) ([#25569](https://github.com/apache/pulsar/pull/25569))
+- [fix][sec] Upgrade commons-configuration2 to 2.15.0 to address CVE-2026-45205 ([#25844](https://github.com/apache/pulsar/pull/25844))
+- [fix][sec] Upgrade Jetty to address CVE-2026-2332 ([#25527](https://github.com/apache/pulsar/pull/25527))
+- [fix][sec] Upgrade Jetty to address CVE-2026-5795 ([#25532](https://github.com/apache/pulsar/pull/25532))
+- [fix] Upgrade Jetty to 12.1.6 to fix CVE-2026-1605 ([#25485](https://github.com/apache/pulsar/pull/25485))
+- [improve][misc] Upgrade Jetty to 12.1.9 ([#25752](https://github.com/apache/pulsar/pull/25752))
+- [improve][misc] Upgrade Jetty to 12.1.10 ([#25943](https://github.com/apache/pulsar/pull/25943))
+- [fix][sec] Upgrade log4j to 2.25.4 to address CVE-2026-34477, CVE-2026-34478, CVE-2026-34480, CVE-2026-34481 ([#25521](https://github.com/apache/pulsar/pull/25521))
+- [improve][misc] Upgrade log4j to 2.26.0 and slf4j to 2.0.18 ([#25973](https://github.com/apache/pulsar/pull/25973))
+- [fix][sec] Upgrade to Netty 4.1.132.Final to address CVEs ([#25399](https://github.com/apache/pulsar/pull/25399))
+- [fix][sec] Upgrade Netty to 4.1.133.Final to address CVEs ([#25670](https://github.com/apache/pulsar/pull/25670))
+- [improve][misc] Upgrade Netty to 4.1.134 ([#25870](https://github.com/apache/pulsar/pull/25870))
+- [fix][sec] Upgrade Netty to 4.1.135.Final to address several CVEs ([#25918](https://github.com/apache/pulsar/pull/25918))
+- [fix][sec] Upgrade thrift to 0.23.0 to address CVE-2026-43869 ([#25744](https://github.com/apache/pulsar/pull/25744))
+- [fix][sec] Upgrade to async-http-client 2.14.5 to address CVE-2026-40490 ([#25546](https://github.com/apache/pulsar/pull/25546))
+- [fix][sec] Upgrade vert.x to 4.5.25 to address CVE-2026-6860 ([#25737](https://github.com/apache/pulsar/pull/25737))
+- [fix][sec] Upgrade vertx to 4.5.27 to address CVE-2026-6860 ([#25745](https://github.com/apache/pulsar/pull/25745))
+- [improve][misc] Upgrade vert.x to 4.5.28 ([#25924](https://github.com/apache/pulsar/pull/25924))
+- [improve][all] Upgraded Jackson to 2.21 LTS and fixed a few gradle assemble warnings ([#25504](https://github.com/apache/pulsar/pull/25504))
+- [improve][misc] Upgrade Jackson to 2.21.3 ([#25664](https://github.com/apache/pulsar/pull/25664))
+- [improve][build] Remove kotlin-stdlib override; upgrade okhttp3 5.3.2 and okio 3.17.0 ([#25855](https://github.com/apache/pulsar/pull/25855))
+- [fix][sec] Bump org.asynchttpclient:async-http-client from 2.14.5 to 2.15.0 ([#25818](https://github.com/apache/pulsar/pull/25818))
+- [improve][build] Upgrade async-http-client to 3.0.10 ([#25023](https://github.com/apache/pulsar/pull/25023))
+- [improve][build] Upgrade Athenz to 1.12.42 ([#25905](https://github.com/apache/pulsar/pull/25905))
+- [improve][build] Upgrade kubernetes client-java to 26.0.0 ([#25856](https://github.com/apache/pulsar/pull/25856))
+- [improve][monitor] Upgrade OpenTelemetry libraries ([#25662](https://github.com/apache/pulsar/pull/25662))
+- [improve][build] Upgrade OpenTelemetry to latest (java 1.62.0, instrumentation 2.28.1, semconv 1.41.1) ([#25906](https://github.com/apache/pulsar/pull/25906))
+- [improve][build] Upgrade org.apache.kerby:kerb-simplekdc from 1.1.1 to 2.1.1 ([#25785](https://github.com/apache/pulsar/pull/25785))
+- [improve][build] Upgrade SnakeYAML to 2.6 ([#26023](https://github.com/apache/pulsar/pull/26023))
+- [improve][meta] Upgrade Oxia client to 0.8.0 ([#25962](https://github.com/apache/pulsar/pull/25962))
+- [improve][misc] Upgrade Apache Commons libraries and Apache Http components ([#25963](https://github.com/apache/pulsar/pull/25963))
+- [improve][misc] Upgrade Caffeine to 3.2.4 ([#25663](https://github.com/apache/pulsar/pull/25663))
+- [improve][misc] Upgrade Guava to 33.6.0 ([#25970](https://github.com/apache/pulsar/pull/25970))
+- [improve][misc] Upgrade jctools to 4.0.6 (jctools-core-jdk11) ([#25671](https://github.com/apache/pulsar/pull/25671))
+- [improve][misc] Upgrade lz4-java to 1.11.0 ([#25971](https://github.com/apache/pulsar/pull/25971))
+- [improve][offload] Upgrade Hadoop from 3.4.3 to 3.5.0 ([#25402](https://github.com/apache/pulsar/pull/25402))
+- [improve][sec] Upgrade Auth0 java-jwt to 4.5.2 and jwks-rsa to 0.23.1 ([#25672](https://github.com/apache/pulsar/pull/25672))
+
+### Broker
+
+- [fix][broker] Avoid per-message metadata parse for disabled debug log in handleSend ([#25986](https://github.com/apache/pulsar/pull/25986))
+- [fix][broker] Avoid Project access in broker test setup ([#25529](https://github.com/apache/pulsar/pull/25529))
+- [fix][broker] Change the schema incompatible log from ERROR to WARN level ([#25483](https://github.com/apache/pulsar/pull/25483))
+- [fix][broker] Clean up orphan ledger on concurrent initial schema creation in BookkeeperSchemaStorage ([#25514](https://github.com/apache/pulsar/pull/25514))
+- [fix][broker] Close pending acks cleanup gap in BacklogQuotaManager ([#25624](https://github.com/apache/pulsar/pull/25624))
+- [fix][broker] ConcurrentLongHashMap throw ArrayIndexOutOfBoundsException ([#25644](https://github.com/apache/pulsar/pull/25644))
+- [fix][broker] Correct two race conditions in the tracker code and logic bug in InMemoryDelayedDeliveryTracker that failed with NoSuchElementException ([#25681](https://github.com/apache/pulsar/pull/25681))
+- [fix][broker] Decrement unacked counter when removeAllUpTo removes pending acks ([#25581](https://github.com/apache/pulsar/pull/25581))
+- [fix][broker] Defer ack state updates until persistence succeeds ([#25528](https://github.com/apache/pulsar/pull/25528))
+- [fix][broker] Fail fast for load balancer misconfigurations instead of falling back to SimpleLoadManagerImpl ([#26031](https://github.com/apache/pulsar/pull/26031))
+- [fix][broker] Fix backlog clearing for unloaded namespace bundles ([#25272](https://github.com/apache/pulsar/pull/25272))
+- [fix][broker] Fix compacted read could be stuck forever or message loss due to cursor mark delete ([#25998](https://github.com/apache/pulsar/pull/25998))
+- [fix][broker] Fix compaction cursor reset may lose mark-delete properties ([#25862](https://github.com/apache/pulsar/pull/25862))
+- [fix][broker] Fix delayed messages stalling with isDelayedDeliveryDeliverAtTimeStrict=true ([#26012](https://github.com/apache/pulsar/pull/26012))
+- [fix][broker] Fix forced topic/namespace deletion hanging or failing when compaction is in progress ([#26016](https://github.com/apache/pulsar/pull/26016))
+- [fix][broker] Fix ManagedLedgerImpl.advanceCursorsIfNecessary() method may lose non-durable cursor properties in race condition ([#25796](https://github.com/apache/pulsar/pull/25796))
+- [fix][broker] Fix metadata setup validation message ([#25656](https://github.com/apache/pulsar/pull/25656))
+- [fix][broker] Fix non-batched null-value messages not removed during topic compaction ([#25817](https://github.com/apache/pulsar/pull/25817))
+- [fix][broker] Fix PersistentMessageExpiryMonitor findEntryComplete() method may lose mark-delete properties in race condition ([#25803](https://github.com/apache/pulsar/pull/25803))
+- [fix][broker] Fix precision loss in DataSketchesSummaryLogger by replacing LongAdder with DoubleAdder for sum accumulation ([#25594](https://github.com/apache/pulsar/pull/25594))
+- [fix][broker] Fix PulsarService.closeAsync where Condition.signalAll was called without holding a lock ([#25777](https://github.com/apache/pulsar/pull/25777))
+- [fix][broker] Fix race in pending acks removal in redeliverUnacknowledgedMessages ([#25589](https://github.com/apache/pulsar/pull/25589))
+- [fix][broker] Fix stuck chunks in SharedConsumerAssignor permit tracking ([#25620](https://github.com/apache/pulsar/pull/25620))
+- [fix][broker] Fix tableview divergence in ServiceUnitStateTableViewSyncer causing flaky tests ([#25946](https://github.com/apache/pulsar/pull/25946))
+- [fix][broker] Lower log level of DrainingHashesTracker not-found entry to DEBUG ([#25558](https://github.com/apache/pulsar/pull/25558))
+- [fix][broker] Merge broker offload extra configurations ([#25736](https://github.com/apache/pulsar/pull/25736))
+- [fix][broker] Move pending acks cleanup to selected mark-delete callbacks ([#25592](https://github.com/apache/pulsar/pull/25592))
+- [fix][broker] PIP-460: Authorize scalable topic binary commands ([#25635](https://github.com/apache/pulsar/pull/25635))
+- [fix][broker] PIP-468: Fix listener leak in DagWatchSession ([#25650](https://github.com/apache/pulsar/pull/25650))
+- [fix][broker] PIP-468: skip deleted segments in checkpoint consumer ([#25719](https://github.com/apache/pulsar/pull/25719))
+- [fix][broker] PIP-468: StreamConsumer / CheckpointConsumer DAG-replay with parent-drain ordering ([#25642](https://github.com/apache/pulsar/pull/25642))
+- [fix][broker] Prevent dedup recovery race from allowing duplicate messages ([#25953](https://github.com/apache/pulsar/pull/25953))
+- [fix][broker] Prevent subscribe rate limit from stalling compaction and blocking forced deletion ([#26015](https://github.com/apache/pulsar/pull/26015))
+- [fix][broker] Prevent timed-out producer creation from racing with retry ([#25460](https://github.com/apache/pulsar/pull/25460))
+- [fix][broker] pulsar admin stats internal with metadata command ([#25557](https://github.com/apache/pulsar/pull/25557))
+- [fix][broker] Race condition causes perpetual backlog on internal topics ([#25572](https://github.com/apache/pulsar/pull/25572))
+- [fix][broker] Replace Java serialization with JSON in package metadata ([#25570](https://github.com/apache/pulsar/pull/25570))
+- [fix][broker] Revert "[improve][broker] Enhance advertised address resolution with fallback to localhost (#25238)" ([#25523](https://github.com/apache/pulsar/pull/25523))
+- [fix][broker] Skip backlog-quota eviction on fenced/closing topics ([#25684](https://github.com/apache/pulsar/pull/25684))
+- [fix][broker] Unthrottle producers immediately when publish rate limiting is disabled ([#25502](https://github.com/apache/pulsar/pull/25502))
+- [fix][broker] URL-encode sub-name in Txn pending-ack topic ([#25727](https://github.com/apache/pulsar/pull/25727))
+- [fix][broker] Use effective offload policies for extra configs ([#25781](https://github.com/apache/pulsar/pull/25781))
+- [fix][broker] Wait for orphan schema ledger cleanup before retry ([#25579](https://github.com/apache/pulsar/pull/25579))
+- [fix][broker] Replication stats is empty when the cluster is the target cluster of a one-way replication ([#25583](https://github.com/apache/pulsar/pull/25583))
+- [fix][broker] Namespaces can be created with may empty replication_clusters policy ([#25551](https://github.com/apache/pulsar/pull/25551))
+- [fix][broker] Producer with AUTO_PRODUCE schema failed to reconnect, which caused by schema incompatible ([#25437](https://github.com/apache/pulsar/pull/25437))
+- [fix][broker] Replication is stuck because failed to read entries ([#25625](https://github.com/apache/pulsar/pull/25625))
+- [fix][broker] Fix ShadowReplicator source entry buffer leak ([#25732](https://github.com/apache/pulsar/pull/25732))
+- [fix][admin] Refactor namespace migration operation to async in rest api ([#25478](https://github.com/apache/pulsar/pull/25478))
+- [fix][ml] Fix concurrent cursor properties update race ([#25434](https://github.com/apache/pulsar/pull/25434))
+- [fix][ml] Fix eviction trigger race that cleared the in-progress marker ([#25988](https://github.com/apache/pulsar/pull/25988))
+- [fix][ml] Reset messageMetadataInitialized when recycling RangeCacheEntryWrapper ([#25987](https://github.com/apache/pulsar/pull/25987))
+- [fix][bk] Fix NPE in IsolatedBookieEnsemblePlacementPolicy when policy class does not match ([#25825](https://github.com/apache/pulsar/pull/25825))
+- [fix][meta] Fix PulsarZooKeeperClient async addWatch callback retry behavior ([#25913](https://github.com/apache/pulsar/pull/25913))
+- [fix][meta] Fix ZooKeeper session reconnect race condition in PulsarZooKeeperClient.clientCreator ([#25910](https://github.com/apache/pulsar/pull/25910))
+- [fix][meta] Keep the leader value in the election cycle and make leader reads authoritative ([#26000](https://github.com/apache/pulsar/pull/26000))
+- [fix][meta] PIP-454: fix migration retry after failure, preparation timeout and mid-migration store startup ([#25989](https://github.com/apache/pulsar/pull/25989))
+- [fix][meta] PIP-454: fix stale migration status reported after completion ([#25993](https://github.com/apache/pulsar/pull/25993))
+- [improve][broker] Add authn/authz to Scalable Topics Admin API (PIP-460) ([#25618](https://github.com/apache/pulsar/pull/25618))
+- [improve][broker] Close connection when close consumer write fails ([#25520](https://github.com/apache/pulsar/pull/25520))
+- [improve][broker] Default managedLedgerMaxReadsInFlightSizeInMB to 15% of direct memory ([#25979](https://github.com/apache/pulsar/pull/25979))
+- [improve][broker] Improve default limits for acknowledgment state persistence and Key_Shared look-ahead ([#25992](https://github.com/apache/pulsar/pull/25992))
+- [improve][broker] Improve the performance of TopicName constructor ([#24463](https://github.com/apache/pulsar/pull/24463))
+- [improve][broker] Log only non-default config values on broker startup ([#25545](https://github.com/apache/pulsar/pull/25545))
+- [improve][broker] optimize namespaceBundle validation to fix single-thread 100% CPU during unloading entire namespaces. ([#25626](https://github.com/apache/pulsar/pull/25626))
+- [improve][broker] Optimize TripleLongPriorityQueue heap operations ([#26010](https://github.com/apache/pulsar/pull/26010))
+- [improve][broker] PIP-473 P3.5: durable per-segment visibility state ([#25821](https://github.com/apache/pulsar/pull/25821))
+- [improve][broker] PIP-473 P5.1: metadata-driven transaction coordinator (NEW_TXN / END_TXN) ([#25863](https://github.com/apache/pulsar/pull/25863))
+- [improve][broker] PIP-473 P5.2: scalable-topics TC timeout + GC sweeps ([#25884](https://github.com/apache/pulsar/pull/25884))
+- [improve][broker] PIP-473 P5.3: metadata-store TC leader election + assignment watch ([#25929](https://github.com/apache/pulsar/pull/25929))
+- [improve][broker] PIP-473 P5.4: v4/v5 transaction coordinator coexistence + enable v5 by default ([#25945](https://github.com/apache/pulsar/pull/25945))
+- [improve][broker] PIP-473: group all txn metadata paths under /txn/ ([#25792](https://github.com/apache/pulsar/pull/25792))
+- [improve][broker] PIP-473: MetadataPendingAckStore for segment subscriptions ([#25772](https://github.com/apache/pulsar/pull/25772))
+- [improve][broker] PIP-473: MetadataTransactionBuffer for segment topics ([#25768](https://github.com/apache/pulsar/pull/25768))
+- [improve][broker] PIP-473: transaction metadata data layer ([#25754](https://github.com/apache/pulsar/pull/25754))
+- [improve][broker] Prevent stale replicator pending reads after termination ([#25767](https://github.com/apache/pulsar/pull/25767))
+- [improve][broker] Simplify listener config and support proxyless Admin API (complete PIP-61/PIP-95) ([#25851](https://github.com/apache/pulsar/pull/25851))
+- [improve][broker] Trim orphaned bucket snapshots when ledgers are deleted ([#25984](https://github.com/apache/pulsar/pull/25984))
+- [improve][broker] update broker error message to include tenant name ([#25503](https://github.com/apache/pulsar/pull/25503))
+- [improve][broker] Use full bundle name for namespace bundle destination affinity in ModularLoadManagerImpl ([#25518](https://github.com/apache/pulsar/pull/25518))
+- [improve][broker] Part-3 of PIP-433: always allow replicator to register a new compatible schema ([#25461](https://github.com/apache/pulsar/pull/25461))
+- [improve][broker] Reduce the lock range of SimpleCache to enhance performance ([#25293](https://github.com/apache/pulsar/pull/25293))
+- [improve][admin] Apply all configurations instead of partial ones ([#25245](https://github.com/apache/pulsar/pull/25245))
+- [fix][txn] PIP-473: prune terminal transactions from the metadata buffer cache ([#25960](https://github.com/apache/pulsar/pull/25960))
+- [fix][txn] PIP-473: v5 transaction timeout applied 1000x too long ([#25959](https://github.com/apache/pulsar/pull/25959))
+- [improve][ml] Propagate slog logger context to BookKeeper ledger create/open ([#25995](https://github.com/apache/pulsar/pull/25995))
+- [improve][ml] Warn and emit metric when cursor ack state exceeds persist limits ([#25548](https://github.com/apache/pulsar/pull/25548))
+- [improve][offload] Coalesce automatic offload triggers to reduce retry loops and ledger scans ([#25793](https://github.com/apache/pulsar/pull/25793))
+- [improve][txn] PIP-473: GC aborted-transaction records on ML trim and segment drop ([#25975](https://github.com/apache/pulsar/pull/25975))
+- [cleanup][broker] Clean up scalable topic type references in ServerCnx ([#25920](https://github.com/apache/pulsar/pull/25920))
+- [refactor][broker] Decouple delayed delivery trackers from dispatcher ([#25384](https://github.com/apache/pulsar/pull/25384))
+- [feat][broker] PIP-466: Add supports_scalable_topics feature flag and broker config ([#25616](https://github.com/apache/pulsar/pull/25616))
+- [feat][broker] PIP-468: Filter scalable topics by property via secondary index ([#25632](https://github.com/apache/pulsar/pull/25632))
+- [feat][broker] PIP-468: scalable-topic seek + clear-backlog admin API ([#25696](https://github.com/apache/pulsar/pull/25696))
+- [feat][broker] PIP-469: Legacy-aware topic policies backend routing and metadata-store topic policies ([#25707](https://github.com/apache/pulsar/pull/25707))
+- [feat][broker] PIP-475: regular-to-scalable topic migration command ([#25875](https://github.com/apache/pulsar/pull/25875))
+- [feat][broker] PIP-475: synthetic-layout lookup for regular topics ([#25822](https://github.com/apache/pulsar/pull/25822))
+- [feat][broker] Support broker configuration for BookKeeper client TCP keep-alive options ([#25580](https://github.com/apache/pulsar/pull/25580))
+- [test][broker] PIP-475: end-to-end migration tests + transition fixes ([#25878](https://github.com/apache/pulsar/pull/25878))
+- [feat][monitor] Add custom topic metric labels to OpenTelemetry metrics attributes ([#25306](https://github.com/apache/pulsar/pull/25306))
+
+### Client
+
+- [feat] PIP-466: Add V5 client API for scalable topics ([#25489](https://github.com/apache/pulsar/pull/25489))
+- [feat][client] Embed GraalVM native image config ([#25883](https://github.com/apache/pulsar/pull/25883))
+- [feat][client] PIP-475: V5 SDK consumes synthetic layouts for regular topics ([#25850](https://github.com/apache/pulsar/pull/25850))
+- [feat][client] PIP-468: V5 producer/consumer knob coverage + related client fixes ([#25588](https://github.com/apache/pulsar/pull/25588))
+- [fix][client] Apply Avro logical type conversions when decoding schema without classloader ([#25759](https://github.com/apache/pulsar/pull/25759))
+- [fix][client] Avoid closing reused ServiceUrlProvider in another PulsarClientImpl instance ([#25947](https://github.com/apache/pulsar/pull/25947))
+- [fix][client] Clean up unacked messages when unsubscribing a topic with ack timeout backoff ([#25916](https://github.com/apache/pulsar/pull/25916))
+- [fix][client] Fix exclusive V5 scalable topic producer initial segment claim race condition ([#25778](https://github.com/apache/pulsar/pull/25778))
+- [fix][client] Fix failed to close consumer because of the error: param memorySize is a negative value ([#25805](https://github.com/apache/pulsar/pull/25805))
+- [fix][client] Fix idle connection release ignoring V5 watch sessions ([#25697](https://github.com/apache/pulsar/pull/25697))
+- [fix][client] Fix OpenTelemetryProducerInterceptor not executing due to eligible check ([#25585](https://github.com/apache/pulsar/pull/25585))
+- [fix][client] Fix thread-safety and refactor MessageCryptoBc key management ([#25400](https://github.com/apache/pulsar/pull/25400))
+- [fix][client] Inject trace context into message properties for producer-consumer span correlation ([#25749](https://github.com/apache/pulsar/pull/25749))
+- [fix][client] Make ClientBuilder serializable ([#25730](https://github.com/apache/pulsar/pull/25730))
+- [fix][client] Match logical topic when removing unacked messages ([#25921](https://github.com/apache/pulsar/pull/25921))
+- [fix][client] PIP-468: V5 CheckpointConsumer consumer-group support ([#25622](https://github.com/apache/pulsar/pull/25622))
+- [fix][client] PIP-468: V5 client validates serviceUrl scheme ([#25720](https://github.com/apache/pulsar/pull/25720))
+- [fix][client] PIP-468: Wire V5 StreamConsumer to broker SubscriptionCoordinator ([#25612](https://github.com/apache/pulsar/pull/25612))
+- [fix][client] PIP-475: make async producer survive regular-to-scalable migration ([#25882](https://github.com/apache/pulsar/pull/25882))
+- [fix][client] Preserve equals in FieldParser map values ([#25907](https://github.com/apache/pulsar/pull/25907))
+- [fix][client] Prevent duplicate ServiceUrlProvider initialization ([#25899](https://github.com/apache/pulsar/pull/25899))
+- [fix][client] Reset higher-index states on recovery in SameAuthParamsLookupAutoClusterFailover ([#25826](https://github.com/apache/pulsar/pull/25826))
+- [fix][client] Stabilize scaleReceiverQueueHint against concurrent enqueue/take ([#25578](https://github.com/apache/pulsar/pull/25578))
+- [fix][client] Broker-side producer handle leak if closes a producer which state is regitering schema ([#25725](https://github.com/apache/pulsar/pull/25725))
+- [improve][client] Add SOCKS5 proxy support for PulsarAdmin and for PulsarClient HTTP lookups ([#25575](https://github.com/apache/pulsar/pull/25575))
+- [improve][client] Best-effort retry for individual/batch-index acks on send failure when ackReceiptEnabled=false ([#25525](https://github.com/apache/pulsar/pull/25525))
+- [improve][client] Clean up unacked message tracker when topics are removed in multi-topic consumers ([#25923](https://github.com/apache/pulsar/pull/25923))
+- [improve][client] Implement tls_client_auth for AuthenticationOAuth2 ([#25538](https://github.com/apache/pulsar/pull/25538))
+- [improve][client] In cases where there is a risk of message loss, adjust the log level to error ([#25854](https://github.com/apache/pulsar/pull/25854))
+- [improve][client] PIP-234: Support sharing the memory limit controller across multiple isolated Pulsar client instances ([#25477](https://github.com/apache/pulsar/pull/25477))
+- [improve][client] PIP-468: Make Backoff jitter configurable ([#25669](https://github.com/apache/pulsar/pull/25669))
+- [improve][client] PIP-468: Rename V5 ackTimeout to processingTimeout(ProcessingTimeoutPolicy) ([#25649](https://github.com/apache/pulsar/pull/25649))
+- [cleanup][client] Remove unused RetryUtil class ([#25934](https://github.com/apache/pulsar/pull/25934))
+- [fix] Client-v5: Retry producer send on AlreadyClosed across segment seal ([#25610](https://github.com/apache/pulsar/pull/25610))
+
+### Pulsar IO and Pulsar Functions
+
+- [fix][fn] Fix functions update issue where artifact is provided as a http url ([#25840](https://github.com/apache/pulsar/pull/25840))
+- [fix][fn] Fix Go function runtime to continue after user exceptions and add neg-ack tests ([#25867](https://github.com/apache/pulsar/pull/25867))
+- [fix][fn] Fix orphan exclusive producer on creation timeout in WorkerUtils.createExclusiveProducerWithRetry ([#25942](https://github.com/apache/pulsar/pull/25942))
+- [improve][fn] Avoid gRPC timeout when getting status of a dead process runtime ([#25819](https://github.com/apache/pulsar/pull/25819))
+- [improve][fn] Log function package download completion and process PID ([#25568](https://github.com/apache/pulsar/pull/25568))
+- [improve][fn] make built-in connector reload incremental ([#25773](https://github.com/apache/pulsar/pull/25773))
+- [improve][fn] make built-in functions reload incremental ([#25868](https://github.com/apache/pulsar/pull/25868))
+- [improve][fn] Migrate pulsar-functions-proto from protobuf to LightProto ([#25407](https://github.com/apache/pulsar/pull/25407))
+- [refactor][fn] Use Map instead of TreeMap for connector/function API types ([#25790](https://github.com/apache/pulsar/pull/25790))
+- [feat][fn] Add message decoding failure handling ([#25972](https://github.com/apache/pulsar/pull/25972))
+- [fix][sec] Prevent path traversal in PackageName toRestPath ([#25628](https://github.com/apache/pulsar/pull/25628))
+
+### Others
+
+- [fix][proxy] Avoid intermittent 502 when admin proxy follows a broker redirect for a request with a body ([#25919](https://github.com/apache/pulsar/pull/25919))
+- [fix][proxy] Close channel on connection failure ([#25770](https://github.com/apache/pulsar/pull/25770))
+- [fix][doc] Correct default idle timeout in ClientBuilder and PulsarAdminBuilder docs ([#25771](https://github.com/apache/pulsar/pull/25771))
+- [fix][doc] Correct loadConf example key in PulsarAdminBuilder ([#25556](https://github.com/apache/pulsar/pull/25556))
+- [improve][proxy] Support scalable topics through the proxy ([#25879](https://github.com/apache/pulsar/pull/25879))
+- [fix][misc] Throw TypeConversionException when ByteUnitToIntegerConverter's long->int conversion overflows ([#25901](https://github.com/apache/pulsar/pull/25901))
+- [fix][misc] Update docker image guide and version scripts ([#25930](https://github.com/apache/pulsar/pull/25930))
+- [improve][doc] Add coding guideline for fully qualified class names ([#25928](https://github.com/apache/pulsar/pull/25928))
+- [improve][cli] Add client side looping in "pulsar-admin topics analyze-backlog" cli to avoid potential HTTP call timeout ([#25126](https://github.com/apache/pulsar/pull/25126))
+- [improve][cli] Migrate pulsar-client to the V5 client API ([#25917](https://github.com/apache/pulsar/pull/25917))
+- [improve][cli] Support 'auto_consume' schema type in pulsar-client consume/read ([#25927](https://github.com/apache/pulsar/pull/25927))
+- [improve][misc] Add AGENTS.md and split build/contributor/coding/architecture/security docs ([#25871](https://github.com/apache/pulsar/pull/25871))
+- [improve][misc] Add deepwiki badge in README to enable automated index update ([#25544](https://github.com/apache/pulsar/pull/25544))
+- [improve][misc] Make Protobuf v4 the default ([#25969](https://github.com/apache/pulsar/pull/25969))
+- [improve][misc] Migrate Swagger annotations to OpenAPI 3 (Swagger Core v3, jakarta) ([#25937](https://github.com/apache/pulsar/pull/25937))
+- [improve][misc] Migrate Yahoo DataSketches to Apache DataSketches ([#25965](https://github.com/apache/pulsar/pull/25965))
+- [improve][misc] PIP-472: Migrate from javax.* to jakarta.* APIs ([#25912](https://github.com/apache/pulsar/pull/25912))
+- [cleanup][misc] Remove obsolete LoadSimulationClient and LoadSimulationController ([#25926](https://github.com/apache/pulsar/pull/25926))
+- [improve][common] Optimize TopicName.get() to reduce lock contention on cache lookup ([#25367](https://github.com/apache/pulsar/pull/25367))
+- [improve][functions] Allow customizing Kubernetes service domain suffix in Function Worker ([#25872](https://github.com/apache/pulsar/pull/25872))
+- [improve][metadata] Add Option-set API to MetadataStore ([#25710](https://github.com/apache/pulsar/pull/25710))
+- [improve][metadata] Add streaming scanChildren to MetadataStore ([#25701](https://github.com/apache/pulsar/pull/25701))
+- [improve][metadata] Replace findByIndex with streaming scanByIndex (point + range) ([#25731](https://github.com/apache/pulsar/pull/25731))
+- [cleanup] PIP-462: Remove Etcd metadata store backend ([#25380](https://github.com/apache/pulsar/pull/25380))
+- [cleanup] PIP-463: Migrate build system from Maven to Gradle ([#25398](https://github.com/apache/pulsar/pull/25398))
+- [cleanup] PIP-468: Remove deprecated registerConsumer overloads ([#25712](https://github.com/apache/pulsar/pull/25712))
+- [cleanup] Remove fastutil dependency ([#25413](https://github.com/apache/pulsar/pull/25413))
+- [feat] PIP-460: Add topic:// and segment:// domain support to pulsar-common ([#25456](https://github.com/apache/pulsar/pull/25456))
+- [feat] PIP-468: Add scalable topic protocol commands and connection handling ([#25564](https://github.com/apache/pulsar/pull/25564))
+- [feat] PIP-468: Add scalable topics and segments admin APIs with CLI ([#25565](https://github.com/apache/pulsar/pull/25565))
+- [feat] PIP-468: Add ScalableTopicController and broker infrastructure ([#25559](https://github.com/apache/pulsar/pull/25559))
+- [feat] PIP-468: Auto-reconnect scalable consumer session on disconnect ([#25623](https://github.com/apache/pulsar/pull/25623))
+- [feat] PIP-468: Basic end-to-end tests for V5 Queue/Stream/Checkpoint consumers + async APIs ([#25587](https://github.com/apache/pulsar/pull/25587))
+- [feat] PIP-468: DagWatchClient auto-reconnects on broker disconnect ([#25687](https://github.com/apache/pulsar/pull/25687))
+- [feat] PIP-468: Filter scalable topic listing by multiple properties (AND) ([#25639](https://github.com/apache/pulsar/pull/25639))
+- [feat] PIP-468: Implement V5 client with scalable topic producer and consumer types ([#25573](https://github.com/apache/pulsar/pull/25573))
+- [feat] PIP-468: Multi-broker shared cluster + V5 cross-broker tests ([#25633](https://github.com/apache/pulsar/pull/25633))
+- [feat] PIP-468: Multi-topic QueueConsumer / StreamConsumer ([#25651](https://github.com/apache/pulsar/pull/25651))
+- [feat] PIP-468: Namespace scalable-topics watcher (protocol + broker + V5 client) ([#25648](https://github.com/apache/pulsar/pull/25648))
+- [feat] PIP-468: record wall-clock created/sealed timestamps on segments ([#25658](https://github.com/apache/pulsar/pull/25658))
+- [feat] PIP-468: sealed-segment retention GC for scalable topics ([#25668](https://github.com/apache/pulsar/pull/25668))
+- [feat] PIP-468: segment-aware admin endpoints for cursor lifecycle ([#25717](https://github.com/apache/pulsar/pull/25717))
+- [feat] PIP-468: Test schema evolution coverage on scalable topics ([#25637](https://github.com/apache/pulsar/pull/25637))
+- [feat] PIP-468: V5 Authentication adapter bridges authData() ([#25685](https://github.com/apache/pulsar/pull/25685))
+- [feat] PIP-468: V5 client end-to-end smoke test + segment-bypass for internal subscribe/read ([#25586](https://github.com/apache/pulsar/pull/25586))
+- [feat] PIP-468: V5 dead letter queue with scalable DLQ topic ([#25652](https://github.com/apache/pulsar/pull/25652))
+- [feat] PIP-468: V5 end-to-end encryption API redesign ([#25682](https://github.com/apache/pulsar/pull/25682))
+- [feat] PIP-468: V5 flow-control knob test coverage ([#25689](https://github.com/apache/pulsar/pull/25689))
+- [feat] PIP-468: V5 StreamConsumer disconnect / reconnect / past-grace reassignment ([#25619](https://github.com/apache/pulsar/pull/25619))
+- [feat] PIP-468: Wire transactions into V5 client ([#25631](https://github.com/apache/pulsar/pull/25631))
+- [fix] Fix flaky BrokerDispatchRateLimiterTest.testBrokerDispatchThrottledMetrics ([#25567](https://github.com/apache/pulsar/pull/25567))
+- [fix] Fix ManagedLedgerImpl's pendingAddEntries leak. ([#25240](https://github.com/apache/pulsar/pull/25240))
+- [fix] Fix typo 'seperated' in broker comments ([#25524](https://github.com/apache/pulsar/pull/25524))
+- [improve] Add context map to log4j2 pattern layouts ([#25491](https://github.com/apache/pulsar/pull/25491))
+- [improve] Add Option.SequenceKeysDeltas + subscribeSequence ([#25724](https://github.com/apache/pulsar/pull/25724))
+- [improve] Add PULSAR_LOG_FORMAT env var for easy JSON logging ([#25515](https://github.com/apache/pulsar/pull/25515))
+- [improve] Emit flat OpenTelemetry JSON logs instead of ECS ([#25542](https://github.com/apache/pulsar/pull/25542))
+- [improve] PIP-467: Convert Jetty request logs to structured slog events ([#25543](https://github.com/apache/pulsar/pull/25543))
+- [improve] PIP-467: Convert managed-ledger module logging from SLF4J to slog ([#25490](https://github.com/apache/pulsar/pull/25490))
+- [improve] PIP-467: Convert pulsar-broker module logging from SLF4J to slog ([#25535](https://github.com/apache/pulsar/pull/25535))
+- [improve] PIP-467: Convert pulsar-client module logging from SLF4J to slog ([#25507](https://github.com/apache/pulsar/pull/25507))
+- [improve] PIP-467: Convert pulsar-common module logging from SLF4J to slog ([#25506](https://github.com/apache/pulsar/pull/25506))
+- [improve] PIP-467: Convert pulsar-functions module logging from SLF4J to slog ([#25508](https://github.com/apache/pulsar/pull/25508))
+- [improve] PIP-467: Convert pulsar-metadata module logging from SLF4J to slog ([#25505](https://github.com/apache/pulsar/pull/25505))
+- [improve] PIP-467: Convert remaining modules logging from SLF4J to slog ([#25511](https://github.com/apache/pulsar/pull/25511))
+- [improve] PIP-467: Remove now-dead slf4j.api dependency from modules converted to slog ([#25541](https://github.com/apache/pulsar/pull/25541))
+- [improve] Wire Set<Option> through backend hooks + Oxia PartitionKey ([#25723](https://github.com/apache/pulsar/pull/25723))
+- [test][client-v5] V5 layout-dynamics coverage + consumer fixes (DAG replay, late-ack) ([#25611](https://github.com/apache/pulsar/pull/25611))
+
+### Tests & CI
+
+- [improve][ci] Run filesystem offload tests also on Java 25 since Hadoop has been upgraded to 3.5.0 ([#25482](https://github.com/apache/pulsar/pull/25482))
+- [improve][ci] Upgrade official GitHub Actions to latest major versions ([#25412](https://github.com/apache/pulsar/pull/25412))
+- [fix][ci] Fix CodeQL workflow and upgrade codeql-action to v4 ([#25481](https://github.com/apache/pulsar/pull/25481))
+- [improve][test] Upgrade Mockito to 5.23.0 ([#25667](https://github.com/apache/pulsar/pull/25667))
+- [improve][test] Upgrade TestNG to 7.12.0 ([#25666](https://github.com/apache/pulsar/pull/25666))
+- [improve][build] Upgrade Gradle to 9.5.1 ([#25786](https://github.com/apache/pulsar/pull/25786))
+- [improve][build] Upgrade Checkstyle from 10.14.2 to 13.3.0 ([#25440](https://github.com/apache/pulsar/pull/25440))
+- [improve][build] Upgrade lightproto gradle plugin to 0.7.2 ([#25751](https://github.com/apache/pulsar/pull/25751))
+- [improve][build] Upgrade lightproto gradle plugin to 0.7.3 ([#25780](https://github.com/apache/pulsar/pull/25780))
+- [fix][build] Fix build caching for shadow jars and refactor to use convention plugins ([#25409](https://github.com/apache/pulsar/pull/25409))
+- [fix][build] Fix generateOpenApiSpecs task and include missing admin v2 resources in the spec ([#26003](https://github.com/apache/pulsar/pull/26003))
+- [fix][build] Fix stage-release.sh for the Gradle build ([#26017](https://github.com/apache/pulsar/pull/26017))
+- [fix][build] Fix the shaded client artifacts: jar contents and Maven publication ([#26034](https://github.com/apache/pulsar/pull/26034))
+- [fix][build] Remove jetty-server from avroTools Gradle configuration used in build ([#25784](https://github.com/apache/pulsar/pull/25784))
+- [fix][ci] Ensure discard_max_bytes is set to 0 only for existing block devices ([#25510](https://github.com/apache/pulsar/pull/25510))
+- [fix][ci] Fix CodeQL job which is currently broken ([#25966](https://github.com/apache/pulsar/pull/25966))
+- [fix][ci] Prevent Pull Request Labeler from canceling runs across PRs ([#25968](https://github.com/apache/pulsar/pull/25968))
+- [fix][ci] Use CodeQL build-mode: none to avoid intermittent build-cache failures ([#25932](https://github.com/apache/pulsar/pull/25932))
+- [fix][test] Absorb Backoff jitter in PulsarServiceNameResolverTest.testRemoveUnavailableHost ([#25714](https://github.com/apache/pulsar/pull/25714))
+- [fix][test] Add timeout to initial receives in ResendRequestTest.testSharedSingleAckedPartitionedTopic ([#25828](https://github.com/apache/pulsar/pull/25828))
+- [fix][test] Deflake TopicPoliciesTest.setupTestTopic by retrying forced namespace deletion ([#25974](https://github.com/apache/pulsar/pull/25974))
+- [fix][test] Drop lookup probe in ExtensibleLoadManagerTest.startBroker to avoid channel-startup race ([#25715](https://github.com/apache/pulsar/pull/25715))
+- [fix][test] Extend SameAuthParamsLookupAutoClusterFailoverTest phase timeouts ([#25563](https://github.com/apache/pulsar/pull/25563))
+- [fix][test] Fix flaky AdminApiOffloadTest.testOffload status race ([#25674](https://github.com/apache/pulsar/pull/25674))
+- [fix][test] Fix flaky AdminApiTest.partitionedTopicsCursorReset ([#25847](https://github.com/apache/pulsar/pull/25847))
+- [fix][test] Fix flaky AdminApiTest.persistentTopicsCursorResetAfterReset timeout ([#25692](https://github.com/apache/pulsar/pull/25692))
+- [fix][test] Fix flaky BacklogQuotaManagerTest.createNamespaces (HTTP 409 cascade) ([#25680](https://github.com/apache/pulsar/pull/25680))
+- [fix][test] Fix flaky BookieClientsStatsGeneratorTest.testBookieClientStatsGenerator ([#25646](https://github.com/apache/pulsar/pull/25646))
+- [fix][test] Fix flaky BrokerRegistryIntegrationTest port binding race ([#25463](https://github.com/apache/pulsar/pull/25463))
+- [fix][test] Fix flaky compaction disable test by controlling delete concurrency ([#25794](https://github.com/apache/pulsar/pull/25794))
+- [fix][test] Fix flaky ConsumerBatchReceiveTest.testBatchReceiveAndRedeliveryNonPartitionedTopic ([#25468](https://github.com/apache/pulsar/pull/25468))
+- [fix][test] Fix flaky ExtensibleLoadManagerImpl client reconnection tests: PulsarClientException$AlreadyClosedException: Client already closed ([#25509](https://github.com/apache/pulsar/pull/25509))
+- [fix][test] Fix flaky ExtensibleLoadManagerImplTest by re-serving the channel topic in initializeState ([#25976](https://github.com/apache/pulsar/pull/25976))
+- [fix][test] Fix flaky ExtensibleLoadManagerImplTest.initializeState by recovering wedged channel ownership ([#25977](https://github.com/apache/pulsar/pull/25977))
+- [fix][test] Fix flaky ExtensibleLoadManagerImplTest.testLoadBalancerServiceUnitTableViewSyncer ([#25596](https://github.com/apache/pulsar/pull/25596))
+- [fix][test] Fix flaky ExtensibleLoadManagerTest.startBroker timeout ([#25500](https://github.com/apache/pulsar/pull/25500))
+- [fix][test] Fix flaky FunctionRuntimeManagerTest.testExternallyManagedRuntimeUpdate ([#25465](https://github.com/apache/pulsar/pull/25465))
+- [fix][test] Fix flaky InterceptorsTest and ProduceWithMessageIdTest ([#25499](https://github.com/apache/pulsar/pull/25499))
+- [fix][test] Fix flaky IsolatedBookieEnsemblePlacementPolicyTest.testBookieInfoChange ([#25473](https://github.com/apache/pulsar/pull/25473))
+- [fix][test] Fix flaky IsolatedBookieEnsemblePlacementPolicyTest.testMetadataStoreCases ([#25474](https://github.com/apache/pulsar/pull/25474))
+- [fix][test] Fix flaky LeaderElectionServiceTest and PersistentDispatcherFailoverConsumerTest ([#25498](https://github.com/apache/pulsar/pull/25498))
+- [fix][test] Fix flaky ManagedLedgerTest.testCursorPointsToDeletedLedgerAfterTrim ([#25476](https://github.com/apache/pulsar/pull/25476))
+- [fix][test] Fix flaky ManagedLedgerTest.testInvalidateReadHandleWhenConsumed ([#25595](https://github.com/apache/pulsar/pull/25595))
+- [fix][test] Fix flaky ManagedLedgerTest.testNoRetention ([#25467](https://github.com/apache/pulsar/pull/25467))
+- [fix][test] Fix flaky ManagedLedgerTest.testNoRetention and testInvalidateReadHandleWhenDeleteLedger ([#25495](https://github.com/apache/pulsar/pull/25495))
+- [fix][test] Fix flaky MembershipManagerTest.testCheckFailuresSomeFailures ([#25466](https://github.com/apache/pulsar/pull/25466))
+- [fix][test] Fix flaky MessageChunkingSharedTest.testMultiConsumers timeout ([#25475](https://github.com/apache/pulsar/pull/25475))
+- [fix][test] Fix flaky ModularLoadManagerImplTest and IsolatedBookieEnsemblePlacementPolicyTest ([#25496](https://github.com/apache/pulsar/pull/25496))
+- [fix][test] Fix flaky OffloadPrefixTest.testPositionOnEdgeOfLedger race with ledger rollover ([#25561](https://github.com/apache/pulsar/pull/25561))
+- [fix][test] Fix flaky OneWayReplicatorDeduplicationTest.testDeduplication ([#25679](https://github.com/apache/pulsar/pull/25679))
+- [fix][test] Fix flaky PersistentStickyKeyDispatcherMultipleConsumersTest.testSkipRedeliverTemporally ([#25843](https://github.com/apache/pulsar/pull/25843))
+- [fix][test] Fix flaky ProducerCleanupTest timer cleanup ([#25864](https://github.com/apache/pulsar/pull/25864))
+- [fix][test] Fix flaky PulsarFunctionsJavaThreadTest by adding retry to getFunctionStats ([#25472](https://github.com/apache/pulsar/pull/25472))
+- [fix][test] Fix flaky PulsarFunctionsJavaThreadTest.testTumblingCountWindowTest ([#25590](https://github.com/apache/pulsar/pull/25590))
+- [fix][test] Fix flaky PulsarFunctionTlsTest.testFunctionsCreation() test ([#25889](https://github.com/apache/pulsar/pull/25889))
+- [fix][test] Fix flaky RateLimiterTest.testDispatchRate ([#25846](https://github.com/apache/pulsar/pull/25846))
+- [fix][test] Fix flaky ReplicatorTest.testReplicatorClearBacklog NPE on inFlightTask ([#25691](https://github.com/apache/pulsar/pull/25691))
+- [fix][test] Fix flaky ReplicatorTest.testResumptionAfterBacklogRelaxed ([#25493](https://github.com/apache/pulsar/pull/25493))
+- [fix][test] Fix flaky ResendRequestTest.testSharedSingleAckedPartitionedTopic() test ([#25852](https://github.com/apache/pulsar/pull/25852))
+- [fix][test] Fix flaky SameAuthParamsLookupAutoClusterFailoverTest.testAutoClusterFailover() test ([#25892](https://github.com/apache/pulsar/pull/25892))
+- [fix][test] Fix flaky SaslAuthenticateTest.testMaxInflightContext() test ([#25948](https://github.com/apache/pulsar/pull/25948))
+- [fix][test] Fix flaky SchemaServiceTest.testSchemaRegistryMetrics ([#25645](https://github.com/apache/pulsar/pull/25645))
+- [fix][test] Fix flaky ServerCnxTest.testCreateProducerTimeoutThenCreateSameNamedProducerShouldFail ([#25497](https://github.com/apache/pulsar/pull/25497))
+- [fix][test] Fix flaky test ReplicatorTest.testResumptionAfterBacklogRelaxed ([#25950](https://github.com/apache/pulsar/pull/25950))
+- [fix][test] Fix flaky testClear in BucketDelayedDeliveryTrackerTest ([#25424](https://github.com/apache/pulsar/pull/25424))
+- [fix][test] Fix flaky testGetExcludedBookiesWithIsolationGroups ([#25640](https://github.com/apache/pulsar/pull/25640))
+- [fix][test] Fix flaky testLoadBalancerServiceUnitTableViewSyncer ([#25427](https://github.com/apache/pulsar/pull/25427))
+- [fix][test] Fix flaky testMsgDropStat in NonPersistentTopicTest ([#25426](https://github.com/apache/pulsar/pull/25426))
+- [fix][test] Fix flaky testRetentionSize in ManagedLedgerTest ([#25423](https://github.com/apache/pulsar/pull/25423))
+- [fix][test] Fix flaky TopicFromMessageTest by using unique topic names ([#25494](https://github.com/apache/pulsar/pull/25494))
+- [fix][test] Fix MultiBrokerLeaderElectionExpirationTest Mockito spy usage ([#25425](https://github.com/apache/pulsar/pull/25425))
+- [fix][test] Fix thread resource leaks in tests and PrometheusMetricsProvider ([#25487](https://github.com/apache/pulsar/pull/25487))
+- [fix][test] Flaky SameAuthParamsLookupAutoClusterFailoverTest ([#25566](https://github.com/apache/pulsar/pull/25566))
+- [fix][test] Make LocalBookkeeperEnsemble robust to port race and partial-setup cleanup ([#25690](https://github.com/apache/pulsar/pull/25690))
+- [fix][test] Make NamespacesTest.cleanupAfterMethod tolerant of transient infra failures ([#25641](https://github.com/apache/pulsar/pull/25641))
+- [fix][test] Make SameAuthParamsLookupAutoClusterFailoverTest less timing-sensitive ([#25675](https://github.com/apache/pulsar/pull/25675))
+- [fix][test] PIP-473: deflake TransactionCoordinatorV5Test.sweepTimeouts_abortsExpiredOpenTxnAndFansOut ([#25961](https://github.com/apache/pulsar/pull/25961))
+- [fix][test] Recreate EventLoop in PublishRateLimiterTest setup ([#25560](https://github.com/apache/pulsar/pull/25560))
+- [fix][test] Reduce admin client churn in ExtensibleLoadManagerTest.startBroker ([#25676](https://github.com/apache/pulsar/pull/25676))
+- [fix][test] Reduce flakiness in testLoadBalancerServiceUnitTableViewSyncer ([#25638](https://github.com/apache/pulsar/pull/25638))
+- [fix][test] Relax BrokerRegistryIntegrationTest broker-close threshold ([#25562](https://github.com/apache/pulsar/pull/25562))
+- [fix][test] Relax V5ConsumerPriorityLevelTest.testLowerPriorityConsumerReceivesOverflow ([#25716](https://github.com/apache/pulsar/pull/25716))
+- [fix][test] Stabilize delayed auditor lost bookie tests in AuditorLedgerCheckerTest ([#25957](https://github.com/apache/pulsar/pull/25957))
+- [fix][test] Stabilize flaky sweepTimeouts_abortsExpiredOpenTxnAndFansOut() test ([#25952](https://github.com/apache/pulsar/pull/25952))
+- [fix][test] Stabilize testSecondaryIsolationGroupsBookiesNegative() test ([#25900](https://github.com/apache/pulsar/pull/25900))
+- [fix][test] Stabilize WebService rate limiting test ([#25866](https://github.com/apache/pulsar/pull/25866))
+- [improve][build] Add Maven publishing conventions for ASF release ([#25457](https://github.com/apache/pulsar/pull/25457))
+- [improve][build] Adopt Gradle best practices: convention plugins, build-logic composite build, and unconditional module inclusion ([#25435](https://github.com/apache/pulsar/pull/25435))
+- [improve][build] Disable test retry when running tests in IntelliJ ([#25814](https://github.com/apache/pulsar/pull/25814))
+- [improve][build] Enable -Xlint:deprecation and -Xlint:unchecked and fix all warnings ([#25446](https://github.com/apache/pulsar/pull/25446))
+- [improve][build] Enhance Docker build task to support image pushing ([#25459](https://github.com/apache/pulsar/pull/25459))
+- [improve][build] Fix and enable configure-on-demand for Gradle builds ([#25441](https://github.com/apache/pulsar/pull/25441))
+- [improve][build] Fix compile errors from rawtypes/unchecked changes ([#25418](https://github.com/apache/pulsar/pull/25418))
+- [improve][build] Fix compile warnings in production code ([#25414](https://github.com/apache/pulsar/pull/25414))
+- [improve][build] Fix dangling-doc-comments, fallthrough, and section comment warnings ([#25416](https://github.com/apache/pulsar/pull/25416))
+- [improve][build] Fix final rawtypes, unchecked, and redundant cast warnings ([#25420](https://github.com/apache/pulsar/pull/25420))
+- [improve][build] Fix Lombok, varargs, and other compile warnings ([#25415](https://github.com/apache/pulsar/pull/25415))
+- [improve][build] Fix publishing of public libraries with correct POM and Gradle module metadata ([#26020](https://github.com/apache/pulsar/pull/26020))
+- [improve][build] Fix rawtypes and unchecked compile warnings ([#25417](https://github.com/apache/pulsar/pull/25417))
+- [improve][build] Fix remaining rawtypes, unchecked, and deprecation warnings ([#25419](https://github.com/apache/pulsar/pull/25419))
+- [improve][build] Generate PulsarVersion build info as resource ([#25841](https://github.com/apache/pulsar/pull/25841))
+- [improve][build] Keep release build info stable with a snapshot file ([#26014](https://github.com/apache/pulsar/pull/26014))
+- [improve][build] PIP-465: Remove IO connectors from core pulsar repo ([#25408](https://github.com/apache/pulsar/pull/25408))
+- [improve][build] Replace check-binary-license.sh with a Gradle task ([#25673](https://github.com/apache/pulsar/pull/25673))
+- [improve][build] Show test failure exceptions ([#25411](https://github.com/apache/pulsar/pull/25411))
+- [improve][build] Support building and testing with Java 25 ([#25453](https://github.com/apache/pulsar/pull/25453))
+- [improve][build] Suppress deprecation warnings across all modules ([#25421](https://github.com/apache/pulsar/pull/25421))
+- [improve][build] Suppress remaining unchecked warnings in source code ([#25422](https://github.com/apache/pulsar/pull/25422))
+- [improve][build] Use public Gradle build scans for PRs ([#25439](https://github.com/apache/pulsar/pull/25439))
+- [improve][ci] Cleanup tune-runner-vm and clean-disk actions ([#25444](https://github.com/apache/pulsar/pull/25444))
+- [improve][ci] Document avoiding reflection in tests in Copilot review instructions ([#25636](https://github.com/apache/pulsar/pull/25636))
+- [improve][ci] Include XML test reports in CI artifacts and generate HTML index ([#25484](https://github.com/apache/pulsar/pull/25484))
+- [improve][ci] Replace trivy-action with sandboxed-trivy-action ([#25480](https://github.com/apache/pulsar/pull/25480))
+- [improve][test] Fix cast, static, removal, and varargs compile warnings in test code ([#25428](https://github.com/apache/pulsar/pull/25428))
+- [improve][test] Fix deprecation and unchecked compilation warnings in test code ([#25447](https://github.com/apache/pulsar/pull/25447))
+- [improve][test] Fix rawtypes compile warnings in test code ([#25430](https://github.com/apache/pulsar/pull/25430))
+- [improve][test] Fix try-with-resources compile warnings in test code ([#25429](https://github.com/apache/pulsar/pull/25429))
+- [improve][test] Fix unchecked compile warnings in test code ([#25431](https://github.com/apache/pulsar/pull/25431))
+- [improve][test] Migrate pulsar-perf to the V5 client API ([#25887](https://github.com/apache/pulsar/pull/25887))
+- [improve][test] PIP-467: Convert pulsar-broker test files logging from SLF4J to slog ([#25536](https://github.com/apache/pulsar/pull/25536))
+- [improve][test] PIP-473: extensive v5 transaction tests on scalable topics ([#25958](https://github.com/apache/pulsar/pull/25958))
+- [improve][test] pulsar-perf consume: switch between V5 Queue and Stream consumer ([#25981](https://github.com/apache/pulsar/pull/25981))
+- [improve][test] Set diskUsageThreshold to 0.999 for tests to effectively disable the check ([#25677](https://github.com/apache/pulsar/pull/25677))
+- [improve][test] Speed up HealthCheckTest by sharing cluster across test methods ([#25448](https://github.com/apache/pulsar/pull/25448))
+- [improve][test] Suppress deprecation compile warnings in test code ([#25432](https://github.com/apache/pulsar/pull/25432))
+- [improve][test]Add test: test/testTopicPartitionCannotBeCreatedAfterTopicDeleted ([#26038](https://github.com/apache/pulsar/pull/26038))
+- [cleanup][build] Remove leftover Maven files and references ([#25406](https://github.com/apache/pulsar/pull/25406))
+- [cleanup][build] Remove unused structured-event-log module ([#25492](https://github.com/apache/pulsar/pull/25492))
+- [cleanup][build] Update bin/ scripts from Maven to Gradle for dev classpath ([#25404](https://github.com/apache/pulsar/pull/25404))
+- [cleanup][build] Update documentation and examples from Maven to Gradle ([#25403](https://github.com/apache/pulsar/pull/25403))
+- [cleanup][ci] Remove documentation label bot ([#25469](https://github.com/apache/pulsar/pull/25469))
+- [cleanup][ci] Remove ready-to-test label enforcement ([#25470](https://github.com/apache/pulsar/pull/25470))
+- [cleanup][test] Remove PortManager and use kernel-assigned ports everywhere ([#25694](https://github.com/apache/pulsar/pull/25694))
+- [feat][ci] Add Gradle dependency submission workflow for Dependabot alerts ([#25748](https://github.com/apache/pulsar/pull/25748))
+
+For the complete list, check the [full changelog] since 4.2.0 release branch was forked (https://github.com/apache/pulsar/compare/19ef1fc...v5.0.0-M1).
diff --git a/releases.json b/releases.json
index 494c1e77251..41c36912ef0 100644
--- a/releases.json
+++ b/releases.json
@@ -1,4 +1,5 @@
[
+ "5.0.0-M1",
"4.2.2",
"4.2.1",
"4.2.0",
(pulsar-site) 02/16: Generate Javadoc from the Gradle build for Pulsar 5.0.0+/master
Posted by lh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
lhotari pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/pulsar-site.git
commit 891c6f8c91ab8a25c0d4d7d3b7d6b074efb273f4
Author: Lari Hotari <lh...@users.noreply.github.com>
AuthorDate: Tue Jun 23 17:58:43 2026 +0300
Generate Javadoc from the Gradle build for Pulsar 5.0.0+/master
java-apidoc-generator only knew how to run mvn javadoc:javadoc, which fails
on Pulsar master/5.0.0+ checkouts (Gradle build, no pom.xml). Detect the
build system (reusing pulsar_build.detect) and, for Gradle, run the modules'
standard javadoc tasks and publish from build/docs/javadoc. The Maven path
is unchanged for pre-5.0 releases, and the version is read from
gradle.properties (Gradle) or the root pom.xml (Maven).
---
tools/pytools/lib/execute/javadoc_generator.py | 136 ++++++++++++++++---------
1 file changed, 90 insertions(+), 46 deletions(-)
diff --git a/tools/pytools/lib/execute/javadoc_generator.py b/tools/pytools/lib/execute/javadoc_generator.py
index 27e0041074f..3e680774edb 100644
--- a/tools/pytools/lib/execute/javadoc_generator.py
+++ b/tools/pytools/lib/execute/javadoc_generator.py
@@ -18,6 +18,7 @@
import shutil
import tarfile
import tempfile
+import xml.etree.ElementTree as ET
from pathlib import Path
import requests
@@ -25,72 +26,115 @@ import semver
from command import find_command, run
from constant import site_path
+from execute import pulsar_build
def find_apidocs_path(base_path):
- """Find the apidocs directory, checking common locations."""
+ """Find the Maven apidocs directory, checking common locations."""
candidates = [
base_path / 'target' / 'site' / 'apidocs',
base_path / 'target' / 'reports' / 'apidocs'
]
-
+
for path in candidates:
if path.exists():
return path
-
+
raise FileNotFoundError(f"Could not find apidocs in any of: {candidates}")
-def execute(dir_or_version: str):
+def _major_minor_x(version_text: str) -> str:
+ """Turn a full project version (e.g. 5.0.0-M1) into the published 5.0.x form."""
+ ver = semver.VersionInfo.parse(version_text)
+ return f"{ver.major}.{ver.minor}.x"
+
+
+def _source_version(src: Path, build: pulsar_build.BuildSystem) -> str:
+ """Read the project version from a source checkout, in the X.Y.x form used
+ for the published Javadoc directories. Gradle checkouts (Pulsar master/5.0.0+)
+ carry it in gradle.properties; Maven checkouts in the root pom.xml."""
+ if build == pulsar_build.BuildSystem.gradle:
+ for line in (src / 'gradle.properties').read_text().splitlines():
+ line = line.strip()
+ if line.startswith('version='):
+ return _major_minor_x(line.split('=', 1)[1].strip())
+ raise RuntimeError(f'No version= entry found in {src / "gradle.properties"}')
+ root = ET.parse(src / 'pom.xml').getroot()
+ version_elem = root.find('{http://maven.apache.org/POM/4.0.0}version')
+ return _major_minor_x(version_elem.text)
+
+
+def _publish(apidocs: Path, name: str, v: str):
+ dst = site_path() / 'static' / 'api' / name / v
+ if dst.exists():
+ shutil.rmtree(dst)
+ shutil.copytree(apidocs, dst)
+
+
+def _generate_gradle(src: Path, v: str):
+ # Pulsar master/5.0.0+ build with Gradle: the modules' standard `javadoc`
+ # tasks write to <module>/build/docs/javadoc. A single Gradle invocation
+ # builds all three; the task graph compiles the dependent projects as needed.
+ gradlew = src / 'gradlew'
+ run(
+ str(gradlew.absolute()),
+ ':pulsar-client-api:javadoc',
+ ':pulsar-client-admin-api:javadoc',
+ ':pulsar-functions:pulsar-functions-api:javadoc',
+ '--no-configuration-cache',
+ '--no-daemon',
+ cwd=src,
+ )
+ _publish(src / 'pulsar-client-api' / 'build' / 'docs' / 'javadoc', 'client', v)
+ _publish(src / 'pulsar-client-admin-api' / 'build' / 'docs' / 'javadoc', 'admin', v)
+ _publish(src / 'pulsar-functions' / 'api-java' / 'build' / 'docs' / 'javadoc',
+ 'pulsar-functions', v)
+
+
+def _generate_maven(src: Path, v: str):
+ # Pre-5.0 releases build with Maven: javadoc:javadoc writes to the module's
+ # target/site/apidocs (or target/reports/apidocs).
mvn = find_command('mvn', msg="mvn is required")
-
- if Path(dir_or_version).is_dir():
- src = Path(dir_or_version)
- import xml.etree.ElementTree as ET
- pom_path = src / 'pom.xml'
- tree = ET.parse(pom_path)
- root = tree.getroot()
- version_elem = root.find('{http://maven.apache.org/POM/4.0.0}version')
- ver = semver.VersionInfo.parse(version_elem.text)
- v = f"{ver.major}.{ver.minor}.x"
- else:
- ver = semver.VersionInfo.parse(dir_or_version)
- assert ver.compare('2.8.0') >= 0, 'versions before 2.8.0 did not have the -src suffix'
- assert ver.compare('2.11.0') != 0, '2.11.0 is unsupported, see https://github.com/apache/pulsar/pull/19202'
-
- with tempfile.TemporaryDirectory() as cwd:
- v = f"{ver.major}.{ver.minor}.{ver.patch}"
- remote = f'https://archive.apache.org/dist/pulsar/pulsar-{v}/apache-pulsar-{v}-src.tar.gz'
- resp = requests.get(remote, stream=True)
- assert resp.status_code == 200
- print(f'Download source code from {remote}')
- f = tarfile.open(fileobj=resp.raw, mode='r|gz')
- f.extractall(cwd)
- print(f'Extract source code to {cwd}')
-
- src = Path(cwd) / f'apache-pulsar-{v}-src'
- v = f"{ver.major}.{ver.minor}.x"
# client
- dst = site_path() / 'static' / 'api' / 'client' / v
run(mvn, '-Dlocale=en_US', '-pl', 'pulsar-client-api', 'javadoc:javadoc', cwd=src)
- client_apidocs = find_apidocs_path(src / 'pulsar-client-api')
- if dst.exists():
- shutil.rmtree(dst)
- shutil.copytree(client_apidocs, dst)
+ _publish(find_apidocs_path(src / 'pulsar-client-api'), 'client', v)
# admin
- dst = site_path() / 'static' / 'api' / 'admin' / v
run(mvn, '-Dlocale=en_US', '-pl', 'pulsar-client-admin-api', 'javadoc:javadoc', cwd=src)
- admin_apidocs = find_apidocs_path(src / 'pulsar-client-admin-api')
- if dst.exists():
- shutil.rmtree(dst)
- shutil.copytree(admin_apidocs, dst)
+ _publish(find_apidocs_path(src / 'pulsar-client-admin-api'), 'admin', v)
# function
- dst = site_path() / 'static' / 'api' / 'pulsar-functions' / v
run(mvn, '-Dlocale=en_US', '-pl', 'api-java', 'javadoc:javadoc', cwd=(src / 'pulsar-functions'))
- function_apidocs = find_apidocs_path(src / 'pulsar-functions' / 'api-java')
- if dst.exists():
- shutil.rmtree(dst)
- shutil.copytree(function_apidocs, dst)
\ No newline at end of file
+ _publish(find_apidocs_path(src / 'pulsar-functions' / 'api-java'), 'pulsar-functions', v)
+
+
+def _generate(src: Path, v: str):
+ if pulsar_build.detect(src) == pulsar_build.BuildSystem.gradle:
+ _generate_gradle(src, v)
+ else:
+ _generate_maven(src, v)
+
+
+def execute(dir_or_version: str):
+ if Path(dir_or_version).is_dir():
+ src = Path(dir_or_version)
+ _generate(src, _source_version(src, pulsar_build.detect(src)))
+ return
+
+ ver = semver.VersionInfo.parse(dir_or_version)
+ assert ver.compare('2.8.0') >= 0, 'versions before 2.8.0 did not have the -src suffix'
+ assert ver.compare('2.11.0') != 0, '2.11.0 is unsupported, see https://github.com/apache/pulsar/pull/19202'
+
+ with tempfile.TemporaryDirectory() as cwd:
+ full = f"{ver.major}.{ver.minor}.{ver.patch}"
+ remote = f'https://archive.apache.org/dist/pulsar/pulsar-{full}/apache-pulsar-{full}-src.tar.gz'
+ resp = requests.get(remote, stream=True)
+ assert resp.status_code == 200
+ print(f'Download source code from {remote}')
+ f = tarfile.open(fileobj=resp.raw, mode='r|gz')
+ f.extractall(cwd)
+ print(f'Extract source code to {cwd}')
+
+ src = Path(cwd) / f'apache-pulsar-{full}-src'
+ _generate(src, f"{ver.major}.{ver.minor}.x")
(pulsar-site) 13/16: Add version tokens for V5 client and current milestone
Posted by lh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
lhotari pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/pulsar-site.git
commit 6738b7bdb69e3587e3160bcb4251d4d2a0ac60d2
Author: Lari Hotari <lh...@users.noreply.github.com>
AuthorDate: Wed Jun 24 00:15:08 2026 +0300
Add version tokens for V5 client and current milestone
Introduce three release-derived tokens (computed from releases.json with
prerelease-aware semver):
- version:latest-v5plus: latest Pulsar 5.x+ release that ships the V5
client; a stable 5.x+ release wins over a milestone, a milestone (e.g.
5.0.0-M1) is used only while no stable 5.x+ exists yet.
- version:current-milestone: the milestone currently in effect, or empty
once a non-milestone release supersedes it (repopulates at the next -M*).
- version:current-milestone-suffix: ", milestone: <version>" or empty, so
version-hint comments collapse cleanly when no milestone is active.
Use latest-v5plus for the dependency versions in java-v5 and
java-migrate-to-v5, and append the milestone suffix to the "LTS: x,
latest: y" hints in java-setup so they read "LTS: x, latest: y,
milestone: 5.0.0-M1" while a milestone is active.
---
client-libraries/java-migrate-to-v5.md | 4 ++--
client-libraries/java-setup.md | 12 +++++-----
client-libraries/java-v5.md | 6 ++---
src/config/pulsarVariables.ts | 41 ++++++++++++++++++++++++++++++++++
4 files changed, 52 insertions(+), 11 deletions(-)
diff --git a/client-libraries/java-migrate-to-v5.md b/client-libraries/java-migrate-to-v5.md
index c0574bcc1a7..7c52b96aa2d 100644
--- a/client-libraries/java-migrate-to-v5.md
+++ b/client-libraries/java-migrate-to-v5.md
@@ -36,7 +36,7 @@ Use the [Pulsar BOM](java-setup.md#pulsar-bom) to keep all Pulsar artifacts on o
```xml
<!-- in your <properties> block -->
-<pulsar.version>@pulsar:version:latest@</pulsar.version>
+<pulsar.version>@pulsar:version:latest-v5plus@</pulsar.version>
<!-- in your <dependencyManagement> block -->
<dependency>
@@ -62,7 +62,7 @@ Use the [Pulsar BOM](java-setup.md#pulsar-bom) to keep all Pulsar artifacts on o
### Gradle
```groovy
-def pulsarVersion = '@pulsar:version:latest@'
+def pulsarVersion = '@pulsar:version:latest-v5plus@'
dependencies {
implementation enforcedPlatform("org.apache.pulsar:pulsar-bom:${pulsarVersion}")
diff --git a/client-libraries/java-setup.md b/client-libraries/java-setup.md
index 88293ae5262..eb9f834e5f4 100644
--- a/client-libraries/java-setup.md
+++ b/client-libraries/java-setup.md
@@ -28,7 +28,7 @@ If you use Maven, add the following information to the `pom.xml` file.
```xml
<!-- in your <properties> block -->
-<!-- LTS: @pulsar:version:lts@, latest: @pulsar:version:latest@ -->
+<!-- LTS: @pulsar:version:lts@, latest: @pulsar:version:latest@@pulsar:version:current-milestone-suffix@ -->
<pulsar.version>@pulsar:version:lts@</pulsar.version>
<!-- in your <dependencies> block -->
@@ -44,7 +44,7 @@ If you use Maven, add the following information to the `pom.xml` file.
If you use Gradle, add the following information to the `build.gradle` file.
```groovy
-// LTS: @pulsar:version:lts@, latest: @pulsar:version:latest@
+// LTS: @pulsar:version:lts@, latest: @pulsar:version:latest@@pulsar:version:current-milestone-suffix@
def pulsarVersion = '@pulsar:version:lts@'
dependencies {
@@ -69,7 +69,7 @@ If you use Maven, add the following information to the `pom.xml` file.
```xml
<!-- in your <properties> block -->
-<!-- LTS: @pulsar:version:lts@, latest: @pulsar:version:latest@ -->
+<!-- LTS: @pulsar:version:lts@, latest: @pulsar:version:latest@@pulsar:version:current-milestone-suffix@ -->
<pulsar.version>@pulsar:version:lts@</pulsar.version>
<!-- in your <dependencyManagement>/<dependencies> block -->
@@ -99,7 +99,7 @@ Please notice that when using Spring Boot and the default Gradle build with the
:::
```groovy
-// LTS: @pulsar:version:lts@, latest: @pulsar:version:latest@
+// LTS: @pulsar:version:lts@, latest: @pulsar:version:latest@@pulsar:version:current-milestone-suffix@
def pulsarVersion = '@pulsar:version:lts@'
dependencies {
@@ -120,7 +120,7 @@ The Spring Boot [Dependency Version properties](https://docs.spring.io/spring-bo
```xml
<!-- in your <properties> block -->
-<!-- LTS: @pulsar:version:lts@, latest: @pulsar:version:latest@ -->
+<!-- LTS: @pulsar:version:lts@, latest: @pulsar:version:latest@@pulsar:version:current-milestone-suffix@ -->
<pulsar.version>@pulsar:version:lts@</pulsar.version>
<!-- in your <dependencies> block -->
@@ -140,7 +140,7 @@ To use a specific Pulsar version for the Pulsar Java client in a Spring Boot app
```groovy
// Alternatively, you can set the `pulsar.version` property in the `gradle.properties` file.
-// LTS: @pulsar:version:lts@, latest: @pulsar:version:latest@
+// LTS: @pulsar:version:lts@, latest: @pulsar:version:latest@@pulsar:version:current-milestone-suffix@
ext['pulsar.version'] = '@pulsar:version:lts@'
// The Pulsar Java client will be automatically added to dependencies as a transitive dependency of the spring-boot-starter-pulsar dependency
diff --git a/client-libraries/java-v5.md b/client-libraries/java-v5.md
index 08aae44d165..0455783ff07 100644
--- a/client-libraries/java-v5.md
+++ b/client-libraries/java-v5.md
@@ -17,7 +17,7 @@ The V5 client requires **Java 17**. Scalable-topic support in the other language
## Install
-The V5 client is published to Maven Central as `pulsar-client-v5` (available from **@pulsar:version:latest@**). Its API lives under the [`org.apache.pulsar.client.api.v5`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/package-summary.html) package.
+The V5 client is published to Maven Central as `pulsar-client-v5` (available from **@pulsar:version:latest-v5plus@**). Its API lives under the [`org.apache.pulsar.client.api.v5`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/package-summary.html) package.
### Maven
@@ -25,7 +25,7 @@ The V5 client is published to Maven Central as `pulsar-client-v5` (available fro
<dependency>
<groupId>org.apache.pulsar</groupId>
<artifactId>pulsar-client-v5</artifactId>
- <version>@pulsar:version:latest@</version>
+ <version>@pulsar:version:latest-v5plus@</version>
</dependency>
```
@@ -33,7 +33,7 @@ The V5 client is published to Maven Central as `pulsar-client-v5` (available fro
```groovy
dependencies {
- implementation "org.apache.pulsar:pulsar-client-v5:@pulsar:version:latest@"
+ implementation "org.apache.pulsar:pulsar-client-v5:@pulsar:version:latest-v5plus@"
}
```
diff --git a/src/config/pulsarVariables.ts b/src/config/pulsarVariables.ts
index 651c9b1f67a..d344614587b 100644
--- a/src/config/pulsarVariables.ts
+++ b/src/config/pulsarVariables.ts
@@ -2,6 +2,7 @@ import semver from "semver";
import * as compareVersions from "compare-versions";
import versionsList from "../../versions.json";
+import releasesList from "../../releases.json";
import restApiVersions from "../../static/swagger/restApiVersions.json";
// CommonJS modules without type declarations — typed inline below.
@@ -28,6 +29,43 @@ export const latestMajorRelease: string = versions[0];
// LTS major version. Kept in sync with `_ltsVersion` in src/theme/DocVersionBanner/index.js.
export const ltsMajorRelease: string = "4.0.x";
+// Every published Pulsar release (newest first), including milestone (-M*) releases.
+const releases = releasesList as string[];
+
+// Milestone releases (e.g. 5.0.0-M1) are published ahead of an LTS release and are
+// not meant for production use.
+function isMilestoneRelease(version: string): boolean {
+ return /-M\d+/i.test(version);
+}
+
+// Highest version in `list` by (prerelease-aware) semver order, or "" if none parse.
+function latestBySemver(list: string[]): string {
+ return list.filter((v) => semver.valid(v)).sort(semver.rcompare)[0] ?? "";
+}
+
+// The latest release that ships the V5 client (Pulsar 5.0.0+, i.e. the
+// `org.apache.pulsar.client.api.v5` API). A stable 5.x+ release always wins over a
+// milestone; a milestone (e.g. 5.0.0-M1) is used only while no stable 5.x+ release
+// exists yet. Empty before any 5.x release is published.
+const v5PlusReleases = releases.filter((v) => (semver.coerce(v)?.major ?? 0) >= 5);
+const v5PlusStableReleases = v5PlusReleases.filter((v) => !isMilestoneRelease(v));
+export const latestV5PlusRelease: string = latestBySemver(
+ v5PlusStableReleases.length > 0 ? v5PlusStableReleases : v5PlusReleases
+);
+
+// The milestone release currently in effect, or "" when the newest release is not a
+// milestone — i.e. a stable release has superseded the last milestone and no newer
+// milestone has been published yet (5.0.0-M1 now; empty after 5.0.0 ships; 5.1.0-M1
+// once the next milestone is out).
+const newestRelease = latestBySemver(releases);
+export const currentMilestoneRelease: string =
+ newestRelease !== "" && isMilestoneRelease(newestRelease) ? newestRelease : "";
+
+// Formatted ", milestone: <version>" annotation for version hints, empty when no
+// milestone is active so surrounding text (e.g. "LTS: x, latest: y") collapses cleanly.
+export const currentMilestoneSuffix: string =
+ currentMilestoneRelease !== "" ? `, milestone: ${currentMilestoneRelease}` : "";
+
export function getRealVersion(version: string): string {
const versionMap: Record<string, string> = {};
const vsGroups: Record<string, string[]> = {};
@@ -237,7 +275,10 @@ export function resolveTokens(versionKey: string, referenceLatest = false): Map<
["version_origin", versionOrigin],
["version_reference", versionReference],
["version:adapters", pulsarAdaptersVersion],
+ ["version:current-milestone", currentMilestoneRelease],
+ ["version:current-milestone-suffix", currentMilestoneSuffix],
["version:latest", latestVersion],
+ ["version:latest-v5plus", latestV5PlusRelease],
["version:lts", ltsVersion],
["version:python", clientPythonVersion(pythonArg)],
["version", resolvedVersion],
(pulsar-site) 06/16: Add 5.0.x to static/reference/index.html
Posted by lh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
lhotari pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/pulsar-site.git
commit ae5c2ecb97491e2fa1e38e084b2859e1c9280f94
Author: Lari Hotari <lh...@users.noreply.github.com>
AuthorDate: Tue Jun 23 21:38:20 2026 +0300
Add 5.0.x to static/reference/index.html
---
static/reference/index.html | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/static/reference/index.html b/static/reference/index.html
index cd235a33c7a..5c55e12af86 100644
--- a/static/reference/index.html
+++ b/static/reference/index.html
@@ -208,6 +208,7 @@
'<option value="4.0.x">4.0.x</value>' +
'<option value="4.1.x">4.1.x</value>' +
'<option value="4.2.x">4.2.x</value>' +
+ '<option value="5.0.x">5.0.x</value>' +
'<option value="next">next</value>' +
"</select>",
repo: "apache/pulsar",
@@ -220,7 +221,7 @@
namespaces: [
{
id: "version",
- values: ["2.6.x", "2.7.x", "2.8.x", "2.9.x", "2.10.x", "2.11.x", "3.0.x", "3.1.x", "3.2.x", "3.3.x", "4.0.x", "4.1.x", "4.2.x", "next"],
+ values: ["2.6.x", "2.7.x", "2.8.x", "2.9.x", "2.10.x", "2.11.x", "3.0.x", "3.1.x", "3.2.x", "3.3.x", "4.0.x", "4.1.x", "4.2.x", "5.0.x", "next"],
optional: true,
selector: "#ver-selector",
default: "next",
(pulsar-site) 05/16: add reference for 5.0.0-M1
Posted by lh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
lhotari pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/pulsar-site.git
commit 38dd851e68318cc721138a7561378fed70dee612
Author: Lari Hotari <lh...@users.noreply.github.com>
AuthorDate: Tue Jun 23 21:35:53 2026 +0300
add reference for 5.0.0-M1
---
static/reference/5.0.x/README.md | 3 +
static/reference/5.0.x/_sidebar.md | 61 +
static/reference/5.0.x/bookkeeper/README.md | 1 +
static/reference/5.0.x/bookkeeper/bookkeeper.md | 94 +
static/reference/5.0.x/cli.md | 3 +
static/reference/5.0.x/client/README.md | 28 +
.../5.0.x/client/client-configuration-client.md | 432 +
.../5.0.x/client/client-configuration-consumer.md | 292 +
.../5.0.x/client/client-configuration-producer.md | 136 +
.../5.0.x/client/client-configuration-reader.md | 104 +
static/reference/5.0.x/config/README.md | 108 +
.../config/reference-configuration-bookkeeper.md | 583 +
.../5.0.x/config/reference-configuration-broker.md | 6809 +
.../5.0.x/config/reference-configuration-client.md | 432 +
.../config/reference-configuration-log4j-shell.md | 37 +
.../5.0.x/config/reference-configuration-log4j.md | 80 +
.../config/reference-configuration-pulsar-proxy.md | 1500 +
.../config/reference-configuration-standalone.md | 6809 +
.../config/reference-configuration-websocket.md | 694 +
.../config/reference-configuration-zookeeper.md | 83 +
static/reference/5.0.x/pulsar-admin/README.md | 16 +
static/reference/5.0.x/pulsar-admin/bookies.md | 320 +
.../reference/5.0.x/pulsar-admin/broker-stats.md | 438 +
static/reference/5.0.x/pulsar-admin/brokers.md | 1768 +
static/reference/5.0.x/pulsar-admin/clusters.md | 2030 +
.../5.0.x/pulsar-admin/functions-worker.md | 438 +
static/reference/5.0.x/pulsar-admin/functions.md | 3610 +
static/reference/5.0.x/pulsar-admin/namespaces.md | 186758 +++++++++++++++++
.../5.0.x/pulsar-admin/ns-isolation-policy.md | 438 +
static/reference/5.0.x/pulsar-admin/packages.md | 574 +
static/reference/5.0.x/pulsar-admin/proxy-stats.md | 74 +
.../5.0.x/pulsar-admin/resource-quotas.md | 138 +
.../reference/5.0.x/pulsar-admin/resourcegroups.md | 320 +
static/reference/5.0.x/pulsar-admin/schemas.md | 438 +
static/reference/5.0.x/pulsar-admin/sinks.md | 1768 +
static/reference/5.0.x/pulsar-admin/sources.md | 1768 +
static/reference/5.0.x/pulsar-admin/tenants.md | 320 +
.../reference/5.0.x/pulsar-admin/topicPolicies.md | 71368 +++++++
static/reference/5.0.x/pulsar-admin/topics.md | 186892 ++++++++++++++++++
.../reference/5.0.x/pulsar-admin/transactions.md | 2030 +
static/reference/5.0.x/pulsar-client/README.md | 12 +
.../reference/5.0.x/pulsar-client/pulsar-client.md | 148 +
static/reference/5.0.x/pulsar-daemon/README.md | 1 +
.../reference/5.0.x/pulsar-daemon/pulsar-daemon.md | 40 +
static/reference/5.0.x/pulsar-perf/README.md | 12 +
static/reference/5.0.x/pulsar-perf/pulsar-perf.md | 292 +
static/reference/5.0.x/pulsar-shell/README.md | 1 +
.../reference/5.0.x/pulsar-shell/pulsar-shell.md | 144 +
static/reference/5.0.x/pulsar/README.md | 1 +
static/reference/5.0.x/pulsar/broker-tool.md | 22 +
static/reference/5.0.x/pulsar/broker.md | 19 +
static/reference/5.0.x/pulsar/compact-topic.md | 16 +
.../5.0.x/pulsar/delete-cluster-metadata.md | 21 +
static/reference/5.0.x/pulsar/functions-worker.md | 14 +
.../5.0.x/pulsar/initialize-cluster-metadata.md | 33 +
.../reference/5.0.x/pulsar/initialize-namespace.md | 17 +
.../initialize-transaction-coordinator-metadata.md | 18 +
static/reference/5.0.x/pulsar/proxy.md | 19 +
static/reference/5.0.x/pulsar/standalone.md | 26 +
static/reference/5.0.x/pulsar/tokens.md | 83 +
static/reference/5.0.x/pulsar/version.md | 13 +
static/reference/5.0.x/pulsar/websocket.md | 13 +
62 files changed, 480760 insertions(+)
diff --git a/static/reference/5.0.x/README.md b/static/reference/5.0.x/README.md
new file mode 100644
index 00000000000..7308b61184c
--- /dev/null
+++ b/static/reference/5.0.x/README.md
@@ -0,0 +1,3 @@
+# Welcome
+
+> Welcome to Pulsar Configuration Docs.
diff --git a/static/reference/5.0.x/_sidebar.md b/static/reference/5.0.x/_sidebar.md
new file mode 100644
index 00000000000..3d40539231a
--- /dev/null
+++ b/static/reference/5.0.x/_sidebar.md
@@ -0,0 +1,61 @@
+- [Configuration]()
+ - [Pulsar](config/)
+ - [BookKeeper](config/reference-configuration-bookkeeper)
+ - [Broker](config/reference-configuration-broker)
+ - [Client](config/reference-configuration-client)
+ - [Log4j](config/reference-configuration-log4j)
+ - [Log4j shell](config/reference-configuration-log4j-shell)
+ - [Standalone](config/reference-configuration-standalone)
+ - [WebSocket](config/reference-configuration-websocket)
+ - [Pulsar proxy](config/reference-configuration-pulsar-proxy)
+ - [ZooKeeper](config/reference-configuration-zookeeper)
+ - [Client](client/)
+ - [Client](client/client-configuration-client)
+ - [Producer](client/client-configuration-producer)
+ - [Consumer](client/client-configuration-consumer)
+ - [Reader](client/client-configuration-reader)
+- [CLI Tools](cli.md)
+ - [pulsar-admin](pulsar-admin/)
+ - [broker-stats](pulsar-admin/broker-stats.md)
+ - [brokers](pulsar-admin/brokers.md)
+ - [bookies](pulsar-admin/bookies.md)
+ - [clusters](pulsar-admin/clusters.md)
+ - [functions](pulsar-admin/functions.md)
+ - [functions-worker](pulsar-admin/functions-worker.md)
+ - [namespaces](pulsar-admin/namespaces.md)
+ - [ns-isolation-policy](pulsar-admin/ns-isolation-policy.md)
+ - [sources](pulsar-admin/sources.md)
+ - [sinks](pulsar-admin/sinks.md)
+ - [topics](pulsar-admin/topics.md)
+ - [topicPolicies](pulsar-admin/topicPolicies.md)
+ - [proxy-stats](pulsar-admin/proxy-stats.md)
+ - [resourcegroups](pulsar-admin/resourcegroups.md)
+ - [transactions](pulsar-admin/transactions.md)
+ - [tenants](pulsar-admin/tenants.md)
+ - [resource-quotas](pulsar-admin/resource-quotas.md)
+ - [schemas](pulsar-admin/schemas.md)
+ - [packages](pulsar-admin/packages.md)
+ - [pulsar](pulsar/)
+ - [broker](pulsar/broker.md)
+ - [broker-tool](pulsar/broker-tool.md)
+ - [compact-topic](pulsar/compact-topic.md)
+ - [tokens](pulsar/tokens.md)
+ - [proxy](pulsar/proxy.md)
+ - [functions-worker](pulsar/functions-worker.md)
+ - [standalone](pulsar/standalone.md)
+ - [initialize-cluster-metadata](pulsar/initialize-cluster-metadata.md)
+ - [delete-cluster-metadata](pulsar/delete-cluster-metadata.md)
+ - [initialize-transaction-coordinator-metadata](pulsar/initialize-transaction-coordinator-metadata.md)
+ - [initialize-namespace](pulsar/initialize-namespace.md)
+ - [version](pulsar/version.md)
+ - [websocket](pulsar/websocket.md)
+ - [pulsar-client](pulsar-client/)
+ - [pulsar-client](pulsar-client/pulsar-client.md)
+ - [pulsar-daemon](pulsar-daemon/)
+ - [pulsar-daemon](pulsar-daemon/pulsar-daemon.md)
+ - [pulsar-perf](pulsar-perf/)
+ - [pulsar-perf](pulsar-perf/pulsar-perf.md)
+ - [pulsar-shell](pulsar-shell/)
+ - [pulsar-shell](pulsar-shell/pulsar-shell.md)
+ - [bookkeeper](bookkeeper/)
+ - [bookkeeper](bookkeeper/bookkeeper.md)
diff --git a/static/reference/5.0.x/bookkeeper/README.md b/static/reference/5.0.x/bookkeeper/README.md
new file mode 100644
index 00000000000..9d1dd4aed50
--- /dev/null
+++ b/static/reference/5.0.x/bookkeeper/README.md
@@ -0,0 +1 @@
+> Docs for `bookkeeper`.
diff --git a/static/reference/5.0.x/bookkeeper/bookkeeper.md b/static/reference/5.0.x/bookkeeper/bookkeeper.md
new file mode 100644
index 00000000000..2c1ab17dff9
--- /dev/null
+++ b/static/reference/5.0.x/bookkeeper/bookkeeper.md
@@ -0,0 +1,94 @@
+# bookkeeper
+A tool for managing BookKeeper.
+
+### Environment variables
+
+The table below lists the environment variables that you can use to configure the bookkeeper tool.
+
+|Variable|Description|Default|
+|---|---|---|
+|BOOKIE_LOG_CONF|Log4j configuration file|conf/log4j2.yaml|
+|BOOKIE_CONF|BookKeeper configuration file|conf/bk_server.conf|
+|BOOKIE_EXTRA_OPTS|Extra options to be passed to the JVM||
+|BOOKIE_EXTRA_CLASSPATH|Extra paths for BookKeeper's classpath||
+|ENTRY_FORMATTER_CLASS|The Java class used to format entries||
+|BOOKIE_PID_DIR|Folder where the BookKeeper server PID file should be stored||
+|BOOKIE_STOP_TIMEOUT|Wait time before forcefully killing the Bookie server instance if attempts to stop it are not successful||
+|BOOKIE_GC_LOG|Gc options to be passed to the jvm||
+
+
+### autorecovery
+Runs an auto-recovery service
+
+Usage
+
+```bash
+bookkeeper autorecovery options
+```
+
+Options
+
+|Flag|Description|Default|
+|---|---|---|
+|`-c`, `--conf`|Configuration for the auto-recovery||
+
+
+### bookie
+Starts up a BookKeeper server (aka bookie)
+
+Usage
+
+```bash
+bookkeeper bookie options
+```
+
+Options
+
+|Flag|Description|Default|
+|---|---|---|
+|`-c`, `--conf`|Configuration for the auto-recovery||
+|-readOnly|Force start a read-only bookie server|false|
+|-withAutoRecovery|Start auto-recovery service bookie server|false|
+
+
+### localbookie
+Runs a test ensemble of N bookies locally
+
+Usage
+
+```bash
+bookkeeper localbookie N
+```
+
+### upgrade
+Upgrade the bookie’s filesystem
+
+Usage
+
+```bash
+bookkeeper upgrade options
+```
+
+Options
+
+|Flag|Description|Default|
+|---|---|---|
+|`-c`, `--conf`|Configuration for the auto-recovery||
+|`-u`, `--upgrade`|Upgrade the bookie’s directories||
+
+
+### shell
+Run shell for admin commands. To see a full listing of those commands, run bookkeeper shell without an argument.
+
+Usage
+
+```bash
+bookkeeper shell
+```
+
+Example
+
+```bash
+bookkeeper shell bookiesanity
+```
+
diff --git a/static/reference/5.0.x/cli.md b/static/reference/5.0.x/cli.md
new file mode 100644
index 00000000000..520d14e5b03
--- /dev/null
+++ b/static/reference/5.0.x/cli.md
@@ -0,0 +1,3 @@
+# Welcome
+
+> Welcome to Pulsar CLI Tools Docs.
diff --git a/static/reference/5.0.x/client/README.md b/static/reference/5.0.x/client/README.md
new file mode 100644
index 00000000000..71df588c6f8
--- /dev/null
+++ b/static/reference/5.0.x/client/README.md
@@ -0,0 +1,28 @@
+## Client Configurations
+
+If you create a Java client, producer, consumer, or reader, you can use the `loadConf` configurations.
+
+- [Client configurations](/@pulsar:version_reference@/client/client-configuration-client)
+- [Producer configurations](/@pulsar:version_reference@/client/client-configuration-producer)
+- [Consumer configurations](/@pulsar:version_reference@/client/client-configuration-consumer)
+- [Reader configurations](/@pulsar:version_reference@/client/client-configuration-reader)
+
+### Set client memory allocator configs using Java system properties
+
+You can set the client memory allocator configurations through Java properties.<br />
+
+| Property | Type | <div style="width: 110pt"> Description </div> [...]
+|-----------------------------------------|--------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [...]
+| `pulsar.allocator.pooled` | String | If set to `true`, the client uses a direct memory pool. <br /> If set to `false`, the client uses a heap memory without pool. [...]
+| `pulsar.allocator.exit_on_oom` | String | Whether to exit the JVM when OOM happens. [...]
+| `pulsar.allocator.leak_detection` | String | The leak detection policy for Pulsar bytebuf allocator. <li> **Disabled**: No leak detection and no overhead. </li> <li> **Simple**: Instruments 1% of the allocated buffer to track for leaks. </li> <li> **Advanced**: Instruments 1% of the allocated buffer to track for leaks, reporting stack traces of places where the buffer is used. </li> <li> **Paranoid**: Instruments 100% of the allocated buffer to track for leaks, reporting stack tr [...]
+| `pulsar.allocator.out_of_memory_policy` | String | When an OOM occurs, the client throws an exception or fallbacks to heap. [...]
+
+**Example**
+
+```conf
+Dpulsar.allocator.pooled=true
+Dpulsar.allocator.exit_on_oom=false
+Dpulsar.allocator.leak_detection=Disabled
+Dpulsar.allocator.out_of_memory_policy=ThrowException
+```
diff --git a/static/reference/5.0.x/client/client-configuration-client.md b/static/reference/5.0.x/client/client-configuration-client.md
new file mode 100644
index 00000000000..be0bcc58a8e
--- /dev/null
+++ b/static/reference/5.0.x/client/client-configuration-client.md
@@ -0,0 +1,432 @@
+# Client
+
+## Required
+### serviceUrl
+Pulsar cluster HTTP URL to connect to a broker.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+## Optional
+### authParamMap
+Authentication map of the client.
+
+**Type**: `java.util.Map`
+
+**Default**: `null`
+
+### authParams
+Authentication parameter of the client.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### authPluginClassName
+Class name of authentication plugin of the client.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### authentication
+Authentication settings of the client.
+
+**Type**: `org.apache.pulsar.client.api.Authentication`
+
+**Default**: `null`
+
+### autoCertRefreshSeconds
+Seconds of auto refreshing certificate.
+
+**Type**: `int`
+
+**Default**: `300`
+
+### concurrentLookupRequest
+The number of concurrent lookup requests that can be sent on each broker connection. Setting a maximum prevents overloading a broker.
+
+**Type**: `int`
+
+**Default**: `5000`
+
+### connectionMaxIdleSeconds
+Release the connection if it is not used for more than [connectionMaxIdleSeconds] seconds. If [connectionMaxIdleSeconds] < 0, disables the feature that auto-releases the idle connections
+
+**Type**: `int`
+
+**Default**: `60`
+
+### connectionTimeoutMs
+Duration of waiting for a connection to a broker to be established. If the duration passes without a response from a broker, the connection attempt is dropped.
+
+**Type**: `int`
+
+**Default**: `10000`
+
+### connectionsPerBroker
+Number of connections established between the client and each Broker. A value of 0 means to disable connection pooling.
+
+**Type**: `int`
+
+**Default**: `1`
+
+### description
+The extra description of the client version. The length cannot exceed 64.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### dnsLookupBindAddress
+The Pulsar client dns lookup bind address, default behavior is bind on 0.0.0.0
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### dnsLookupBindPort
+The Pulsar client dns lookup bind port, takes effect when dnsLookupBindAddress is configured, default value is 0.
+
+**Type**: `int`
+
+**Default**: `0`
+
+### dnsServerAddresses
+The Pulsar client dns lookup server address
+
+**Type**: `java.util.List`
+
+**Default**: `[]`
+
+### enableBusyWait
+Whether to enable BusyWait for EpollEventLoopGroup.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+### enableTransaction
+Whether to enable transaction.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+### initialBackoffIntervalNanos
+Initial backoff interval (in nanosecond).
+
+**Type**: `long`
+
+**Default**: `100000000`
+
+### keepAliveIntervalSeconds
+Seconds of keeping alive interval for each client broker connection.
+
+**Type**: `int`
+
+**Default**: `30`
+
+### listenerName
+Listener name for lookup. Clients can use listenerName to choose one of the listeners as the service URL to create a connection to the broker as long as the network is accessible. "advertisedListeners" must be enabled on the broker side.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### lookupTimeoutMs
+Client lookup timeout (in milliseconds).
+
+**Type**: `long`
+
+**Default**: `-1`
+
+### maxBackoffIntervalNanos
+Max backoff interval (in nanosecond).
+
+**Type**: `long`
+
+**Default**: `60000000000`
+
+### maxLookupRedirects
+Maximum times of redirected lookup requests.
+
+**Type**: `int`
+
+**Default**: `20`
+
+### maxLookupRequest
+Maximum number of lookup requests allowed on each broker connection to prevent overloading a broker.
+
+**Type**: `int`
+
+**Default**: `50000`
+
+### maxNumberOfRejectedRequestPerConnection
+Maximum number of rejected requests of a broker in a certain time frame (60 seconds) after the current connection is closed and the client creating a new connection to connect to a different broker.
+
+**Type**: `int`
+
+**Default**: `50`
+
+### memoryLimitBytes
+Limit of client memory usage (in byte). The 64M default can guarantee a high producer throughput.
+
+**Type**: `long`
+
+**Default**: `67108864`
+
+### numIoThreads
+Number of IO threads.
+
+**Type**: `int`
+
+**Default**: `1`
+
+### numListenerThreads
+Number of consumer listener threads.
+
+**Type**: `int`
+
+**Default**: `1`
+
+### operationTimeoutMs
+Client operation timeout (in milliseconds).
+
+**Type**: `long`
+
+**Default**: `30000`
+
+### originalPrincipal
+Original principal for proxy authentication scenarios.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### proxyProtocol
+Protocol of proxy service. proxyServiceUrl and proxyProtocol must be mutually inclusive.
+
+**Type**: `org.apache.pulsar.client.api.ProxyProtocol`
+
+**Default**: `null`
+
+### proxyServiceUrl
+URL of proxy service. proxyServiceUrl and proxyProtocol must be mutually inclusive.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### readTimeoutMs
+Maximum read time of a request.
+
+**Type**: `int`
+
+**Default**: `60000`
+
+### requestTimeoutMs
+Maximum duration for completing a request.
+
+**Type**: `int`
+
+**Default**: `60000`
+
+### serviceUrlProvider
+The implementation class of ServiceUrlProvider used to generate ServiceUrl.
+
+**Type**: `org.apache.pulsar.client.api.ServiceUrlProvider`
+
+**Default**: `null`
+
+### serviceUrlQuarantineInitDurationMs
+The initial duration (in milliseconds) to quarantine endpoints that fail to connect. A value of 0 means don't quarantine any endpoints even if they fail.
+
+**Type**: `long`
+
+**Default**: `60000`
+
+### serviceUrlQuarantineMaxDurationMs
+The max duration (in milliseconds) to quarantine endpoints that fail to connect. A value of 0 means don't quarantine any endpoints even if they fail.
+
+**Type**: `long`
+
+**Default**: `86400000`
+
+### socks5ProxyAddress
+Address of SOCKS5 proxy.
+
+**Type**: `java.net.InetSocketAddress`
+
+**Default**: `null`
+
+### socks5ProxyPassword
+Password of SOCKS5 proxy.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### socks5ProxyScope
+Selector that controls which connections go through the SOCKS5 proxy. BINARY_ONLY (default for PulsarClient) only routes Pulsar binary protocol connections; HTTP_ONLY only routes HTTP/HTTPS traffic (HTTP lookups, failover HTTP clients, admin REST); BOTH routes both. This preserves backward compatibility with the pre-existing behavior where the SOCKS5 proxy on PulsarClient only applied to the binary protocol.
+
+**Type**: `org.apache.pulsar.client.api.Socks5ProxyScope`
+
+**Default**: `BINARY_ONLY`
+
+### socks5ProxyUsername
+User name of SOCKS5 proxy.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### sslFactoryPlugin
+SSL Factory Plugin class to provide SSLEngine and SSLContext objects. The default class used is DefaultPulsarSslFactory.
+
+**Type**: `java.lang.String`
+
+**Default**: `org.apache.pulsar.common.util.DefaultPulsarSslFactory`
+
+### sslFactoryPluginParams
+SSL Factory plugin configuration parameters.
+
+**Type**: `java.lang.String`
+
+**Default**: ``
+
+### sslProvider
+The TLS provider used by an internal client to authenticate with other Pulsar brokers.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### statsIntervalSeconds
+Interval to print client stats (in seconds).
+
+**Type**: `long`
+
+**Default**: `60`
+
+### tlsAllowInsecureConnection
+Whether the client accepts untrusted TLS certificates from the broker.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+### tlsCertificateFilePath
+Path to the TLS certificate file.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### tlsCiphers
+Set of TLS Ciphers.
+
+**Type**: `java.util.Set`
+
+**Default**: `[]`
+
+### tlsHostnameVerificationEnable
+Whether the hostname is validated when the client creates a TLS connection with brokers.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+### tlsKeyFilePath
+Path to the TLS key file.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### tlsKeyStorePassword
+Password of TLS KeyStore.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### tlsKeyStorePath
+Path of TLS KeyStore.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### tlsKeyStoreType
+TLS KeyStore type configuration.
+
+**Type**: `java.lang.String`
+
+**Default**: `JKS`
+
+### tlsProtocols
+Protocols of TLS.
+
+**Type**: `java.util.Set`
+
+**Default**: `[]`
+
+### tlsTrustCertsFilePath
+Path to the trusted TLS certificate file.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### tlsTrustStorePassword
+Password of TLS TrustStore.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### tlsTrustStorePath
+Path of TLS TrustStore.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### tlsTrustStoreType
+TLS TrustStore type configuration. You need to set this configuration when client authentication is required.
+
+**Type**: `java.lang.String`
+
+**Default**: `JKS`
+
+### tracingEnabled
+Whether to enable OpenTelemetry distributed tracing. When enabled, tracing interceptors are automatically added to producers and consumers.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+### useKeyStoreTls
+Set TLS using KeyStore way.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+### useTcpNoDelay
+Whether to use TCP NoDelay option.
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+### useTls
+Whether to use TLS.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+
diff --git a/static/reference/5.0.x/client/client-configuration-consumer.md b/static/reference/5.0.x/client/client-configuration-consumer.md
new file mode 100644
index 00000000000..d8153acf06d
--- /dev/null
+++ b/static/reference/5.0.x/client/client-configuration-consumer.md
@@ -0,0 +1,292 @@
+# Consumer
+
+## Required
+### topicNames
+Topic name
+
+**Type**: `java.util.Set`
+
+**Default**: `[]`
+
+## Optional
+### ackTimeoutMillis
+Timeout of unacked messages
+
+**Type**: `long`
+
+**Default**: `0`
+
+### ackTimeoutRedeliveryBackoff
+Interface for the custom message ack-timeout policy. You can specify `RedeliveryBackoff` for a consumer.
+
+**Type**: `org.apache.pulsar.client.api.RedeliveryBackoff`
+
+**Default**: `null`
+
+### acknowledgementsGroupTimeMicros
+Group a consumer acknowledgment for a specified time.
+
+By default, a consumer uses 100ms grouping time to send out acknowledgments to a broker.
+
+Setting a group time of 0 sends out acknowledgments immediately.
+
+A longer ack group time is more efficient at the expense of a slight increase in message re-deliveries after a failure.
+
+**Type**: `long`
+
+**Default**: `100000`
+
+### autoAckOldestChunkedMessageOnQueueFull
+Whether to automatically acknowledge pending chunked messages when the threshold of `maxPendingChunkedMessage` is reached. If set to `false`, these messages will be redelivered by their broker.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+### autoUpdatePartitions
+If `autoUpdatePartitions` is enabled, a consumer subscribes to partition increasement automatically.
+
+**Note**: this is only for partitioned consumers.
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+### consumerName
+Consumer name
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### cryptoFailureAction
+Consumer should take action when it receives a message that can not be decrypted.
+* **FAIL**: this is the default option to fail messages until crypto succeeds.
+* **DISCARD**: silently acknowledge and not deliver message to an application.
+* **CONSUME**: deliver encrypted messages to applications. It is the application's responsibility to decrypt the message.
+
+The decompression of message fails.
+
+If messages contain batch messages, a client is not able to retrieve individual messages in batch.
+
+Delivered encrypted message contains {@link EncryptionContext} which contains encryption and compression information in it using which application can decrypt consumed message payload.
+
+**Type**: `org.apache.pulsar.client.api.ConsumerCryptoFailureAction`
+
+**Default**: `null`
+
+### deadLetterPolicy
+Dead letter policy for consumers.
+
+By default, some messages are probably redelivered many times, even to the extent that it never stops.
+
+By using the dead letter mechanism, messages have the max redelivery count. **When exceeding the maximum number of redeliveries, messages are sent to the Dead Letter Topic and acknowledged automatically**.
+
+You can enable the dead letter mechanism by setting `deadLetterPolicy`.
+
+**Example**
+```java
+client.newConsumer()
+.deadLetterPolicy(DeadLetterPolicy.builder().maxRedeliverCount(10).build())
+.subscribe();
+```
+Default dead letter topic name is `{TopicName}-{Subscription}-DLQ`.
+
+To set a custom dead letter topic name:
+```java
+client.newConsumer()
+.deadLetterPolicy(DeadLetterPolicy.builder().maxRedeliverCount(10)
+.deadLetterTopic("your-topic-name").build())
+.subscribe();
+```
+When specifying the dead letter policy while not specifying `ackTimeoutMillis`, you can set the ack timeout to 30000 millisecond.
+
+**Type**: `org.apache.pulsar.client.api.DeadLetterPolicy`
+
+**Default**: `null`
+
+### expireTimeOfIncompleteChunkedMessageMillis
+The time interval to expire incomplete chunks if a consumer fails to receive all the chunks in the specified time period. The default value is 1 minute.
+
+**Type**: `long`
+
+**Default**: `60000`
+
+### maxAcknowledgmentGroupSize
+Group a consumer acknowledgment for the number of messages.
+
+**Type**: `int`
+
+**Default**: `1000`
+
+### maxPendingChunkedMessage
+The maximum size of a queue holding pending chunked messages. When the threshold is reached, the consumer drops pending messages to optimize memory utilization.
+
+**Type**: `int`
+
+**Default**: `10`
+
+### maxTotalReceiverQueueSizeAcrossPartitions
+The max total receiver queue size across partitions.
+
+This setting reduces the receiver queue size for individual partitions if the total receiver queue size exceeds this value.
+
+**Type**: `int`
+
+**Default**: `50000`
+
+### negativeAckPrecisionBitCnt
+The redelivery time precision bit count. The lower bits of the redelivery time will be trimmed to reduce the memory occupation.
+The default value is 8, which means the redelivery time will be bucketed by 256ms, the redelivery time could be earlier (no later) than the expected time, but no more than 256ms.
+If set to k, the redelivery time will be bucketed by 2^k ms.
+If the value is 0, the redelivery time will be accurate to ms.
+
+**Type**: `int`
+
+**Default**: `8`
+
+### negativeAckRedeliveryBackoff
+Interface for the custom message negative-acknowledgment policy. You can specify `RedeliveryBackoff` for a consumer.
+
+**Type**: `org.apache.pulsar.client.api.RedeliveryBackoff`
+
+**Default**: `null`
+
+### negativeAckRedeliveryDelayMicros
+Delay to wait before redelivering messages that failed to be processed.
+
+When an application uses {@link Consumer#negativeAcknowledge(Message)}, failed messages are redelivered after a fixed timeout.
+
+**Type**: `long`
+
+**Default**: `60000000`
+
+### patternAutoDiscoveryPeriod
+Topic auto discovery period when using a pattern for topic's consumer.
+
+The default value is 1 minute, with a minimum of 1 second.
+
+**Type**: `int`
+
+**Default**: `60`
+
+### priorityLevel
+Priority level for a consumer to which a broker gives more priority while dispatching messages in Shared subscription type.
+
+The broker follows descending priorities. For example, 0=max-priority, 1, 2,...
+
+In Shared subscription type, the broker **first dispatches messages to the max priority level consumers if they have permits**. Otherwise, the broker considers next priority level consumers.
+
+**Example 1**
+If a subscription has consumerA with `priorityLevel` 0 and consumerB with `priorityLevel` 1, then the broker **only dispatches messages to consumerA until it runs out permits** and then starts dispatching messages to consumerB.
+
+**Example 2**
+Consumer Priority, Level, Permits
+C1, 0, 2
+C2, 0, 1
+C3, 0, 1
+C4, 1, 2
+C5, 1, 1
+
+Order in which a broker dispatches messages to consumers is: C1, C2, C3, C1, C4, C5, C4.
+
+**Type**: `int`
+
+**Default**: `0`
+
+### properties
+A name or value property of this consumer.
+
+`properties` is application defined metadata attached to a consumer.
+
+When getting a topic stats, associate this metadata with the consumer stats for easier identification.
+
+**Type**: `java.util.SortedMap`
+
+**Default**: `{}`
+
+### readCompacted
+If enabling `readCompacted`, a consumer reads messages from a compacted topic rather than reading a full message backlog of a topic.
+
+A consumer only sees the latest value for each key in the compacted topic, up until reaching the point in the topic message when compacting backlog. Beyond that point, send messages as normal.
+
+Only enabling `readCompacted` on subscriptions to persistent topics, which have a single active consumer (like failure or exclusive subscriptions).
+
+Attempting to enable it on subscriptions to non-persistent topics or on shared subscriptions leads to a subscription call throwing a `PulsarClientException`.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+### receiverQueueSize
+Size of a consumer's receiver queue.
+
+For example, the number of messages accumulated by a consumer before an application calls `Receive`.
+
+A value higher than the default value increases consumer throughput, though at the expense of more memory utilization.
+
+**Type**: `int`
+
+**Default**: `1000`
+
+### regexSubscriptionMode
+When subscribing to a topic using a regular expression, you can pick a certain type of topics.
+
+* **PersistentOnly**: only subscribe to persistent topics.
+* **NonPersistentOnly**: only subscribe to non-persistent topics.
+* **AllTopics**: subscribe to both persistent and non-persistent topics.
+
+**Type**: `org.apache.pulsar.client.api.RegexSubscriptionMode`
+
+**Default**: `PersistentOnly`
+
+### replicateSubscriptionState
+If `replicateSubscriptionState` is enabled, a subscription state is replicated to geo-replicated clusters.
+
+**Type**: `java.lang.Boolean`
+
+**Default**: `null`
+
+### subscriptionInitialPosition
+Initial position at which to set cursor when subscribing to a topic at first time.
+
+**Type**: `org.apache.pulsar.client.api.SubscriptionInitialPosition`
+
+**Default**: `Latest`
+
+### subscriptionName
+Subscription name
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### subscriptionType
+Subscription type.
+Four subscription types are available:
+* Exclusive
+* Failover
+* Shared
+* Key_Shared
+
+**Type**: `org.apache.pulsar.client.api.SubscriptionType`
+
+**Default**: `Exclusive`
+
+### tickDurationMillis
+Granularity of the ack-timeout redelivery.
+
+Using an higher `tickDurationMillis` reduces the memory overhead to track messages when setting ack-timeout to a bigger value (for example, 1 hour).
+
+**Type**: `long`
+
+**Default**: `1000`
+
+### topicsPattern
+The regexp for the topic name(not contains partition suffix).
+
+**Type**: `java.util.regex.Pattern`
+
+**Default**: `null`
+
+
diff --git a/static/reference/5.0.x/client/client-configuration-producer.md b/static/reference/5.0.x/client/client-configuration-producer.md
new file mode 100644
index 00000000000..f302dd80902
--- /dev/null
+++ b/static/reference/5.0.x/client/client-configuration-producer.md
@@ -0,0 +1,136 @@
+# Producer
+
+## Required
+### topicName
+Topic name
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+## Optional
+### batchingEnabled
+Enable batching of messages.
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+### batchingMaxMessages
+The maximum number of messages permitted in a batch.
+
+**Type**: `int`
+
+**Default**: `1000`
+
+### batchingMaxPublishDelayMicros
+Batching time period of sending messages.
+
+**Type**: `long`
+
+**Default**: `1000`
+
+### blockIfQueueFull
+If it is set to `true`, when the outgoing message queue is full, the `Send` and `SendAsync` methods of producer block, rather than failing and throwing errors.
+If it is set to `false`, when the outgoing message queue is full, the `Send` and `SendAsync` methods of producer fail and `ProducerQueueIsFullError` exceptions occur.
+
+The `MaxPendingMessages` parameter determines the size of the outgoing message queue.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+### chunkingEnabled
+Enable chunking of messages.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+### compressionType
+Message data compression type used by a producer.
+Available options:
+* [LZ4](https://github.com/lz4/lz4)
+* [ZLIB](https://zlib.net/)
+* [ZSTD](https://facebook.github.io/zstd/)
+* [SNAPPY](https://google.github.io/snappy/)
+
+**Type**: `org.apache.pulsar.client.api.CompressionType`
+
+**Default**: `NONE`
+
+### cryptoFailureAction
+Producer should take action when encryption fails.
+* **FAIL**: if encryption fails, unencrypted messages fail to send.
+* **SEND**: if encryption fails, unencrypted messages are sent.
+
+**Type**: `org.apache.pulsar.client.api.ProducerCryptoFailureAction`
+
+**Default**: `FAIL`
+
+### hashingScheme
+Hashing function determining the partition where you publish a particular message (partitioned topics only).
+Available options are as follows:
+* `pulsar.JavastringHash`: the equivalent of `string.hashCode()` in Java
+* `pulsar.Murmur3_32Hash`: applies the [Murmur3](https://en.wikipedia.org/wiki/MurmurHash) hashing function
+* `pulsar.BoostHash`: applies the hashing function from C++'s [Boost](https://www.boost.org/doc/libs/1_62_0/doc/html/hash.html) library
+
+**Type**: `org.apache.pulsar.client.api.HashingScheme`
+
+**Default**: `JavaStringHash`
+
+### initialSubscriptionName
+Use this configuration to automatically create an initial subscription when creating a topic. If this field is not set, the initial subscription is not created.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### maxPendingMessages
+The maximum size of a queue holding pending messages.
+
+For example, a message waiting to receive an acknowledgment from a [broker](https://pulsar.apache.org/docs/reference-terminology#broker).
+
+By default, when the queue is full, all calls to the `Send` and `SendAsync` methods fail **unless** you set `BlockIfQueueFull` to `true`.
+
+**Type**: `int`
+
+**Default**: `0`
+
+### maxPendingMessagesAcrossPartitions
+The maximum number of pending messages across partitions.
+
+Use the setting to lower the max pending messages for each partition ({@link #setMaxPendingMessages(int)}) if the total number exceeds the configured value.
+
+**Type**: `int`
+
+**Default**: `0`
+
+### messageRoutingMode
+Message routing logic for producers on [partitioned topics](https://pulsar.apache.org/docs/concepts-architecture-overview#partitioned-topics).
+Apply the logic only when setting no key on messages.
+Available options are as follows:
+* `pulsar.RoundRobinDistribution`: round robin
+* `pulsar.UseSinglePartition`: publish all messages to a single partition
+* `pulsar.CustomPartition`: a custom partitioning scheme
+
+**Type**: `org.apache.pulsar.client.api.MessageRoutingMode`
+
+**Default**: `null`
+
+### producerName
+Producer name
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### sendTimeoutMs
+Message send timeout in ms.
+If a message is not acknowledged by a server before the `sendTimeout` expires, an error occurs.
+
+**Type**: `long`
+
+**Default**: `30000`
+
+
diff --git a/static/reference/5.0.x/client/client-configuration-reader.md b/static/reference/5.0.x/client/client-configuration-reader.md
new file mode 100644
index 00000000000..422a3374ac3
--- /dev/null
+++ b/static/reference/5.0.x/client/client-configuration-reader.md
@@ -0,0 +1,104 @@
+# Reader
+
+## Required
+### topicNames
+Topic name
+
+**Type**: `java.util.Set`
+
+**Default**: `[]`
+
+## Optional
+### cryptoFailureAction
+Consumer should take action when it receives a message that can not be decrypted.
+* **FAIL**: this is the default option to fail messages until crypto succeeds.
+* **DISCARD**: silently acknowledge and not deliver message to an application.
+* **CONSUME**: deliver encrypted messages to applications. It is the application's responsibility to decrypt the message.
+
+The message decompression fails.
+
+If messages contain batch messages, a client is not able to retrieve individual messages in batch.
+
+Delivered encrypted message contains {@link EncryptionContext} which contains encryption and compression information in it using which application can decrypt consumed message payload. It cannot be set together with a {@link ReaderDecryptFailListener}, and if a ReaderDecryptFailListener is set,
+the application is responsible for handling decryption failures.
+
+**Type**: `org.apache.pulsar.client.api.ConsumerCryptoFailureAction`
+
+**Default**: `null`
+
+### cryptoKeyReader
+Interface that abstracts the access to a key store.
+
+**Type**: `org.apache.pulsar.client.api.CryptoKeyReader`
+
+**Default**: `null`
+
+### readCompacted
+If enabling `readCompacted`, a consumer reads messages from a compacted topic rather than a full message backlog of a topic.
+
+A consumer only sees the latest value for each key in the compacted topic, up until reaching the point in the topic message when compacting backlog. Beyond that point, send messages as normal.
+
+`readCompacted` can only be enabled on subscriptions to persistent topics, which have a single active consumer (for example, failure or exclusive subscriptions).
+
+Attempting to enable it on subscriptions to non-persistent topics or on shared subscriptions leads to a subscription call throwing a `PulsarClientException`.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+### readerDecryptFailListener
+A listener that is called for encrypted message received and decrypt fail.
+
+**Type**: `org.apache.pulsar.client.api.ReaderDecryptFailListener`
+
+**Default**: `null`
+
+### readerListener
+A listener that is called for message received.
+
+**Type**: `org.apache.pulsar.client.api.ReaderListener`
+
+**Default**: `null`
+
+### readerName
+Reader name
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### receiverQueueSize
+Size of a consumer's receiver queue.
+
+For example, the number of messages that can be accumulated by a consumer before an application calls `Receive`.
+
+A value higher than the default value increases consumer throughput, though at the expense of more memory utilization.
+
+**Type**: `int`
+
+**Default**: `1000`
+
+### resetIncludeHead
+If set to true, the first message to be returned is the one specified by `messageId`.
+
+If set to false, the first message to be returned is the one next to the message specified by `messageId`.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+### subscriptionName
+Subscription name
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### subscriptionRolePrefix
+Prefix of subscription role.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+
diff --git a/static/reference/5.0.x/config/README.md b/static/reference/5.0.x/config/README.md
new file mode 100644
index 00000000000..958ce332782
--- /dev/null
+++ b/static/reference/5.0.x/config/README.md
@@ -0,0 +1,108 @@
+## Pulsar configurations
+
+You can manage Pulsar configurations through configuration files in
+the [`conf`](https://github.com/apache/pulsar/tree/master/conf) directory of a Pulsar installation.
+
+- [BookKeeper](/@pulsar:version_reference@/config/reference-configuration-bookkeeper)
+- [Broker](/@pulsar:version_reference@/config/reference-configuration-broker)
+- [Client](/@pulsar:version_reference@/config/reference-configuration-client)
+- [Log4j](/@pulsar:version_reference@/config/reference-configuration-log4j)
+- [Log4j shell](/@pulsar:version_reference@/config/reference-configuration-log4j-shell)
+- [Standalone](/@pulsar:version_reference@/config/reference-configuration-standalone)
+- [WebSocket](/@pulsar:version_reference@/config/reference-configuration-websocket)
+- [Pulsar proxy](/@pulsar:version_reference@/config/reference-configuration-pulsar-proxy)
+- [ZooKeeper](/@pulsar:version_reference@/config/reference-configuration-zookeeper)
+
+### Override client configurations
+
+If you want to override the configurations of clients internal to brokers, websockets, and proxies, you can use the
+following prefix.
+
+| Prefix | Description |
+|---------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| brokerClient_ | Configure **all** the Pulsar Clients and Pulsar Admin Clients of brokers, websockets, and proxies. These configurations are applied after hard-coded configurations and before the client configurations named in this site. |
+| bookkeeper_ | Configure the broker's BookKeeper clients used by managed ledgers and the BookkeeperPackagesStorage bookkeeper client. Takes precedence over most other configuration values. |
+
+> Notes:
+> * This override feature only applies to Pulsar 2.10.1 and later versions.
+> * When running the function worker within the broker, you have to configure those clients by using
+ the `functions_worker.yml` file. These prefixed configurations do not apply to any of those clients.
+
+### Set specific configurations using Java system property
+
+You can set specific configurations through Java properties.
+
+| **Property** | **Description** |
+|--------------------|---------------------------------------------------------------------------------------------------------------|
+| pulsar.enableUring | Use `io_uring` instead of `epoll` as network IO mode. `-Dpulsar.enableUring=1` means this feature is enabled. |
+
+## Broker load balancing configurations
+
+Below is a brief summary of configurations for broker load balancing.
+
+For detailed descriptions of each configuration,
+see [Broker load balancing | Configurations](/reference/#/@pulsar:version_reference@/config/reference-configuration-broker).
+
+> Note
+> Configurations with an asterisk (*) are only available in the extensible load balancer.
+
+### Broker load data
+
+- loadBalancerReportUpdateMinIntervalMillis
+- loadBalancerReportUpdateThresholdPercentage
+- loadBalancerReportUpdateMaxIntervalMinutes
+- loadBalancerBandwithInResourceWeight
+- loadBalancerBandwithOutResourceWeight
+- loadBalancerCPUResourceWeight
+- loadBalancerMemoryResourceWeight
+- loadBalancerDirectMemoryResourceWeight
+- loadBalancerHistoryResourcePercentage
+
+### TopK bundle load data
+
+- loadBalancerReportUpdateMinIntervalMillis
+- statsUpdateFrequencyInSecs
+- loadBalancerMaxNumberOfBundlesInBundleLoadReport*
+
+### Bundle-broker assignment
+
+- loadBalancerAverageResourceUsageDifferenceThresholdPercentage
+
+### Bundle ownership system topic (ServiceUnitStateChannel)
+
+- loadBalancerServiceUnitStateTombstoneDelayTimeInSeconds*
+
+### Bundle unloading
+
+- loadBalancerEnabled
+- loadBalancerSheddingEnabled
+- loadBalancerSheddingIntervalMinutes
+- loadBalancerSheddingGracePeriodMinutes
+- loadBalancerBrokerOverloadedThresholdPercentage
+- loadBalancerLoadSheddingStrategy. The default value
+ is [org.apache.pulsar.broker.loadbalance.impl.ThresholdShedder](https://github.com/apache/pulsar/blob/782e91fe327efe2c9c9107d6c679c2837d43935b/conf/broker.conf#L1324).
+ Available values are:
+ - `org.apache.pulsar.broker.loadbalance.impl.ThresholdShedder`
+ - `org.apache.pulsar.broker.loadbalance.impl.UniformLoadShedder`
+ - `org.apache.pulsar.broker.loadbalance.impl.OverloadShedder`
+ - `org.apache.pulsar.broker.loadbalance.extensions.scheduler.TransferShedder`
+- loadBalancerTransferEnabled*
+- loadBalancerBrokerLoadTargetStd*
+- loadBalancerSheddingConditionHitCountThreshold*
+- loadBalancerMaxNumberOfBrokerSheddingPerCycle*
+- loadBalanceSheddingDelayInSeconds*
+- loadBalancerBrokerLoadDataTTLInSeconds*
+
+### Bundle splitting
+
+- loadBalancerEnabled
+- loadBalancerAutoBundleSplitEnabled
+- defaultNamespaceBundleSplitAlgorithm
+- loadBalancerNamespaceBundleMaxTopics
+- loadBalancerNamespaceBundleMaxSessions
+- loadBalancerNamespaceBundleMaxMsgRate
+- loadBalancerNamespaceBundleMaxBandwidthMbytes
+- loadBalancerNamespaceMaximumBundles
+- loadBalancerSplitIntervalMinutes*
+- loadBalancerNamespaceBundleSplitConditionHitCountThreshold*
+- loadBalancerMaxNumberOfBundlesToSplitPerCycle*
diff --git a/static/reference/5.0.x/config/reference-configuration-bookkeeper.md b/static/reference/5.0.x/config/reference-configuration-bookkeeper.md
new file mode 100644
index 00000000000..28e85dcaf6c
--- /dev/null
+++ b/static/reference/5.0.x/config/reference-configuration-bookkeeper.md
@@ -0,0 +1,583 @@
+# BookKeeper
+
+BookKeeper is a replicated log storage system that Pulsar uses for durable storage of all messages.
+
+### bookiePort
+
+The port on which the bookie server listens.
+
+**Default**: 3181
+
+### allowLoopback
+
+Whether the bookie is allowed to use a loopback interface as its primary interface (that is the interface used to establish its identity). By default, loopback interfaces are not allowed to work as the primary interface. Using a loopback interface as the primary interface usually indicates a configuration error. For example, it’s fairly common in some VPS setups to not configure a hostname or to have the hostname resolve to `127.0.0.1`. If this is the case, then all bookies in the cluste [...]
+
+**Default**: false
+
+### listeningInterface
+
+The network interface on which the bookie listens. By default, the bookie listens on all interfaces.
+
+**Default**: eth0
+
+### advertisedAddress
+
+Configure a specific hostname or IP address that the bookie should use to advertise itself to clients. By default, the bookie advertises either its own IP address or hostname according to the `listeningInterface` and `useHostNameAsBookieID` settings.
+
+**Default**: N/A
+
+### allowMultipleDirsUnderSameDiskPartition
+
+Configure the bookie to enable/disable multiple ledger/index/journal directories in the same filesystem disk partition.
+
+**Default**: false
+
+### minUsableSizeForIndexFileCreation
+
+The minimum safe usable size available in index directory for bookie to create index files while replaying journal at the time of bookie starts in Readonly Mode (in bytes).
+
+**Default**: 1073741824
+
+### journalDirectory
+
+The directory where BookKeeper outputs its write-ahead log (WAL).
+
+**Default**: data/bookkeeper/journal
+
+### journalDirectories
+
+Directories that BookKeeper outputs its write ahead log. Multiple directories are available, being separated by `,`. For example: `journalDirectories=/tmp/bk-journal1,/tmp/bk-journal2`. If `journalDirectories` is set, the bookies skip `journalDirectory` and use this setting directory.
+
+**Default**: /tmp/bk-journal
+
+### ledgerDirectories
+
+The directory where BookKeeper outputs ledger snapshots. This could define multiple directories to store snapshots separated by `,`, for example `ledgerDirectories=/tmp/bk1-data,/tmp/bk2-data`. Ideally, ledger dirs and the journal dir are each in a different device, which reduces the contention between random I/O and sequential write. It is possible to run with a single disk, but performance will be significantly lower.
+
+**Default**: data/bookkeeper/ledgers
+
+### ledgerManagerType
+
+The type of ledger manager used to manage how ledgers are stored, managed, and garbage collected. See [BookKeeper Internals](https://bookkeeper.apache.org/docs/next/getting-started/concepts) for more info.
+
+**Default**: hierarchical
+
+### zkLedgersRootPath
+
+The root ZooKeeper path used to store ledger metadata. This parameter is used by the ZooKeeper-based ledger manager as a root znode to store all ledgers.
+
+**Default**: /ledgers
+
+### ledgerStorageClass
+
+Ledger storage implementation class
+
+**Default**: org.apache.bookkeeper.bookie.storage.ldb.DbLedgerStorage
+
+### entryLogFilePreallocationEnabled
+
+Enable or disable entry logger preallocation
+
+**Default**: true
+
+### logSizeLimit
+
+Max file size of the entry logger, in bytes. A new entry log file will be created when the old one reaches the file size limitation.
+
+**Default**: 1073741824
+
+### minorCompactionThreshold
+
+Threshold of minor compaction. Entry log files whose remaining size percentage reaches below this threshold will be compacted in a minor compaction. If set to less than zero, the minor compaction is disabled.
+
+**Default**: 0.2
+
+### minorCompactionInterval
+
+Time interval to run minor compaction, in seconds. If set to less than zero, the minor compaction is disabled. Note: should be greater than gcWaitTime.
+
+**Default**: 3600
+
+### majorCompactionThreshold
+
+The threshold of major compaction. Entry log files whose remaining size percentage reaches below this threshold will be compacted in a major compaction. Those entry log files whose remaining size percentage is still higher than the threshold will never be compacted. If set to less than zero, the major compaction is disabled.
+
+**Default**: 0.5
+
+### majorCompactionInterval
+
+The time interval to run major compaction, in seconds. If set to less than zero, the major compaction is disabled. Note: should be greater than gcWaitTime.
+
+**Default**: 86400
+
+### readOnlyModeEnabled
+
+If `readOnlyModeEnabled=true`, then on all full ledger disks, bookie will be converted to read-only mode and serve only read requests. Otherwise the bookie will be shutdown.
+
+**Default**: true
+
+### forceReadOnlyBookie
+
+Whether the bookie is force started in read only mode.
+
+**Default**: false
+
+### persistBookieStatusEnabled
+
+Persist the bookie status locally on the disks. So the bookies can keep their status upon restarts.
+
+**Default**: false
+
+### compactionMaxOutstandingRequests
+
+Sets the maximum number of entries that can be compacted without flushing. When compacting, the entries are written to the entrylog and the new offsets are cached in memory. Once the entrylog is flushed the index is updated with the new offsets. This parameter controls the number of entries added to the entrylog before a flush is forced. A higher value for this parameter means more memory will be used for offsets. Each offset consists of 3 longs. This parameter should not be modified unl [...]
+
+**Default**: 100000
+
+### compactionRate
+
+The rate at which compaction will read entries, in adds per second.
+
+**Default**: 1000
+
+### isThrottleByBytes
+
+Throttle compaction by bytes or by entries.
+
+**Default**: false
+
+### compactionRateByEntries
+
+The rate at which compaction will read entries, in adds per second.
+
+**Default**: 1000
+
+### compactionRateByBytes
+
+Set the rate at which compaction reads entries. The unit is bytes added per second.
+
+**Default**: 1000000
+
+### journalMaxSizeMB
+
+Max file size of journal file, in megabytes. A new journal file will be created when the old one reaches the file size limitation.
+
+**Default**: 2048
+
+### journalMaxBackups
+
+The max number of old journal files to keep. Keeping a number of old journal files would help data recovery in special cases.
+
+**Default**: 5
+
+### journalPreAllocSizeMB
+
+How space to pre-allocate at a time in the journal.
+
+**Default**: 16
+
+### journalWriteBufferSizeKB
+
+The of the write buffers used for the journal.
+
+**Default**: 64
+
+### journalRemoveFromPageCache
+
+Whether pages should be removed from the page cache after force write.
+
+**Default**: true
+
+### journalAdaptiveGroupWrites
+
+Whether to group journal force writes, which optimizes group commit for higher throughput.
+
+**Default**: true
+
+### journalMaxGroupWaitMSec
+
+The maximum latency to impose on a journal write to achieve grouping.
+
+**Default**: 1
+
+### journalAlignmentSize
+
+All the journal writes and commits should be aligned to given size
+
+**Default**: 4096
+
+### journalBufferedWritesThreshold
+
+Maximum writes to buffer to achieve grouping
+
+**Default**: 524288
+
+### journalFlushWhenQueueEmpty
+
+If we should flush the journal when journal queue is empty
+
+**Default**: false
+
+### numJournalCallbackThreads
+
+The number of threads that should handle journal callbacks
+
+**Default**: 8
+
+### openLedgerRereplicationGracePeriod
+
+The grace period, in milliseconds, that the replication worker waits before fencing and replicating a ledger fragment that's still being written to upon bookie failure.
+
+**Default**: 30000
+
+### rereplicationEntryBatchSize
+
+The number of max entries to keep in fragment for re-replication
+
+**Default**: 100
+
+### autoRecoveryDaemonEnabled
+
+Whether the bookie itself can start auto-recovery service.
+
+**Default**: true
+
+### lostBookieRecoveryDelay
+
+How long to wait, in seconds, before starting auto recovery of a lost bookie.
+
+**Default**: 0
+
+### gcWaitTime
+
+How long the interval to trigger next garbage collection, in milliseconds. Since garbage collection is running in background, too frequent gc will heart performance. It is better to give a higher number of gc interval if there is enough disk capacity.
+
+**Default**: 900000
+
+### gcOverreplicatedLedgerWaitTime
+
+How long the interval to trigger next garbage collection of overreplicated ledgers, in milliseconds. This should not be run very frequently since we read the metadata for all the ledgers on the bookie from zk.
+
+**Default**: 86400000
+
+### flushInterval
+
+How long the interval to flush ledger index pages to disk, in milliseconds. Flushing index files will introduce much random disk I/O. If separating journal dir and ledger dirs each on different devices, flushing would not affect performance. But if putting journal dir and ledger dirs on same device, performance degrade significantly on too frequent flushing. You can consider increment flush interval to get better performance, but you need to pay more time on bookie server restart after failure.
+
+**Default**: 60000
+
+### bookieDeathWatchInterval
+
+Interval to watch whether bookie is dead or not, in milliseconds
+
+**Default**: 1000
+
+### allowStorageExpansion
+
+Allow the bookie storage to expand. Newly added ledger and index dirs must be empty.
+
+**Default**: false
+
+### zkServers
+
+A list of one of more servers on which zookeeper is running. The server list can be comma separated values, for example: zkServers=zk1:2181,zk2:2181,zk3:2181.
+
+**Default**: localhost:2181
+
+### zkTimeout
+
+ZooKeeper client session timeout in milliseconds Bookie server will exit if it received SESSION_EXPIRED because it was partitioned off from ZooKeeper for more than the session timeout JVM garbage collection, disk I/O will cause SESSION_EXPIRED. Increment this value could help avoiding this issue
+
+**Default**: 30000
+
+### zkRetryBackoffStartMs
+
+The start time that the Zookeeper client backoff retries in milliseconds.
+
+**Default**: 1000
+
+### zkRetryBackoffMaxMs
+
+The maximum time that the Zookeeper client backoff retries in milliseconds.
+
+**Default**: 10000
+
+### zkEnableSecurity
+
+Set ACLs on every node written on ZooKeeper, allowing users to read and write BookKeeper metadata stored on ZooKeeper. In order to make ACLs work you need to setup ZooKeeper JAAS authentication. All the bookies and Client need to share the same user, and this is usually done using Kerberos authentication. See ZooKeeper documentation.
+
+**Default**: false
+
+### httpServerEnabled
+
+The flag enables/disables starting the admin http server.
+
+**Default**: false
+
+### httpServerPort
+
+The HTTP server port to listen on. By default, the value is `8080`. If you want to keep it consistent with the Prometheus stats provider, you can set it to `8000`.
+
+**Default**: 8080
+
+### httpServerClass
+
+The http server class.
+
+**Default**: org.apache.bookkeeper.http.vertx.VertxHttpServer
+
+### serverTcpNoDelay
+
+This settings is used to enabled/disabled Nagle’s algorithm, which is a means of improving the efficiency of TCP/IP networks by reducing the number of packets that need to be sent over the network. If you are sending many small messages, such that more than one can fit in a single IP packet, setting server.tcpnodelay to false to enable Nagle algorithm can provide better performance.
+
+**Default**: true
+
+### serverSockKeepalive
+
+This setting is used to send keep-alive messages on connection-oriented sockets.
+
+**Default**: true
+
+### serverTcpLinger
+
+The socket linger timeout on close. When enabled, a close or shutdown will not return until all queued messages for the socket have been successfully sent or the linger timeout has been reached. Otherwise, the call returns immediately and the closing is done in the background.
+
+**Default**: 0
+
+### byteBufAllocatorSizeMax
+
+The maximum buf size of the received ByteBuf allocator.
+
+**Default**: 1048576
+
+### nettyMaxFrameSizeBytes
+
+The maximum netty frame size in bytes. Any message received larger than this will be rejected.
+
+**Default**: 5253120
+
+### openFileLimit
+
+Max number of ledger index files could be opened in bookie server If number of ledger index files reaches this limitation, bookie server started to swap some ledgers from memory to disk. Too frequent swap will affect performance. You can tune this number to gain performance according your requirements.
+
+**Default**: 0
+
+### pageSize
+
+Size of a index page in ledger cache, in bytes A larger index page can improve performance writing page to disk, which is efficient when you have small number of ledgers and these ledgers have similar number of entries. If you have large number of ledgers and each ledger has fewer entries, smaller index page would improve memory usage.
+
+**Default**: 8192
+
+### pageLimit
+
+How many index pages provided in ledger cache If number of index pages reaches this limitation, bookie server starts to swap some ledgers from memory to disk. You can increment this value when you found swap became more frequent. But make sure pageLimit\*pageSize should not more than JVM max memory limitation, otherwise you would got OutOfMemoryException. In general, incrementing pageLimit, using smaller index page would gain better performance in lager number of ledgers with fewer entri [...]
+
+**Default**: 0
+
+### readOnlyModeEnabled
+
+If all ledger directories configured are full, then support only read requests for clients. If "readOnlyModeEnabled=true" then on all ledger disks full, bookie will be converted to read-only mode and serve only read requests. Otherwise the bookie will be shutdown. By default this will be disabled.
+
+**Default**: true
+
+### diskUsageThreshold
+
+For each ledger dir, maximum disk space which can be used. Default is 0.95f. i.e. 95% of disk can be used at most after which nothing will be written to that partition. If all ledger dir partitions are full, then bookie will turn to readonly mode if ‘readOnlyModeEnabled=true’ is set, else it will shutdown. Valid values should be in between 0 and 1 (exclusive).
+
+**Default**: 0.95
+
+### diskCheckInterval
+
+Disk check interval in milli seconds, interval to check the ledger dirs usage.
+
+**Default**: 10000
+
+### auditorPeriodicCheckInterval
+
+Interval at which the auditor will do a check of all ledgers in the cluster. By default this runs once a week. The interval is set in seconds. To disable the periodic check completely, set this to 0. Note that periodic checking will put extra load on the cluster, so it should not be run more frequently than once a day.
+
+**Default**: 604800
+
+### sortedLedgerStorageEnabled
+
+Whether sorted-ledger storage is enabled.
+
+**Default**: true
+
+### auditorPeriodicBookieCheckInterval
+
+The interval between auditor bookie checks. The auditor bookie check, checks ledger metadata to see which bookies should contain entries for each ledger. If a bookie which should contain entries is unavailable, thea the ledger containing that entry is marked for recovery. Setting this to 0 disabled the periodic check. Bookie checks will still run when a bookie fails. The interval is specified in seconds.
+
+**Default**: 86400
+
+### numAddWorkerThreads
+
+The number of threads that should handle write requests. if zero, the writes would be handled by netty threads directly.
+
+**Default**: 0
+
+### numReadWorkerThreads
+
+The number of threads that should handle read requests. if zero, the reads would be handled by netty threads directly.
+
+**Default**: 8
+
+### numHighPriorityWorkerThreads
+
+The umber of threads that should be used for high priority requests (i.e. recovery reads and adds, and fencing).
+
+**Default**: 8
+
+### maxPendingReadRequestsPerThread
+
+If read workers threads are enabled, limit the number of pending requests, to avoid the executor queue to grow indefinitely.
+
+**Default**: 2500
+
+### maxPendingAddRequestsPerThread
+
+The limited number of pending requests, which is used to avoid the executor queue to grow indefinitely when add workers threads are enabled.
+
+**Default**: 10000
+
+### isForceGCAllowWhenNoSpace
+
+Whether force compaction is allowed when the disk is full or almost full. Forcing GC could get some space back, but could also fill up the disk space more quickly. This is because new log files are created before GC, while old garbage log files are deleted after GC.
+
+**Default**: false
+
+### verifyMetadataOnGC
+
+True if the bookie should double check `readMetadata` prior to GC.
+
+**Default**: false
+
+### flushEntrylogBytes
+
+Entry log flush interval in bytes. Flushing in smaller chunks but more frequently reduces spikes in disk I/O. Flushing too frequently may also affect performance negatively.
+
+**Default**: 268435456
+
+### readBufferSizeBytes
+
+The number of bytes we should use as capacity for BufferedReadChannel.
+
+**Default**: 4096
+
+### writeBufferSizeBytes
+
+The number of bytes used as capacity for the write buffer
+
+**Default**: 65536
+
+### useHostNameAsBookieID
+
+Whether the bookie should use its hostname to register with the coordination service (e.g.: zookeeper service). When false, bookie will use its ip address for the registration.
+
+**Default**: false
+
+### bookieId
+
+If you want to custom a bookie ID or use a dynamic network address for the bookie, you can set the `bookieId`. <br /><br />Bookie advertises itself using the `bookieId` rather than the `BookieSocketAddress` (`hostname:port` or `IP:port`). If you set the `bookieId`, then the `useHostNameAsBookieID` does not take effect.<br /><br />The `bookieId` is a non-empty string that can contain ASCII digits and letters ([a-zA-Z9-0]), colons, dashes, and dots. <br /><br />For more information about ` [...]
+
+**Default**: N/A
+
+### allowEphemeralPorts
+
+Whether the bookie is allowed to use an ephemeral port (port 0) as its server port. By default, an ephemeral port is not allowed. Using an ephemeral port as the service port usually indicates a configuration error. However, in unit tests, using an ephemeral port will address port conflict problems and allow running tests in parallel.
+
+**Default**: false
+
+### enableLocalTransport
+
+Whether the bookie is allowed to listen for the BookKeeper clients executed on the local JVM.
+
+**Default**: false
+
+### disableServerSocketBind
+
+Whether the bookie is allowed to disable bind on network interfaces. This bookie will be available only to BookKeeper clients executed on the local JVM.
+
+**Default**: false
+
+### skipListArenaChunkSize
+
+The number of bytes that we should use as chunk allocation for `org.apache.bookkeeper.bookie.SkipListArena`.
+
+**Default**: 4194304
+
+### skipListArenaMaxAllocSize
+
+The maximum size that we should allocate from the skiplist arena. Allocations larger than this should be allocated directly by the VM to avoid fragmentation.
+
+**Default**: 131072
+
+### bookieAuthProviderFactoryClass
+
+The factory class name of the bookie authentication provider. If this is null, then there is no authentication.
+
+**Default**: null
+
+### statsProviderClass
+
+ [...]
+
+ [...]
+
+### prometheusStatsHttpPort
+
+ [...]
+
+ [...]
+
+### dbStorage_writeCacheMaxSizeMb
+
+Size of Write Cache. Memory is allocated from JVM direct memory. Write cache is used to buffer entries before flushing into the entry log. For good performance, it should be big enough to hold a substantial amount of entries in the flush interval.
+
+**Default**: 25% of direct memory
+
+### dbStorage_readAheadCacheMaxSizeMb
+
+Size of Read cache. Memory is allocated from JVM direct memory. This read cache is pre-filled doing read-ahead whenever a cache miss happens. By default, it is allocated to 25% of the available direct memory.
+
+**Default**: N/A
+
+### dbStorage_readAheadCacheBatchSize
+
+How many entries to pre-fill in cache after a read cache miss
+
+**Default**: 1000
+
+### dbStorage_rocksDB_blockCacheSize
+
+Size of RocksDB block-cache. For best performance, this cache should be big enough to hold a significant portion of the index database which can reach ~2GB in some cases. By default, it uses 10% of direct memory.
+
+**Default**: N/A
+
+### dbStorage_rocksDB_writeBufferSizeMB
+
+**Default**: 64
+
+### dbStorage_rocksDB_sstSizeInMB
+
+**Default**: 64
+
+### dbStorage_rocksDB_blockSize
+
+**Default**: 65536
+
+### dbStorage_rocksDB_bloomFilterBitsPerKey
+
+**Default**: 10
+
+### dbStorage_rocksDB_numLevels
+
+**Default**: -1
+
+### dbStorage_rocksDB_numFilesInLevel0
+
+**Default**: 4
+
+### dbStorage_rocksDB_maxSizeInLevel1MB
+
+**Default**: 256
diff --git a/static/reference/5.0.x/config/reference-configuration-broker.md b/static/reference/5.0.x/config/reference-configuration-broker.md
new file mode 100644
index 00000000000..5ef5f34a16d
--- /dev/null
+++ b/static/reference/5.0.x/config/reference-configuration-broker.md
@@ -0,0 +1,6809 @@
+# Broker
+
+## Required
+### clusterName
+Name of the cluster to which this broker belongs to
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+## Optional
+### topicFactoryClassName
+Factory class-name to create topic with custom workflow
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `true`
+
+**Category**:
+
+### zookeeperSessionExpiredPolicy
+There are two policies to apply when broker metadata session expires: session expired happens, "shutdown" or "reconnect".
+
+ With "shutdown", the broker will be restarted.
+
+ With "reconnect", the broker will keep serving the topics, while attempting to recreate a new session.
+
+**Type**: `org.apache.pulsar.broker.MetadataSessionExpiredPolicy`
+
+**Default**: `reconnect`
+
+**Dynamic**: `false`
+
+**Category**:
+
+### authenticationEnabled
+Enable authentication
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Authentication
+
+### authenticationProviders
+Authentication provider name list, which is a list of class names
+
+**Type**: `java.util.Set`
+
+**Default**: `[]`
+
+**Dynamic**: `false`
+
+**Category**: Authentication
+
+### authenticationRefreshCheckSeconds
+Interval of time for checking for expired authentication credentials
+
+**Type**: `int`
+
+**Default**: `60`
+
+**Dynamic**: `false`
+
+**Category**: Authentication
+
+### brokerClientAuthenticationParameters
+Authentication parameters of the authentication plugin the broker is using to connect to other brokers
+
+**Type**: `java.lang.String`
+
+**Default**: ``
+
+**Dynamic**: `true`
+
+**Category**: Authentication
+
+### brokerClientAuthenticationPlugin
+Authentication settings of the broker itself.
+
+Used when the broker connects to other brokers, either in same or other clusters. Default uses plugin which disables authentication
+
+**Type**: `java.lang.String`
+
+**Default**: `org.apache.pulsar.client.impl.auth.AuthenticationDisabled`
+
+**Dynamic**: `true`
+
+**Category**: Authentication
+
+### brokerClientCertificateFilePath
+TLS certificate file for internal client, used by the internal client to authenticate with Pulsar brokers
+
+**Type**: `java.lang.String`
+
+**Default**: ``
+
+**Dynamic**: `false`
+
+**Category**: Authentication
+
+### brokerClientKeyFilePath
+TLS private key file for internal client, used by the internal client to authenticate with Pulsar brokers
+
+**Type**: `java.lang.String`
+
+**Default**: ``
+
+**Dynamic**: `false`
+
+**Category**: Authentication
+
+### brokerClientTrustCertsFilePath
+TLS trusted certificate file for internal client, used by the internal client to authenticate with Pulsar brokers
+
+**Type**: `java.lang.String`
+
+**Default**: ``
+
+**Dynamic**: `false`
+
+**Category**: Authentication
+
+### strictAuthMethod
+Strictly enforce authentication method. If specified, Pulsar will only attempt to authenticate with the provided method. If no method is provided, authentication fails.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Authentication
+
+### anonymousUserRole
+When this parameter is not empty, unauthenticated users perform as anonymousUserRole
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Authorization
+
+### authenticateOriginalAuthData
+If this flag is set then the broker authenticates the original Auth data else it just accepts the originalPrincipal and authorizes it (if required)
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Authorization
+
+### authorizationAllowWildcardsMatching
+Allow wildcard matching in authorization
+
+(wildcard matching only applicable if wildcard-char: * presents at first or last position eg: *.pulsar.service, pulsar.service.*)
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Authorization
+
+### authorizationEnabled
+Enforce authorization
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Authorization
+
+### authorizationProvider
+Authorization provider fully qualified class-name
+
+**Type**: `java.lang.String`
+
+**Default**: `org.apache.pulsar.broker.authorization.PulsarAuthorizationProvider`
+
+**Dynamic**: `false`
+
+**Category**: Authorization
+
+### proxyRoles
+Role names that are treated as `proxy roles`.
+
+If the broker sees a request with role as proxyRoles - it will demand to see the original client role or certificate.
+
+**Type**: `java.util.Set`
+
+**Default**: `[]`
+
+**Dynamic**: `false`
+
+**Category**: Authorization
+
+### superUserRoles
+Role names that are treated as `super-user`, meaning they will be able to do all admin operations and publish/consume from all topics
+
+**Type**: `java.util.Set`
+
+**Default**: `[]`
+
+**Dynamic**: `true`
+
+**Category**: Authorization
+
+### additionalServletDirectory
+The directory to locate broker additional servlet
+
+**Type**: `java.lang.String`
+
+**Default**: `./brokerAdditionalServlet`
+
+**Dynamic**: `false`
+
+**Category**: Broker Plugin
+
+### additionalServlets
+List of broker additional servlet to load, which is a list of broker additional servlet names
+
+**Type**: `java.util.Set`
+
+**Default**: `[]`
+
+**Dynamic**: `false`
+
+**Category**: Broker Plugin
+
+### functionsWorkerEnablePackageManagement
+Flag indicates enabling or disabling function worker using unified PackageManagement service.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Functions
+
+### functionsWorkerEnabled
+Flag indicates enabling or disabling function worker on brokers
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Functions
+
+### functionsWorkerServiceNarPackage
+The nar package for the function worker service
+
+**Type**: `java.lang.String`
+
+**Default**: ``
+
+**Dynamic**: `false`
+
+**Category**: Functions
+
+### disableHttpDebugMethods
+If true, the broker will reject all HTTP requests using the TRACE and TRACK verbs.
+ This setting may be necessary if the broker is deployed into an environment that uses http port
+ scanning and flags web servers allowing the TRACE method as insecure.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: HTTP
+
+### httpMaxRequestHeaderSize
+ The maximum size in bytes of the request header.
+ Larger headers will allow for more and/or larger cookies plus larger form content encoded in a URL.
+ However, larger headers consume more memory and can make a server more vulnerable to denial of service
+ attacks.
+
+
+**Type**: `int`
+
+**Default**: `8192`
+
+**Dynamic**: `false`
+
+**Category**: HTTP
+
+### httpMaxRequestSize
+If \>0, it will reject all HTTP requests with bodies larged than the configured limit
+
+**Type**: `long`
+
+**Default**: `-1`
+
+**Dynamic**: `false`
+
+**Category**: HTTP
+
+### httpRequestsFailOnUnknownPropertiesEnabled
+Admin API fail on unknown request parameter in request-body. see PIP-179. Default false.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `true`
+
+**Category**: HTTP
+
+### httpRequestsLimitEnabled
+Enable the enforcement of limits on the incoming HTTP requests
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: HTTP
+
+### httpRequestsMaxPerSecond
+Max HTTP requests per seconds allowed. The excess of requests will be rejected with HTTP code 429 (Too many requests)
+
+**Type**: `double`
+
+**Default**: `100.0`
+
+**Dynamic**: `false`
+
+**Category**: HTTP
+
+### httpServerIdleTimeout
+Idle timeout for HTTP server connections in milliseconds.
+
+**Type**: `int`
+
+**Default**: `30000`
+
+**Dynamic**: `false`
+
+**Category**: HTTP
+
+### brokerClientSslProvider
+The TLS Provider used by internal client to authenticate with other Pulsar brokers
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: KeyStoreTLS
+
+### brokerClientTlsCiphers
+Specify the tls cipher the internal client will use to negotiate during TLS Handshake (a comma-separated list of ciphers).
+
+Examples:- [TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256].
+ used by the internal client to authenticate with Pulsar brokers
+
+**Type**: `java.util.Set`
+
+**Default**: `[]`
+
+**Dynamic**: `false`
+
+**Category**: KeyStoreTLS
+
+### brokerClientTlsEnabledWithKeyStore
+Whether internal client use KeyStore type to authenticate with other Pulsar brokers
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: KeyStoreTLS
+
+### brokerClientTlsKeyStore
+TLS KeyStore path for internal client, used by the internal client to authenticate with Pulsar brokers
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: KeyStoreTLS
+
+### brokerClientTlsKeyStorePassword
+TLS KeyStore password for internal client, used by the internal client to authenticate with Pulsar brokers
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: KeyStoreTLS
+
+### brokerClientTlsKeyStoreType
+TLS KeyStore type configuration for internal client: JKS, PKCS12, used by the internal client to authenticate with Pulsar brokers
+
+**Type**: `java.lang.String`
+
+**Default**: `JKS`
+
+**Dynamic**: `false`
+
+**Category**: KeyStoreTLS
+
+### brokerClientTlsProtocols
+Specify the tls protocols the broker will use to negotiate during TLS handshake (a comma-separated list of protocol names).
+
+Examples:- [TLSv1.3, TLSv1.2]
+ used by the internal client to authenticate with Pulsar brokers
+
+**Type**: `java.util.Set`
+
+**Default**: `[]`
+
+**Dynamic**: `false`
+
+**Category**: KeyStoreTLS
+
+### brokerClientTlsTrustStore
+TLS TrustStore path for internal client, used by the internal client to authenticate with Pulsar brokers
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: KeyStoreTLS
+
+### brokerClientTlsTrustStorePassword
+TLS TrustStore password for internal client, used by the internal client to authenticate with Pulsar brokers
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: KeyStoreTLS
+
+### brokerClientTlsTrustStoreType
+TLS TrustStore type configuration for internal client: JKS, PKCS12 used by the internal client to authenticate with Pulsar brokers
+
+**Type**: `java.lang.String`
+
+**Default**: `JKS`
+
+**Dynamic**: `false`
+
+**Category**: KeyStoreTLS
+
+### tlsEnabledWithKeyStore
+Enable TLS with KeyStore type configuration in broker
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: KeyStoreTLS
+
+### tlsKeyStore
+TLS KeyStore path in broker
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: KeyStoreTLS
+
+### tlsKeyStorePassword
+TLS KeyStore password for broker
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: KeyStoreTLS
+
+### tlsKeyStoreType
+TLS KeyStore type configuration in broker: JKS, PKCS12
+
+**Type**: `java.lang.String`
+
+**Default**: `JKS`
+
+**Dynamic**: `false`
+
+**Category**: KeyStoreTLS
+
+### tlsProvider
+Specify the TLS provider for the broker service:
+When using TLS authentication with CACert, the valid value is either OPENSSL or JDK.
+When using TLS authentication with KeyStore, available values can be SunJSSE, Conscrypt and etc.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: KeyStoreTLS
+
+### tlsTrustStore
+TLS TrustStore path in broker
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: KeyStoreTLS
+
+### tlsTrustStorePassword
+TLS TrustStore password for broker, null means empty password.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: KeyStoreTLS
+
+### tlsTrustStoreType
+TLS TrustStore type configuration in broker: JKS, PKCS12
+
+**Type**: `java.lang.String`
+
+**Default**: `JKS`
+
+**Dynamic**: `false`
+
+**Category**: KeyStoreTLS
+
+### defaultNamespaceBundleSplitAlgorithm
+Default algorithm name for namespace bundle split
+
+**Type**: `java.lang.String`
+
+**Default**: `range_equally_divide`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### flowOrQpsDifferenceThresholdPercentage
+In FlowOrQpsEquallyDivideBundleSplitAlgorithm, if msgRate \>= loadBalancerNamespaceBundleMaxMsgRate * (100 + flowOrQpsDifferenceThresholdPercentage)/100.0 or throughput \>= loadBalancerNamespaceBundleMaxBandwidthMbytes * (100 + flowOrQpsDifferenceThresholdPercentage)/100.0, execute split bundle
+
+**Type**: `int`
+
+**Default**: `10`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalanceSheddingDelayInSeconds
+Delay (in seconds) to the next unloading cycle after unloading. The logic tries to give enough time for brokers to recompute load after unloading. The bigger value will delay the next unloading cycle longer. (only used in load balancer extension TransferShedder)
+
+**Type**: `long`
+
+**Default**: `180`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerAutoBundleSplitEnabled
+enable/disable automatic namespace bundle split
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerAutoUnloadSplitBundlesEnabled
+enable/disable automatic unloading of split bundles
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerAverageResourceUsageDifferenceThresholdPercentage
+Average resource usage difference threshold to determine a broker whether to be a best candidate in LeastResourceUsageWithWeight.(eg: broker1 with 10% resource usage with weight and broker2 with 30% and broker3 with 80% will have 40% average resource usage. The placement strategy can select broker1 and broker2 as best candidates.)
+
+**Type**: `int`
+
+**Default**: `10`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerAvgShedderHighThreshold
+The high threshold for the difference between the highest and lowest loaded brokers.
+
+**Type**: `int`
+
+**Default**: `40`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerAvgShedderHitCountHighThreshold
+The number of times the high threshold is triggered before the bundle is unloaded.
+
+**Type**: `int`
+
+**Default**: `2`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerAvgShedderHitCountLowThreshold
+The number of times the low threshold is triggered before the bundle is unloaded.
+
+**Type**: `int`
+
+**Default**: `8`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerAvgShedderLowThreshold
+The low threshold for the difference between the highest and lowest loaded brokers.
+
+**Type**: `int`
+
+**Default**: `15`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerBandwidthInResourceWeight
+BandwidthIn Resource Usage Weight
+
+**Type**: `double`
+
+**Default**: `1.0`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerBandwidthOutResourceWeight
+BandwidthOut Resource Usage Weight
+
+**Type**: `double`
+
+**Default**: `1.0`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerBandwithInResourceWeight
+BandwidthIn Resource Usage Weight, Deprecated: Use loadBalancerBandwidthInResourceWeight
+
+**Type**: `double`
+
+**Default**: `1.0`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerBandwithOutResourceWeight
+BandwidthOut Resource Usage Weight, Deprecated: Use loadBalancerBandwidthOutResourceWeight
+
+**Type**: `double`
+
+**Default**: `1.0`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerBrokerLoadDataTTLInSeconds
+Broker load data time to live (TTL in seconds). The logic tries to avoid (possibly unavailable) brokers with out-dated load data, and those brokers will be ignored in the load computation. When tuning this value, please consider loadBalancerReportUpdateMaxIntervalMinutes. The current default value is loadBalancerReportUpdateMaxIntervalMinutes * 120, reflecting twice the duration in seconds. (only used in load balancer extension TransferShedder)
+
+**Type**: `long`
+
+**Default**: `1800`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerBrokerLoadTargetStd
+The target standard deviation of the resource usage across brokers (100% resource usage is 1.0 load). The shedder logic tries to distribute bundle load across brokers to meet this target std. The smaller value will incur load balancing more frequently. (only used in load balancer extension TransferShedder)
+
+**Type**: `double`
+
+**Default**: `0.25`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerBrokerMaxTopics
+Usage threshold to allocate max number of topics to broker
+
+**Type**: `int`
+
+**Default**: `50000`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerBrokerOverloadedThresholdPercentage
+Usage threshold to determine a broker as over-loaded
+
+**Type**: `int`
+
+**Default**: `85`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerBrokerThresholdShedderPercentage
+Usage threshold to determine a broker whether to start threshold shedder
+
+**Type**: `int`
+
+**Default**: `10`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerBundleUnloadMinThroughputThreshold
+Bundle unload minimum throughput threshold (MB)
+
+**Type**: `double`
+
+**Default**: `10.0`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerCPUResourceWeight
+CPU Resource Usage Weight
+
+**Type**: `double`
+
+**Default**: `1.0`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerDebugModeEnabled
+Option to enable the debug mode for the load balancer logics. The debug mode prints more logs to provide more information such as load balance states and decisions. (only used in load balancer extension logics)
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerDirectMemoryResourceWeight
+Direct Memory Resource Usage Weight. Direct memory usage cannot accurately reflect the machine's load, and it is not recommended to use it to score the machine's load.
+
+**Type**: `double`
+
+**Default**: `0.0`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerDistributeBundlesEvenlyEnabled
+enable/disable distribute bundles evenly
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerEnabled
+Enable load balancer
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `false`
+
+**Category**: Load Balancer
+
+### loadBalancerHistoryResourcePercentage
+Resource history Usage Percentage When adding new resource usage info
+
+**Type**: `double`
+
+**Default**: `0.9`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerHostUsageCheckIntervalMinutes
+Frequency of report to collect, in minutes
+
+**Type**: `int`
+
+**Default**: `1`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerInFlightServiceUnitStateWaitingTimeInMillis
+Time to wait before fixing any stuck in-flight service unit states. The leader monitor fixes any in-flight service unit(bundle) states by reassigning the ownerships if stuck too long, longer than this period.(only used in load balancer extension logics)
+
+**Type**: `long`
+
+**Default**: `30000`
+
+**Dynamic**: `false`
+
+**Category**: Load Balancer
+
+### loadBalancerLoadPlacementStrategy
+load balance placement strategy
+
+**Type**: `java.lang.String`
+
+**Default**: `org.apache.pulsar.broker.loadbalance.impl.LeastLongTermMessageRate`
+
+**Dynamic**: `false`
+
+**Category**: Load Balancer
+
+### loadBalancerLoadSheddingStrategy
+load balance load shedding strategy (It requires broker restart if value is changed using dynamic config). Default is ThresholdShedder since 2.10.0
+
+**Type**: `java.lang.String`
+
+**Default**: `org.apache.pulsar.broker.loadbalance.impl.ThresholdShedder`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerMaxNumberOfBrokerSheddingPerCycle
+Maximum number of brokers to unload bundle load for each unloading cycle. The bigger value will incur more unloading/transfers for each unloading cycle. (only used in load balancer extension TransferShedder)
+
+**Type**: `int`
+
+**Default**: `3`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerMaxNumberOfBundlesInBundleLoadReport
+Max number of bundles in bundle load report from each broker. The load balancer distributes bundles across brokers, based on topK bundle load data and other broker load data.The bigger value will increase the overhead of reporting many bundles in load data. Used for ExtensibleLoadManagerImpl and ModularLoadManagerImpl, default value is 10. User can disable the bundle filtering feature of ModularLoadManagerImpl by setting to -1.Enabling this feature can reduce the pressure on the zookeepe [...]
+
+**Type**: `int`
+
+**Default**: `10`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerMaxNumberOfBundlesToSplitPerCycle
+Max number of bundles to split to per cycle. (only used in load balancer extension logics)
+
+**Type**: `int`
+
+**Default**: `10`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerMsgRateDifferenceShedderThreshold
+Message-rate percentage threshold between highest and least loaded brokers for uniform load shedding. (eg: broker1 with 50K msgRate and broker2 with 30K msgRate will have 66% msgRate difference and load balancer can unload bundles from broker-1 to broker-2)
+
+**Type**: `double`
+
+**Default**: `50.0`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerMsgThroughputMultiplierDifferenceShedderThreshold
+Message-throughput threshold between highest and least loaded brokers for uniform load shedding. (eg: broker1 with 450MB msgRate and broker2 with 100MB msgRate will have 4.5 times msgThroughout difference and load balancer can unload bundles from broker-1 to broker-2)
+
+**Type**: `double`
+
+**Default**: `4.0`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerMultiPhaseBundleUnload
+Enables the multi-phase unloading of bundles. Set to true, forwards destination broker information to consumers and producers during bundle unload, allowing them to quickly reconnect to the broker without performing an additional topic lookup.
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `false`
+
+**Category**: Load Balancer
+
+### loadBalancerNamespaceBundleMaxBandwidthMbytes
+maximum bandwidth (in + out) in a bundle, otherwise bundle split will be triggered
+
+**Type**: `int`
+
+**Default**: `100`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerNamespaceBundleMaxMsgRate
+maximum msgRate (in + out) in a bundle, otherwise bundle split will be triggered
+
+**Type**: `int`
+
+**Default**: `30000`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerNamespaceBundleMaxSessions
+maximum sessions (producers + consumers) in a bundle, otherwise bundle split will be triggered(disable threshold check with value -1)
+
+**Type**: `int`
+
+**Default**: `1000`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerNamespaceBundleMaxTopics
+maximum topics in a bundle, otherwise bundle split will be triggered
+
+**Type**: `int`
+
+**Default**: `1000`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerNamespaceBundleSplitConditionHitCountThreshold
+Threshold to the consecutive count of fulfilled split conditions. If the split scheduler consecutively finds bundles that meet split conditions many times bigger than this threshold, the scheduler will trigger splits on the bundles (if the number of bundles is less than loadBalancerNamespaceMaximumBundles). (only used in load balancer extension logics)
+
+**Type**: `int`
+
+**Default**: `3`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerNamespaceMaximumBundles
+maximum number of bundles in a namespace
+
+**Type**: `int`
+
+**Default**: `128`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerOverrideBrokerNicSpeedGbps
+Option to override the auto-detected network interfaces max speed
+
+**Type**: `java.util.Optional`
+
+**Default**: `Optional.empty`
+
+**Dynamic**: `false`
+
+**Category**: Load Balancer
+
+### loadBalancerOverrideBrokerNics
+Option to override the auto-detected network interfaces
+
+**Type**: `java.util.List`
+
+**Default**: `[]`
+
+**Dynamic**: `false`
+
+**Category**: Load Balancer
+
+### loadBalancerReportUpdateMaxIntervalMinutes
+Min delay of load report to collect, in minutes
+
+**Type**: `int`
+
+**Default**: `15`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerReportUpdateMinIntervalMillis
+maximum interval to update load report
+
+**Type**: `int`
+
+**Default**: `5000`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerReportUpdateThresholdPercentage
+Percentage of change to trigger load report update
+
+**Type**: `int`
+
+**Default**: `10`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerResourceQuotaUpdateIntervalMinutes
+Interval to flush dynamic resource quota to ZooKeeper
+
+**Type**: `int`
+
+**Default**: `15`
+
+**Dynamic**: `false`
+
+**Category**: Load Balancer
+
+### loadBalancerServiceUnitStateMaxConcurrentOverrides
+Specify the maximum number of concurrent orphan bundle ownership overrides. The leader broker triggers these overrides upon detecting orphaned bundles. It identifies orphan bundle ownerships by periodically scanning ownership data and monitoring for broker shutdowns or inactive states.
+
+**Type**: `int`
+
+**Default**: `64`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerServiceUnitStateMonitorIntervalInSeconds
+Interval between service unit state monitor checks. The service unit(bundle) state channel is periodically monitored by the leader broker at this interval to fix any orphan bundle ownerships, stuck in-flight states, and other cleanup jobs.`loadBalancerServiceUnitStateTombstoneDelayTimeInSeconds` * 1000 must be bigger than `loadBalancerInFlightServiceUnitStateWaitingTimeInMillis`.(only used in load balancer extension logics)
+
+**Type**: `long`
+
+**Default**: `60`
+
+**Dynamic**: `false`
+
+**Category**: Load Balancer
+
+### loadBalancerServiceUnitStateTombstoneDelayTimeInSeconds
+After this delay, the service-unit state channel tombstones any service units (e.g., bundles) in semi-terminal states. For example, after splits, parent bundles will be `deleted`, and then after this delay, the parent bundles' state will be `tombstoned` in the service-unit state channel. Pulsar does not immediately remove such semi-terminal states to avoid unnecessary system confusion, as the bundles in the `tombstoned` state might temporarily look available to reassign. Rarely, one coul [...]
+
+**Type**: `long`
+
+**Default**: `3600`
+
+**Dynamic**: `false`
+
+**Category**: Load Balancer
+
+### loadBalancerServiceUnitTableViewSyncer
+Specify ServiceUnitTableViewSyncer to sync service unit(bundle) states between metadata store and system topic table views during migration from one to the other. One could enable this syncer before migration and disable it after the migration finishes. It accepts `MetadataStoreToSystemTopicSyncer` or `SystemTopicToMetadataStoreSyncer` to enable it. It accepts `None` to disable it.
+
+**Type**: `org.apache.pulsar.broker.ServiceConfiguration.ServiceUnitTableViewSyncerType`
+
+**Default**: `None`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerSheddingBundlesWithPoliciesEnabled
+Option to automatically unload namespace bundles with affinity(isolation) or anti-affinity group policies.Such bundles are not ideal targets to auto-unload as destination brokers are limited.(only used in load balancer extension logics)
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerSheddingConditionHitCountThreshold
+Threshold to the consecutive count of fulfilled shedding(unload) conditions. If the unload scheduler consecutively finds bundles that meet unload conditions many times bigger than this threshold, the scheduler will shed the bundles. The bigger value will incur less bundle unloading/transfers. (only used in load balancer extension TransferShedder)
+
+**Type**: `int`
+
+**Default**: `3`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerSheddingEnabled
+Enable/disable automatic bundle unloading for load-shedding
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerSheddingExcludedNamespaces
+The namespaces to be excluded from load shedding
+
+**Type**: `java.util.Set`
+
+**Default**: `[]`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerSheddingGracePeriodMinutes
+Prevent the same topics to be shed and moved to other broker more than once within this timeframe
+
+**Type**: `long`
+
+**Default**: `30`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerSheddingIntervalMinutes
+Load shedding interval.
+
+Broker periodically checks whether some traffic should be offload from some over-loaded broker to other under-loaded brokers
+
+**Type**: `int`
+
+**Default**: `1`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerSplitIntervalMinutes
+Service units'(bundles) split interval. Broker periodically checks whether some service units(e.g. bundles) should split if they become hot-spots. (only used in load balancer extension logics)
+
+**Type**: `int`
+
+**Default**: `1`
+
+**Dynamic**: `false`
+
+**Category**: Load Balancer
+
+### loadBalancerTransferEnabled
+Option to enable the bundle transfer mode when distributing bundle loads. On: transfer bundles from overloaded brokers to underloaded -- pre-assigns the destination broker upon unloading). Off: unload bundles from overloaded brokers -- post-assigns the destination broker upon lookups). (only used in load balancer extension TransferShedder)
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadManagerClassName
+Name of load manager to use
+
+**Type**: `java.lang.String`
+
+**Default**: `org.apache.pulsar.broker.loadbalance.impl.ModularLoadManagerImpl`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadManagerMigrationEnabled
+When load manager migration is enabled, the broker will redirect requests to another broker if the load manager on the current broker is not using the load manager of the latest service lookup data available in the metadata store.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadManagerServiceUnitStateTableViewClassName
+Name of ServiceUnitStateTableView implementation class to use
+
+**Type**: `java.lang.String`
+
+**Default**: `org.apache.pulsar.broker.loadbalance.extensions.channel.ServiceUnitStateTableViewImpl`
+
+**Dynamic**: `false`
+
+**Category**: Load Balancer
+
+### lowerBoundarySheddingEnabled
+When [current usage < average usage - threshold], the broker with the highest load will be triggered to unload
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Load Balancer
+
+### maxUnloadBundleNumPerShedding
+For each uniform balanced unload, the maximum number of bundles that can be unloaded. The default value is -1, which means no limit
+
+**Type**: `int`
+
+**Default**: `-1`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### maxUnloadPercentage
+In the UniformLoadShedder and AvgShedder strategy, the maximum unload ratio.For AvgShedder, recommend to set to 0.5, so that it will distribute the load evenly between the highest and lowest brokers.
+
+**Type**: `double`
+
+**Default**: `0.2`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### minUnloadMessage
+In the UniformLoadShedder and AvgShedder strategy, the minimum message that triggers unload.
+
+**Type**: `int`
+
+**Default**: `1000`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### minUnloadMessageThroughput
+In the UniformLoadShedder and AvgShedder strategy, the minimum throughput that triggers unload.
+
+**Type**: `int`
+
+**Default**: `1048576`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### namespaceBundleUnloadingTimeoutMs
+Time to wait for the unloading of a namespace bundle
+
+**Type**: `long`
+
+**Default**: `60000`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### supportedNamespaceBundleSplitAlgorithms
+Supported algorithms name for namespace bundle split
+
+**Type**: `java.util.List`
+
+**Default**: `[range_equally_divide, topic_count_equally_divide, specified_positions_divide, flow_or_qps_equally_divide]`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### topicBundleAssignmentStrategy
+Name of topic bundle assignment strategy to use
+
+**Type**: `java.lang.String`
+
+**Default**: `org.apache.pulsar.common.naming.ConsistentHashingTopicBundleAssigner`
+
+**Dynamic**: `false`
+
+**Category**: Load Balancer
+
+### aggregatePublisherStatsByProducerName
+If true, aggregate publisher stats of PartitionedTopicStats by producerName
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Metrics
+
+### allowedTopicPropertyKeysForMetrics
+A comma-separated list of Topic Property keys that are allowed to be exposed as metrics.Only keys explicitly listed here will be exposed.
+
+**Type**: `java.util.Set`
+
+**Default**: `[]`
+
+**Dynamic**: `false`
+
+**Category**: Metrics
+
+### authenticateMetricsEndpoint
+Whether the '/metrics' endpoint requires authentication. Defaults to false.'authenticationEnabled' must also be set for this to take effect.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Metrics
+
+### exposeBundlesMetricsInPrometheus
+Enable expose the broker bundles metrics.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `true`
+
+**Category**: Metrics
+
+### exposeConsumerLevelMetricsInPrometheus
+If true, export consumer level metrics otherwise namespace level
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Metrics
+
+### exposeCustomTopicMetricLabelsEnabled
+Enable or disable custom topic metric labels feature. If enabled, custom metric labels can be set on topics and will be exposed in metrics. Default is false.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Metrics
+
+### exposeManagedCursorMetricsInPrometheus
+If true, export managed cursor metrics
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Metrics
+
+### exposeManagedLedgerMetricsInPrometheus
+If true, export managed ledger metrics (aggregated by namespace)
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `false`
+
+**Category**: Metrics
+
+### exposePreciseBacklogInPrometheus
+Enable expose the precise backlog stats.
+ Set false to use published counter and consumed counter to calculate,
+ this would be more efficient but may be inaccurate. Default is false.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Metrics
+
+### exposeProducerLevelMetricsInPrometheus
+If true, export producer level metrics otherwise namespace level
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Metrics
+
+### exposePublisherStats
+If true, export publisher stats when returning topics stats from the admin rest api
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `false`
+
+**Category**: Metrics
+
+### exposeSubscriptionBacklogSizeInPrometheus
+Enable expose the backlog size for each subscription when generating stats.
+ Locking is used for fetching the status so default to false.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Metrics
+
+### exposeTopicLevelMetricsInPrometheus
+If true, export topic level metrics otherwise namespace level
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `false`
+
+**Category**: Metrics
+
+### healthCheckMetricsUpdateTimeInSeconds
+HealthCheck update frequency in seconds. Disable health check with value -1 (Default value -1)
+
+**Type**: `int`
+
+**Default**: `-1`
+
+**Dynamic**: `false`
+
+**Category**: Metrics
+
+### jvmGCMetricsLoggerClassName
+Classname of Pluggable JVM GC metrics logger that can log GC specific metrics
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Metrics
+
+### metricsBufferResponse
+Set to true to enable the broker to cache the metrics response; the default is false. The caching period is defined by `managedLedgerStatsPeriodSeconds`. The broker returns the same response for subsequent requests within the same period. Ensure that the scrape interval of your monitoring system matches the caching period.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Metrics
+
+### metricsServletTimeoutMs
+Time in milliseconds that metrics endpoint would time out. Default is 30s.
+ Increase it if there are a lot of topics to expose topic-level metrics.
+ Set it to 0 to disable timeout.
+
+**Type**: `long`
+
+**Default**: `30000`
+
+**Dynamic**: `false`
+
+**Category**: Metrics
+
+### splitTopicAndPartitionLabelInPrometheus
+Enable splitting topic and partition label in Prometheus.
+ If enabled, a topic name will split into 2 parts, one is topic name without partition index,
+ another one is partition index, e.g. (topic=xxx, partition=0).
+ If the topic is a non-partitioned topic, -1 will be used for the partition index.
+ If disabled, one label to represent the topic and partition, e.g. (topic=xxx-partition-0)
+ Default is false.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Metrics
+
+### statsUpdateFrequencyInSecs
+Stats update frequency in seconds
+
+**Type**: `int`
+
+**Default**: `60`
+
+**Dynamic**: `false`
+
+**Category**: Metrics
+
+### statsUpdateInitialDelayInSecs
+Stats update initial delay in seconds
+
+**Type**: `int`
+
+**Default**: `60`
+
+**Dynamic**: `false`
+
+**Category**: Metrics
+
+### enablePackagesManagement
+Enable the packages management service or not
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Packages Management
+
+### packagesManagementAllowLegacyJavaSerialization
+Whether to accept reading legacy Java-serialized package metadata written by older brokers. A strict ObjectInputFilter allowlist is applied unconditionally whenever the legacy path runs. Defaults to true for upgrade compatibility; disable once all existing packages have been re-uploaded or rewritten via updateMeta. This default is scheduled to flip to false in a future release.
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `false`
+
+**Category**: Packages Management
+
+### packagesManagementJsonSerializationEnabled
+Whether new package metadata writes use JSON (safe) or the legacy Java serialization format. Defaults to true. Set to false only as a temporary rollback path; the legacy format will be removed in a future release.
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `false`
+
+**Category**: Packages Management
+
+### packagesManagementLedgerRootPath
+The bookkeeper ledger root path
+
+**Type**: `java.lang.String`
+
+**Default**: `/ledgers`
+
+**Dynamic**: `false`
+
+**Category**: Packages Management
+
+### packagesManagementStorageProvider
+The packages management service storage service provider
+
+**Type**: `java.lang.String`
+
+**Default**: `org.apache.pulsar.packages.management.storage.bookkeeper.BookKeeperPackagesStorageProvider`
+
+**Dynamic**: `false`
+
+**Category**: Packages Management
+
+### packagesReplicas
+When the packages storage provider is bookkeeper, you can use this configuration to
+control the number of replicas for storing the package
+
+**Type**: `int`
+
+**Default**: `1`
+
+**Dynamic**: `false`
+
+**Category**: Packages Management
+
+### activeConsumerFailoverConsistentHashing
+Enable consistent hashing for selecting the active consumer in partitioned topics with Failover subscription type.For non-partitioned topics, consistent hashing is used by default.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### activeConsumerFailoverDelayTimeMillis
+How long to delay rewinding cursor and dispatching messages when active consumer is changed
+
+**Type**: `int`
+
+**Default**: `1000`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### additionalSystemCursorNames
+Additional system subscriptions that will be ignored by ttl check. The cursor names are comma separated. Default is empty.
+
+**Type**: `java.util.Set`
+
+**Default**: `[]`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### backlogQuotaCheckEnabled
+Enable backlog quota check. Enforces actions on topic when the quota is reached
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### backlogQuotaCheckIntervalInSeconds
+How often to check for topics that have reached the quota. It only takes effects when `backlogQuotaCheckEnabled` is true
+
+**Type**: `int`
+
+**Default**: `60`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### backlogQuotaDefaultLimitBytes
+Default per-topic backlog quota limit by size, less than 0 means no limitation. default is -1. Increase it if you want to allow larger msg backlog
+
+**Type**: `long`
+
+**Default**: `-1`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### backlogQuotaDefaultLimitGB
+@deprecated - Use backlogQuotaDefaultLimitBytes instead.
+
+**Type**: `double`
+
+**Default**: `-1.0`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### backlogQuotaDefaultLimitSecond
+Default per-topic backlog quota limit by time in second, less than 0 means no limitation. default is -1. Increase it if you want to allow larger msg backlog
+
+**Type**: `int`
+
+**Default**: `-1`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### backlogQuotaDefaultRetentionPolicy
+Default backlog quota retention policy. Default is producer_request_hold
+
+'producer_request_hold' Policy which holds producer's send request until theresource becomes available (or holding times out)
+'producer_exception' Policy which throws javax.jms.ResourceAllocationException to the producer
+'consumer_backlog_eviction' Policy which evicts the oldest message from the slowest consumer's backlog
+
+**Type**: `org.apache.pulsar.common.policies.data.BacklogQuota.RetentionPolicy`
+
+**Default**: `producer_request_hold`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### brokerDeduplicationEnabled
+Set the default behavior for message deduplication in the broker.
+
+This can be overridden per-namespace. If enabled, broker will reject messages that were already stored in the topic
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### brokerDeduplicationEntriesInterval
+Number of entries after which a dedup info snapshot is taken.
+
+A bigger interval will lead to less snapshots being taken though it would increase the topic recovery time, when the entries published after the snapshot need to be replayed
+
+**Type**: `int`
+
+**Default**: `1000`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### brokerDeduplicationMaxNumberOfProducers
+Maximum number of producer information that it's going to be persisted for deduplication purposes
+
+**Type**: `int`
+
+**Default**: `10000`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### brokerDeduplicationProducerInactivityTimeoutMinutes
+Time of inactivity after which the broker will discard the deduplication information relative to a disconnected producer. Default is 6 hours.
+
+**Type**: `int`
+
+**Default**: `360`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### brokerDeduplicationSnapshotFrequencyInSeconds
+How often is the thread pool scheduled to check whether a snapshot needs to be taken.(disable with value 0)
+
+**Type**: `int`
+
+**Default**: `120`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### brokerDeduplicationSnapshotIntervalSeconds
+If this time interval is exceeded, a snapshot will be taken.It will run simultaneously with `brokerDeduplicationEntriesInterval`
+
+**Type**: `java.lang.Integer`
+
+**Default**: `120`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### brokerDeleteInactivePartitionedTopicMetadataEnabled
+Metadata of inactive partitioned topic will not be automatically cleaned up by default.
+Note 1: If `allowAutoTopicCreation` and this option are enabled at the same time,
+it may appear that a partitioned topic has just been deleted but is automatically created as a non-partitioned topic.
+Note 2: Activating bidirectional geo-replication under global ZooKeeper configuration may lead to schema remnants and abnormal topic-level policies.
+Note 3: Activating bidirectional geo-replication under global configuration ZooKeeper may lead to a consumption issue.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### brokerDeleteInactiveTopicsEnabled
+Enable the deletion of inactive topics.
+If only enable this option, will not clean the metadata of partitioned topic.
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### brokerDeleteInactiveTopicsFrequencySeconds
+How often to check for inactive topics
+
+**Type**: `int`
+
+**Default**: `60`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### brokerDeleteInactiveTopicsMaxInactiveDurationSeconds
+Max duration of topic inactivity in seconds, default is not present
+If not present, 'brokerDeleteInactiveTopicsFrequencySeconds' will be used
+Topics that are inactive for longer than this value will be deleted
+
+**Type**: `java.lang.Integer`
+
+**Default**: `null`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### brokerDeleteInactiveTopicsMode
+Set the inactive topic delete mode. Default is delete_when_no_subscriptions
+'delete_when_no_subscriptions' mode only delete the topic which has no subscriptions and no active producers
+'delete_when_subscriptions_caught_up' mode only delete the topic that all subscriptions has no backlogs(caught up) and no active producers/consumers
+
+**Type**: `org.apache.pulsar.common.policies.data.InactiveTopicDeleteMode`
+
+**Default**: `delete_when_no_subscriptions`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### brokerMaxConnections
+The maximum number of connections in the broker. If it exceeds, new connections are rejected.
+
+**Type**: `int`
+
+**Default**: `0`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### brokerMaxConnectionsPerIp
+The maximum number of connections per IP. If it exceeds, new connections are rejected.
+
+**Type**: `int`
+
+**Default**: `0`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### defaultNumberOfNamespaceBundles
+When a namespace is created without specifying the number of bundle, this value will be used as the default
+
+**Type**: `int`
+
+**Default**: `4`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### defaultRetentionSizeInMB
+Default retention size. 0 means retention is disabled. -1 means data is not removed by size quota
+
+**Type**: `int`
+
+**Default**: `0`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### defaultRetentionTimeInMinutes
+Default message retention time. 0 means retention is disabled. -1 means data is not removed by time quota
+
+**Type**: `int`
+
+**Default**: `0`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### dispatchThrottlingOnBatchMessageEnabled
+Apply dispatch rate limiting on batch message instead individual messages with in batch message. (Default is disabled)
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### dispatchThrottlingOnNonBacklogConsumerEnabled
+Default dispatch-throttling is disabled for consumers which already caught-up with published messages and don't have backlog. This enables dispatch-throttling for non-backlog consumers as well.
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### dispatchThrottlingRatePerReplicatorInByte
+Default number of message-bytes dispatching throttling-limit for every replicator in replication.
+
+Using a value of 0, is disabling replication message-byte dispatch-throttling
+
+**Type**: `long`
+
+**Default**: `0`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### dispatchThrottlingRatePerReplicatorInMsg
+Default number of message dispatching throttling-limit for every replicator in replication.
+
+Using a value of 0, is disabling replication message dispatch-throttling
+
+**Type**: `int`
+
+**Default**: `0`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### dispatchThrottlingRatePerSubscriptionInByte
+Default number of message-bytes dispatching throttling-limit for a subscription.
+
+Using a value of 0, is disabling default message-byte dispatch-throttling.
+
+**Type**: `long`
+
+**Default**: `0`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### dispatchThrottlingRatePerSubscriptionInMsg
+Default number of message dispatching throttling-limit for a subscription.
+
+Using a value of 0, is disabling default message dispatch-throttling.
+
+**Type**: `int`
+
+**Default**: `0`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### dispatchThrottlingRatePerTopicInByte
+Default number of message-bytes dispatching throttling-limit for every topic.
+
+Using a value of 0, is disabling default message-byte dispatch-throttling
+
+**Type**: `long`
+
+**Default**: `0`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### dispatchThrottlingRatePerTopicInMsg
+Default number of message dispatching throttling-limit for every topic.
+
+Using a value of 0, is disabling default message dispatch-throttling
+
+**Type**: `int`
+
+**Default**: `0`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### dispatchThrottlingRateRelativeToPublishRate
+Dispatch rate-limiting relative to publish rate. (Enabling flag will make broker to dynamically update dispatch-rate relatively to publish-rate: throttle-dispatch-rate = (publish-rate + configured dispatch-rate)
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### dispatcherRetryBackoffInitialTimeInMs
+On Shared and KeyShared subscriptions, if all available messages in the subscription are filtered out and not dispatched to any consumer, message dispatching will be rescheduled with a backoff delay. This parameter sets the initial backoff delay in milliseconds.
+
+**Type**: `int`
+
+**Default**: `1`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### dispatcherRetryBackoffMaxTimeInMs
+On Shared and KeyShared subscriptions, if all available messages in the subscription are filtered out and not dispatched to any consumer, message dispatching will be rescheduled with a backoff delay. This parameter sets the maximum backoff delay in milliseconds.
+
+**Type**: `int`
+
+**Default**: `10`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### enableBrokerSideSubscriptionPatternEvaluation
+Enables evaluating subscription pattern on broker side. Note: This config no longer controls watching topic list. Please use `enableBrokerTopicListWatcher` to control that behavior.
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### enableBrokerTopicListWatcher
+Enables watching topic add/remove events on broker side for subscription pattern evaluation.
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### forceDeleteNamespaceAllowed
+Allow forced deletion of namespaces. Default is false.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### forceDeleteTenantAllowed
+Allow forced deletion of tenants. Default is false.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### isAllowAutoUpdateSchemaEnabled
+Allow schema to be auto updated at broker level. User can override this by 'is_allow_auto_update_schema' of namespace policy. This is enabled by default.
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### keySharedLookAheadMsgInReplayThresholdPerConsumer
+For Key_Shared subscriptions, if messages cannot be dispatched to consumers due to a slow consumer or a blocked key hash (because of ordering constraints), the broker will continue reading more messages from the backlog and attempt to dispatch them to consumers until the number of replay messages reaches the calculated threshold.
+Formula: threshold = min(keySharedLookAheadMsgInReplayThresholdPerConsumer * connected consumer count, keySharedLookAheadMsgInReplayThresholdPerSubscription).
+Setting this value to 0 will disable the limit calculated per consumer.
+
+**Type**: `int`
+
+**Default**: `4000`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### keySharedLookAheadMsgInReplayThresholdPerSubscription
+For Key_Shared subscriptions, if messages cannot be dispatched to consumers due to a slow consumer or a blocked key hash (because of ordering constraints), the broker will continue reading more messages from the backlog and attempt to dispatch them to consumers until the number of replay messages reaches the calculated threshold.
+Formula: threshold = min(keySharedLookAheadMsgInReplayThresholdPerConsumer * connected consumer count, keySharedLookAheadMsgInReplayThresholdPerSubscription).
+Keep this value relatively low to increase the cache hit ratio for Key_Shared replay queue reads; it should also be less than 2 * managedLedgerMaxUnackedRangesToPersist.
+However, with workloads that have low key cardinality (few distinct keys), a low value can leave some consumers idle, since the dispatcher pauses once this threshold is reached and stops reading new messages for the other consumers; increasing the value allows more messages to be in flight in such cases. Since the effective threshold is the minimum of the per-consumer and per-subscription limits, keySharedLookAheadMsgInReplayThresholdPerConsumer should also be increased, or set to 0 (dis [...]
+Setting this value to 0 will disable the limit calculated per subscription. Disabling it might result in the number of unacked ranges to persist exceeding managedLedgerMaxUnackedRangesToPersist, therefore disabling is not recommended.
+
+
+**Type**: `int`
+
+**Default**: `40000`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### keySharedUnblockingIntervalMs
+For Key_Shared subscriptions, when a blocked key hash gets unblocked, a redelivery will be attempted after a delay. This setting controls the delay. The reason to have the delay is to batch multiple unblocking events instead of triggering redelivery for each unblocking event.
+
+**Type**: `long`
+
+**Default**: `10`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### maxConsumerMetadataSize
+Maximum size of Consumer metadata
+
+**Type**: `int`
+
+**Default**: `1024`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### maxNamespacesPerTenant
+The maximum number of namespaces that each tenant can create.This configuration is not precise control, in a concurrent scenario, the threshold will be exceeded
+
+**Type**: `int`
+
+**Default**: `0`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### maxPendingPublishRequestsPerConnection
+Max pending publish requests per connection to avoid keeping large number of pending requests in memory. Default: 1000
+
+**Type**: `int`
+
+**Default**: `1000`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### maxSecondsToClearTopicNameCache
+A Specifies the minimum number of seconds that the topic name stays in memory, to avoid clear cache frequently when there are too many topics are in use.
+
+**Type**: `int`
+
+**Default**: `7200`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### maxTopicsPerNamespace
+Max number of topics allowed to be created in the namespace. When the topics reach the max topics of the namespace, the broker should reject the new topic request(include topic auto-created by the producer or consumer) until the number of connected consumers decrease. Using a value of 0, is disabling maxTopicsPerNamespace-limit check.
+
+**Type**: `int`
+
+**Default**: `0`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### maxUnackedMessagesPerBroker
+Max number of unacknowledged messages allowed per broker.
+
+ Once this limit reaches, broker will stop dispatching messages to all shared subscription which has higher number of unack messages until subscriptions start acknowledging messages back and unack count reaches to `limit/2`. Using a value of 0, is disabling unackedMessage-limit check and broker doesn't block dispatchers
+
+**Type**: `int`
+
+**Default**: `0`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### maxUnackedMessagesPerConsumer
+Max number of unacknowledged messages allowed to receive messages by a consumer on a shared subscription.
+
+ Broker will stop sending messages to consumer once, this limit reaches until consumer starts acknowledging messages back and unack count reaches to `maxUnackedMessagesPerConsumer/2`. Using a value of 0, it is disabling unackedMessage-limit check and consumer can receive messages without any restriction
+
+**Type**: `int`
+
+**Default**: `50000`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### maxUnackedMessagesPerSubscription
+Max number of unacknowledged messages allowed per shared subscription.
+
+ Broker will stop dispatching messages to all consumers of the subscription once this limit reaches until consumer starts acknowledging messages back and unack count reaches to `limit/2`. Using a value of 0, is disabling unackedMessage-limit check and dispatcher can dispatch messages without any restriction
+
+**Type**: `int`
+
+**Default**: `200000`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### maxUnackedMessagesPerSubscriptionOnBrokerBlocked
+Once broker reaches maxUnackedMessagesPerBroker limit, it blocks subscriptions which has higher unacked messages than this percentage limit and subscription will not receive any new messages until that subscription acks back `limit/2` messages
+
+**Type**: `double`
+
+**Default**: `0.16`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### messageExpiryCheckIntervalInMinutes
+How frequently to proactively check and purge expired messages
+
+**Type**: `int`
+
+**Default**: `5`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### preciseTimeBasedBacklogQuotaCheck
+Whether to enable precise time based backlog quota check. Enabling precise time based backlog quota check will cause broker to read first entry in backlog of the slowest cursor on a ledger which will mostly result in reading entry from BookKeeper's disk which can have negative impact on overall performance. Disabling precise time based backlog quota check will just use the timestamp indicating when a ledger was closed, which is of coarser granularity.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### pulsarChannelPauseReceivingCooldownMs
+After the connection is recovered from a pause receiving state, the channel will be rate-limited for a time window to avoid overwhelming due to the backlog of requests. This parameter defines how long the rate limiting should last, in millis. Once the bytes that are waiting to be sent out reach the "pulsarChannelWriteBufferHighWaterMark", the timer will be reset. Setting a negative value will disable the rate limiting.
+
+**Type**: `int`
+
+**Default**: `5000`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### pulsarChannelPauseReceivingCooldownRateLimitPeriodMs
+After the connection is recovered from a pause receiving state, the channel will be rate-limited for a period of time defined by pulsarChannelPauseReceivingCooldownMs to avoid overwhelming due to the backlog of requests. This parameter defines the period of the rate limiter in milliseconds. If the rate limit period is set to 1000, then the unit is requests per 1000 milliseconds. When it's 10, the unit is requests per every 10ms.
+
+**Type**: `int`
+
+**Default**: `10`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### pulsarChannelPauseReceivingCooldownRateLimitPermits
+After the connection is recovered from a pause receiving state, the channel will be rate-limited for a period of time to avoid overwhelming due to the backlog of requests. This parameter defines how many requests should be allowed in the rate limiting period.
+
+**Type**: `int`
+
+**Default**: `5`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### pulsarChannelPauseReceivingRequestsIfUnwritable
+If enabled, the broker will pause reading from the channel to deal with new request once the writer buffer is full, until it is changed to writable.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### pulsarChannelWriteBufferHighWaterMark
+It relates to configuration "WriteBufferHighWaterMark" of Netty Channel Config. If the number of bytes queued in the write buffer exceeds this value, channel writable state will start to return "false".
+
+**Type**: `int`
+
+**Default**: `65536`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### pulsarChannelWriteBufferLowWaterMark
+It relates to configuration "WriteBufferLowWaterMark" of Netty Channel Config. If the number of bytes queued in the write buffer is smaller than this value, channel writable state will start to return "true".
+
+**Type**: `int`
+
+**Default**: `32768`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### resourceUsageTransportClassName
+Default policy for publishing usage reports to system topic is disabled.This enables publishing of usage reports
+
+**Type**: `java.lang.String`
+
+**Default**: ``
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### resourceUsageTransportPublishIntervalInSecs
+Interval (in seconds) for ResourceGroupService periodic tasks while resource groups are actively attached to tenants or namespaces. Periodic tasks start automatically when the first attachment is registered and stop automatically when no attachments remain. If a ResourceUsageTransportManager is configured (see resourceUsageTransportClassName), this interval also controls how frequently, usage reports are published for cross-broker coordination. Dynamic changes take effect at runtime and [...]
+
+**Type**: `int`
+
+**Default**: `60`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### scalableTopicAutoScaleEnabled
+Cluster-wide default for scalable-topic auto split/merge. When true, the controller leader automatically splits hot segments and merges cold ones, within the caps below. Can be overridden per-namespace and per-topic.
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### scalableTopicAutoScaleIntervalSeconds
+Cadence (seconds) of the controller's periodic traffic-driven auto split/merge evaluation. Consumer-count changes are handled event-driven and are not affected by this interval. Read when a controller wins leadership; not dynamic.
+
+**Type**: `int`
+
+**Default**: `60`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### scalableTopicConsumerSessionGracePeriodSeconds
+Grace period (seconds) the controller leader waits for a disconnected scalable-topic consumer to reconnect with the same consumer name before evicting its session and reassigning its segments to remaining consumers.
+
+**Type**: `int`
+
+**Default**: `60`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### scalableTopicLoadReportIntervalSeconds
+Interval (seconds) at which the segment-owning broker samples its segment topics to report load for auto split/merge. Read at broker start; not dynamic.
+
+**Type**: `int`
+
+**Default**: `10`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### scalableTopicLoadReportRateChangeThreshold
+Minimum relative change in any segment rate (e.g. 0.25 = 25%) since the last write that triggers a new load record. Keeps metadata write volume bounded; a steady-state segment writes once and goes quiet.
+Note: the band is anchored at the last written value, not at the split/merge thresholds. A rate that settles within the band of the last record is never re-reported, so a segment can sustain up to this factor beyond a split/merge threshold without triggering — the cost of bounded write volume. Lower the threshold for tighter tracking at the price of more metadata writes.
+
+**Type**: `double`
+
+**Default**: `0.25`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### scalableTopicMaxDagDepth
+Max number of merges allowed in a segment's lineage. Once a segment reaches this depth it stops being a merge candidate (load-driven splits are still allowed), bounding split/merge flip-flopping.
+
+**Type**: `int`
+
+**Default**: `10`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### scalableTopicMaxSegments
+Hard ceiling on the number of active segments a scalable topic can be auto-scaled to. Splits stop firing once this is reached.
+
+**Type**: `int`
+
+**Default**: `64`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### scalableTopicMergeBytesRateInThreshold
+Inbound bytes/second below which a segment counts as cold for merging.
+
+**Type**: `long`
+
+**Default**: `5000000`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### scalableTopicMergeBytesRateOutThreshold
+Outbound bytes/second below which a segment counts as cold for merging.
+
+**Type**: `long`
+
+**Default**: `25000000`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### scalableTopicMergeCooldownSeconds
+Minimum time (seconds) between automatic merges on a topic.
+
+**Type**: `int`
+
+**Default**: `300`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### scalableTopicMergeMsgRateInThreshold
+Inbound messages/second below which a segment counts as cold for merging.
+
+**Type**: `double`
+
+**Default**: `1000.0`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### scalableTopicMergeMsgRateOutThreshold
+Outbound messages/second below which a segment counts as cold for merging.
+
+**Type**: `double`
+
+**Default**: `5000.0`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### scalableTopicMergeWindowSeconds
+How long (seconds) a segment must continuously stay below every merge threshold before it becomes merge-eligible.
+
+**Type**: `int`
+
+**Default**: `300`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### scalableTopicMinSegments
+Hard floor on the number of active segments. Merges stop firing once this is reached.
+
+**Type**: `int`
+
+**Default**: `1`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### scalableTopicSplitBytesRateInThreshold
+Inbound bytes/second above which a segment is split.
+
+**Type**: `long`
+
+**Default**: `50000000`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### scalableTopicSplitBytesRateOutThreshold
+Outbound bytes/second above which a segment is split.
+
+**Type**: `long`
+
+**Default**: `250000000`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### scalableTopicSplitCooldownSeconds
+Minimum time (seconds) between automatic splits on a topic. Deliberately short — it only coalesces a burst of near-simultaneous triggers (e.g. a consumer group connecting at once).
+
+**Type**: `int`
+
+**Default**: `60`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### scalableTopicSplitMsgRateInThreshold
+Inbound messages/second above which a segment is split.
+
+**Type**: `double`
+
+**Default**: `10000.0`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### scalableTopicSplitMsgRateOutThreshold
+Outbound (dispatched) messages/second above which a segment is split.
+
+**Type**: `double`
+
+**Default**: `50000.0`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### scalableTopicsEnabled
+Enables the scalable-topics V5 API on this broker. When disabled, the broker advertises supports_scalable_topics=false in CommandConnected feature flags and rejects scalable-topic commands from clients.
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### subscribeRatePeriodPerConsumerInSecond
+Rate period for {subscribeThrottlingRatePerConsumer}. Default is 30s.
+
+**Type**: `int`
+
+**Default**: `30`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### subscribeThrottlingRatePerConsumer
+Too many subscribe requests from a consumer can cause broker rewinding consumer cursors and loading data from bookies, hence causing high network bandwidth usage When the positive value is set, broker will throttle the subscribe requests for one consumer. Otherwise, the throttling will be disabled. The default value of this setting is 0 - throttling is disabled.
+
+**Type**: `int`
+
+**Default**: `0`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### subscriptionBacklogScanMaxEntries
+Maximum number of entries to process while scanning a subscription to calculate the accurate backlog
+
+**Type**: `long`
+
+**Default**: `10000`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### subscriptionBacklogScanMaxTimeMs
+Maximum time to spend while scanning a subscription to calculate the accurate backlog
+
+**Type**: `long`
+
+**Default**: `120000`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### subscriptionExpirationTimeMinutes
+How long to delete inactive subscriptions from last consuming. When it is 0, inactive subscriptions are not deleted automatically
+
+**Type**: `int`
+
+**Default**: `0`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### subscriptionExpiryCheckIntervalInMinutes
+How frequently to proactively check and purge expired subscription
+
+**Type**: `int`
+
+**Default**: `5`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### subscriptionKeySharedConsistentHashingReplicaPoints
+On KeyShared subscriptions, number of points in the consistent-hashing ring. The higher the number, the more equal the assignment of keys to consumers
+
+**Type**: `int`
+
+**Default**: `100`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### subscriptionKeySharedEnable
+Enable Key_Shared subscription (default is enabled).
+@deprecated - use subscriptionTypesEnabled instead.
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### subscriptionKeySharedUseClassicPersistentImplementation
+For persistent Key_Shared subscriptions, enables the use of the classic implementation of the Key_Shared subscription that was used before Pulsar 4.0.0 and PIP-379.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### subscriptionKeySharedUseConsistentHashing
+On KeyShared subscriptions, with default AUTO_SPLIT mode, use splitting ranges or consistent hashing to reassign keys to new consumers (default is consistent hashing)
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### subscriptionPatternMaxLength
+Max length of subscription pattern
+
+**Type**: `int`
+
+**Default**: `50`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### subscriptionRedeliveryTrackerEnabled
+Enable subscription message redelivery tracker to send redelivery count to consumer (default is enabled)
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### subscriptionSharedUseClassicPersistentImplementation
+For persistent Shared subscriptions, enables the use of the classic implementation of the Shared subscription that was used before Pulsar 4.0.0.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### subscriptionTypesEnabled
+Enable subscription types (default is all type enabled)
+
+**Type**: `java.util.Set`
+
+**Default**: `[Failover, Shared, Key_Shared, Exclusive]`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### topicNameCacheMaxCapacity
+Max capacity of the topic name cache. -1 means unlimited cache; 0 means broker will clear all cache per maxSecondsToClearTopicNameCache, it does not mean broker will not cache TopicName.
+
+**Type**: `int`
+
+**Default**: `100000`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### topicPublisherThrottlingTickTimeMillis
+Tick time to schedule task that checks topic publish rate limiting across all topics Reducing to lower value can give more accuracy while throttling publish but it uses more CPU to perform frequent check. (Disable publish throttling with value 0)
+
+**Type**: `int`
+
+**Default**: `10`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### ttlDurationDefaultInSeconds
+Default ttl for namespaces if ttl is not already configured at namespace policies. (disable default-ttl with value 0)
+
+**Type**: `int`
+
+**Default**: `0`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### unblockStuckSubscriptionEnabled
+Broker periodically checks if subscription is stuck and unblock if flag is enabled. (Default is disabled)
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `true`
+
+**Category**: Policies
+
+### messagingProtocols
+List of messaging protocols to load, which is a list of protocol names
+
+**Type**: `java.util.Set`
+
+**Default**: `[]`
+
+**Dynamic**: `false`
+
+**Category**: Protocols
+
+### protocolHandlerDirectory
+The directory to locate messaging protocol handlers
+
+**Type**: `java.lang.String`
+
+**Default**: `./protocols`
+
+**Dynamic**: `false`
+
+**Category**: Protocols
+
+### useSeparateThreadPoolForProtocolHandlers
+Use a separate ThreadPool for each Protocol Handler
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `false`
+
+**Category**: Protocols
+
+### brokerClientTlsEnabled
+Enable TLS when talking with other brokers in the same cluster (admin operation) or different clusters (replication)
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `true`
+
+**Category**: Replication
+
+### createTopicToRemoteClusterForReplication
+Whether the internal replicator will trigger topic auto-creation on the remote cluster.
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `false`
+
+**Category**: Replication
+
+### replicationConnectionsPerBroker
+Max number of connections to open for each broker in a remote cluster.
+
+More connections host-to-host lead to better throughput over high-latency links
+
+**Type**: `int`
+
+**Default**: `16`
+
+**Dynamic**: `false`
+
+**Category**: Replication
+
+### replicationMetricsEnabled
+Enable replication metrics
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `false`
+
+**Category**: Replication
+
+### replicationPolicyCheckDurationSeconds
+Duration to check replication policy to avoid replicator inconsistency due to missing ZooKeeper watch (disable with value 0)
+
+**Type**: `int`
+
+**Default**: `600`
+
+**Dynamic**: `false`
+
+**Category**: Replication
+
+### replicationProducerQueueSize
+Replicator producer queue size. When dynamically modified, it only takes effect for the newly added replicators
+
+**Type**: `int`
+
+**Default**: `1000`
+
+**Dynamic**: `true`
+
+**Category**: Replication
+
+### replicatorPrefix
+replicator prefix used for replicator producer name and cursor name
+
+**Type**: `java.lang.String`
+
+**Default**: `pulsar.repl`
+
+**Dynamic**: `false`
+
+**Category**: Replication
+
+### inflightSaslContextExpiryMs
+how often the broker expires the inflight SASL context.
+
+**Type**: `long`
+
+**Default**: `30000`
+
+**Dynamic**: `false`
+
+**Category**: SASL Authentication Provider
+
+### kinitCommand
+kerberos kinit command.
+
+**Type**: `java.lang.String`
+
+**Default**: `/usr/bin/kinit`
+
+**Dynamic**: `false`
+
+**Category**: SASL Authentication Provider
+
+### maxInflightSaslContext
+Maximum number of inflight sasl context.
+
+**Type**: `long`
+
+**Default**: `50000`
+
+**Dynamic**: `false`
+
+**Category**: SASL Authentication Provider
+
+### saslJaasClientAllowedIds
+This is a regexp, which limits the range of possible ids which can connect to the Broker using SASL.
+ Default value is: ".*pulsar.*", so only clients whose id contains 'pulsar' are allowed to connect.
+
+**Type**: `java.lang.String`
+
+**Default**: `.*pulsar.*`
+
+**Dynamic**: `false`
+
+**Category**: SASL Authentication Provider
+
+### saslJaasServerRoleTokenSignerSecretPath
+Path to file containing the secret to be used to SaslRoleTokenSigner
+The secret can be specified like:
+saslJaasServerRoleTokenSignerSecretPath=file:///my/saslRoleTokenSignerSecret.key.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: SASL Authentication Provider
+
+### saslJaasServerSectionName
+Service Principal, for login context name. Default value is "PulsarBroker".
+
+**Type**: `java.lang.String`
+
+**Default**: `PulsarBroker`
+
+**Dynamic**: `false`
+
+**Category**: SASL Authentication Provider
+
+### isSchemaValidationEnforced
+Enforce schema validation on following cases:
+
+ - if a producer without a schema attempts to produce to a topic with schema, the producer will be
+ failed to connect. PLEASE be carefully on using this, since non-java clients don't support schema.
+ if you enable this setting, it will cause non-java clients failed to produce.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Schema
+
+### schemaCompatibilityStrategy
+The schema compatibility strategy in broker level
+
+**Type**: `org.apache.pulsar.common.policies.data.SchemaCompatibilityStrategy`
+
+**Default**: `FULL`
+
+**Dynamic**: `false`
+
+**Category**: Schema
+
+### schemaJsonAllowLegacyJacksonFormat
+Whether to allow legacy Jackson JsonSchema format for SchemaType.JSON schema definitions. When false (default), only valid Apache Avro schema format is accepted for SchemaType.JSON, consistent with what the consumer side requires. When true, the pre-2.1 backward-compatible behavior is preserved for deployments that still have topics with legacy-format schemas. See PIP-464 for details.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Schema
+
+### schemaRegistryCompatibilityCheckers
+The list compatibility checkers to be used in schema registry
+
+**Type**: `java.util.Set`
+
+**Default**: `[org.apache.pulsar.broker.service.schema.ExternalSchemaCompatibilityCheck, org.apache.pulsar.broker.service.schema.ProtobufNativeSchemaCompatibilityCheck, org.apache.pulsar.broker.service.schema.JsonSchemaCompatibilityCheck, org.apache.pulsar.broker.service.schema.AvroSchemaCompatibilityCheck]`
+
+**Dynamic**: `false`
+
+**Category**: Schema
+
+### schemaRegistryStorageClassName
+The schema storage implementation used by this broker
+
+**Type**: `java.lang.String`
+
+**Default**: `org.apache.pulsar.broker.service.schema.BookkeeperSchemaStorageFactory`
+
+**Dynamic**: `false`
+
+**Category**: Schema
+
+### systemTopicSchemaCompatibilityStrategy
+The schema compatibility strategy to use for system topics
+
+**Type**: `org.apache.pulsar.common.policies.data.SchemaCompatibilityStrategy`
+
+**Default**: `ALWAYS_COMPATIBLE`
+
+**Dynamic**: `false`
+
+**Category**: Schema
+
+### acknowledgmentAtBatchIndexLevelEnabled
+Whether to enable the acknowledge of batch local index
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### advertisedAddress
+Hostname or IP advertised to clients for the internal listener. Combined with the *Port properties it forms the internal listener's advertised URLs (e.g. `pulsar://<advertisedAddress\>:<brokerServicePort\>`). If not set, defaults to `InetAddress.getLocalHost().getCanonicalHostName()`.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### advertisedListeners
+Declares additional advertised listeners — typically external listeners that complement the internal one.
+ Format: comma-separated `<listener_name\>:<scheme\>://<host\>:<port\>` entries. Supported schemes: `pulsar`, `pulsar+ssl`, `http`, `https`. A listener name may be repeated to declare multiple schemes for the same listener.
+ The internal listener is auto-configured from `advertisedAddress` plus the *Port properties (`brokerServicePort` / `brokerServicePortTls` / `webServicePort` / `webServicePortTls`) so it does not need an entry here. URLs declared here under `internalListenerName` do override that auto-configured listener, but this is not recommended because it can route cluster-internal traffic through an external endpoint (for example, an external load balancer).
+ Legacy fallback: when `internalListenerName` is left blank, the first listener parsed from this property is used as the internal listener (so in that case its entry here is required).
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### allowAclChangesOnNonExistentTopics
+Opt-out of topic-existence check when setting permissions
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### allowOverrideEntryFilters
+Whether allow topic level entry filters policies overrides broker configuration.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `true`
+
+**Category**: Server
+
+### authenticationRoleLoggingAnonymizer
+Defines how the broker will anonymize the role and originalAuthRole before logging. Possible values are: NONE (no anonymization), REDACTED (replaces with '[REDACTED]'), hash:SHA256 (hashes using SHA-256), and hash:MD5 (hashes using MD5). Default is NONE.
+
+**Type**: `java.lang.String`
+
+**Default**: `NONE`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### bindAddress
+Local network interface IP for the internal listener's port bindings. Use a specific local IP to bind to a single interface, or `0.0.0.0` to bind on all interfaces. Default is `0.0.0.0`.
+
+**Type**: `java.lang.String`
+
+**Default**: `0.0.0.0`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### bindAddresses
+Per-listener socket bindings.
+ The internal listener's bindings are derived automatically from `bindAddress` plus the port properties (`brokerServicePort` / `brokerServicePortTls` / `webServicePort` / `webServicePortTls`) and do not need to be repeated here.
+ PIP-95 smart listener selection routes a connection to the listener whose port it arrived on. For the Pulsar binary protocol (`pulsar` / `pulsar+ssl`) this is optional — clients can also pass an explicit `listenerName`. For the HTTP/HTTPS Admin API (`http` / `https`) it is the only routing mechanism, so every HTTP/HTTPS advertised listener reachable from outside the cluster needs a dedicated entry here on a unique port. This lets a layer-4 TCP load balancer serve the Admin API directly [...]
+ Format: comma-separated `<listener_name\>:<scheme\>://<ip\>:<port\>` entries. Supported schemes: `pulsar`, `pulsar+ssl`, `http`, `https`. The `<ip\>` part selects which local network interface the port binds to: use a specific local IP, or `0.0.0.0` to bind on all interfaces. A local hostname is also accepted but not recommended.
+ Each `ip:port` may be bound by exactly one (listener, scheme) pair. An entry that exactly matches the auto-derived internal-listener binding is tolerated; assigning the same `ip:port` to a different listener or scheme fails validation.
+ Port `0` (OS-assigned ephemeral port) is supported only for the internal listener.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### bootstrapNamespaces
+A comma-separated list of namespaces to bootstrap
+
+**Type**: `java.util.List`
+
+**Default**: `[]`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### brokerEntryMetadataInterceptors
+List of interceptors for entry metadata.
+
+**Type**: `java.util.Set`
+
+**Default**: `[]`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### brokerEntryPayloadProcessors
+List of interceptors for payload processing.
+
+**Type**: `java.util.Set`
+
+**Default**: `[]`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### brokerInterceptors
+List of broker interceptor to load, which is a list of broker interceptor names
+
+**Type**: `java.util.Set`
+
+**Default**: `[]`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### brokerInterceptorsDirectory
+The directory to locate broker interceptors
+
+**Type**: `java.lang.String`
+
+**Default**: `./interceptors`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### brokerPublisherThrottlingMaxByteRate
+Max Rate(in 1 seconds) of Byte allowed to publish for a broker when broker publish rate limiting enabled. (Disable byte rate limit with value 0)
+
+**Type**: `long`
+
+**Default**: `0`
+
+**Dynamic**: `true`
+
+**Category**: Server
+
+### brokerPublisherThrottlingMaxMessageRate
+Max Rate(in 1 seconds) of Message allowed to publish for a broker when broker publish rate limiting enabled. (Disable message rate limit with value 0)
+
+**Type**: `int`
+
+**Default**: `0`
+
+**Dynamic**: `true`
+
+**Category**: Server
+
+### brokerPublisherThrottlingTickTimeMillis
+Tick time to schedule task that checks broker publish rate limiting across all topics Reducing to lower value can give more accuracy while throttling publish but it uses more CPU to perform frequent check. (Disable publish throttling with value 0)
+
+**Type**: `int`
+
+**Default**: `50`
+
+**Dynamic**: `true`
+
+**Category**: Server
+
+### brokerServiceCompactionMonitorIntervalInSeconds
+Interval between checks to see if topics with compaction policies need to be compacted
+
+**Type**: `int`
+
+**Default**: `60`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### brokerServiceCompactionPhaseOneLoopTimeInSeconds
+Timeout for each read request in the compaction phase one loop, If the execution time of one single message read operation exceeds this time, the compaction will not proceed.
+
+**Type**: `long`
+
+**Default**: `30`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### brokerServiceCompactionThresholdInBytes
+The estimated backlog size is greater than this threshold, compression will be triggered.
+Using a value of 0, is disabling compression check.
+
+**Type**: `long`
+
+**Default**: `0`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### brokerServicePort
+Port for the Pulsar binary protocol of the internal listener. The same port number is used both for the local socket binding (with `bindAddress`) and for the advertised URL (with `advertisedAddress`), so no entry in `advertisedListeners` or `bindAddresses` is required for the internal listener. Default is 6650.
+
+**Type**: `java.util.Optional`
+
+**Default**: `Optional[6650]`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### brokerServicePortTls
+Port for the Pulsar binary protocol TLS endpoint of the internal listener. Used both for the local socket binding and the advertised URL. By default TLS is disabled.
+
+**Type**: `java.util.Optional`
+
+**Default**: `Optional.empty`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### brokerShutdownTimeoutMs
+Time to wait for broker graceful shutdown. After this time elapses, the process will be killed
+
+**Type**: `long`
+
+**Default**: `60000`
+
+**Dynamic**: `true`
+
+**Category**: Server
+
+### clientLibraryVersionCheckEnabled
+Enable check for minimum allowed client library version
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `true`
+
+**Category**: Server
+
+### clusterMigrationAutoResourceCreation
+Flag to start cluster migration for topic only after creating all topic's resources such as tenant, namespaces, subscriptions at new green cluster. (Default disabled).
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### clusterMigrationCheckDurationSeconds
+Interval between checks to see if cluster is migrated and marks topic migrated if cluster is marked migrated. Disable with value 0. (Default disabled).
+
+**Type**: `int`
+
+**Default**: `0`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### compactionServiceFactoryClassName
+The class name of the factory that implements the topic compaction service.
+
+**Type**: `java.lang.String`
+
+**Default**: `org.apache.pulsar.compaction.PulsarCompactionServiceFactory`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### configurationMetadataStoreUrl
+The metadata store URL for the configuration data. If empty, we fall back to use metadataStoreUrl
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### configurationMetadataSyncEventTopic
+Event topic to sync configuration-metadata between separate pulsar clusters on different cloud platforms.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `true`
+
+**Category**: Server
+
+### configurationStoreConfigPath
+Configuration file path for configuration metadata store.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### connectionLivenessCheckTimeoutMillis
+Timeout for connection liveness check used to check liveness of possible consumer or producer duplicates. Helps prevent ProducerFencedException with exclusive producer, ConsumerAssignException with range conflict for Key Shared with sticky hash ranges or ConsumerBusyException in the case of an exclusive consumer. Set to 0 to disable connection liveness check.
+
+**Type**: `long`
+
+**Default**: `5000`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### delayedDeliveryEnabled
+Whether to enable the delayed delivery for messages.
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### delayedDeliveryFixedDelayDetectionLookahead
+Size of the lookahead window to use when detecting if all the messages in the topic have a fixed delay for InMemoryDelayedDeliveryTracker (the default DelayedDeliverTracker). Default is 50,000. Setting the lookahead window to 0 will disable the logic to handle fixed delays in messages in a different way.
+
+**Type**: `long`
+
+**Default**: `50000`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### delayedDeliveryMaxDelayInMillis
+The max allowed delay for delayed delivery (in milliseconds). If the broker receives a message which exceeds this max delay, then it will return an error to the producer. The default value is 0 which means there is no limit on the max delivery delay.
+
+**Type**: `long`
+
+**Default**: `0`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### delayedDeliveryMaxIndexesPerBucketSnapshotSegment
+The max number of delayed message index in per bucket snapshot segment, -1 means no limitation, after reaching the max number limitation, the snapshot segment will be cut off.
+
+**Type**: `int`
+
+**Default**: `5000`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### delayedDeliveryMaxNumBuckets
+The max number of delayed message index bucket, after reaching the max buckets limitation, the adjacent buckets will be merged.(disable with value -1)
+
+**Type**: `int`
+
+**Default**: `-1`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### delayedDeliveryMaxTimeStepPerBucketSnapshotSegmentSeconds
+The delayed message index time step(in seconds) in per bucket snapshot segment, after reaching the max time step limitation, the snapshot segment will be cut off.
+
+**Type**: `int`
+
+**Default**: `300`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### delayedDeliveryMinIndexCountPerBucket
+The delayed message index bucket min index count. When the index count of the current bucket is more than this value and all message indexes of current ledger have already been added to the tracker we will seal the bucket.
+
+**Type**: `long`
+
+**Default**: `50000`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### delayedDeliveryTickTimeMillis
+Control the tick time for when retrying on delayed delivery, affecting the accuracy of the delivery time compared to the scheduled time. Default is 1 second. Note that this time is used to configure the HashedWheelTimer's tick time.
+
+**Type**: `long`
+
+**Default**: `1000`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### delayedDeliveryTrackerFactoryClassName
+Class name of the factory that implements the delayed deliver tracker.
+If value is "org.apache.pulsar.broker.delayed.BucketDelayedDeliveryTrackerFactory", will create bucket based delayed message index tracker.
+
+
+**Type**: `java.lang.String`
+
+**Default**: `org.apache.pulsar.broker.delayed.InMemoryDelayedDeliveryTrackerFactory`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### dispatchRateLimiterFactoryClassName
+The class name of the factory that creates DispatchRateLimiter implementations. Current options are org.apache.pulsar.broker.service.persistent.DispatchRateLimiterFactoryAsyncTokenBucket (default, PIP-322 implementation) org.apache.pulsar.broker.service.persistent.DispatchRateLimiterFactoryClassic (legacy implementation)
+
+**Type**: `java.lang.String`
+
+**Default**: `org.apache.pulsar.broker.service.persistent.DispatchRateLimiterFactoryAsyncTokenBucket`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### dispatchThrottlingForFilteredEntriesEnabled
+Whether the broker should count filtered entries in dispatch rate limit calculations. When disabled, only messages sent to a consumer count towards a dispatch rate limit at the broker, topic, and subscription level. When enabled, messages filtered out due to entry filter logic are counted towards each relevant rate limit.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### dispatchThrottlingRateInByte
+Default bytes per second dispatch throttling-limit for whole broker. Using a value of 0, is disabling default message-byte dispatch-throttling
+
+**Type**: `long`
+
+**Default**: `0`
+
+**Dynamic**: `true`
+
+**Category**: Server
+
+### dispatchThrottlingRateInMsg
+Default messages per second dispatch throttling-limit for whole broker. Using a value of 0, is disabling default message-byte dispatch-throttling
+
+**Type**: `int`
+
+**Default**: `0`
+
+**Dynamic**: `true`
+
+**Category**: Server
+
+### dispatcherDispatchMessagesInSubscriptionThread
+Dispatch messages and execute broker side filters in a per-subscription thread
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `true`
+
+**Category**: Server
+
+### dispatcherEntryFilterRescheduledMessageDelay
+Time in milliseconds to delay the new delivery of a message when an EntryFilter returns RESCHEDULE.
+
+**Type**: `int`
+
+**Default**: `1000`
+
+**Dynamic**: `true`
+
+**Category**: Server
+
+### dispatcherMaxReadBatchSize
+Max number of entries to read from bookkeeper. By default it is 100 entries.
+
+**Type**: `int`
+
+**Default**: `100`
+
+**Dynamic**: `true`
+
+**Category**: Server
+
+### dispatcherMaxReadSizeBytes
+Max size in bytes of entries to read from bookkeeper. By default it is 5MB.
+
+**Type**: `int`
+
+**Default**: `5242880`
+
+**Dynamic**: `true`
+
+**Category**: Server
+
+### dispatcherMaxRoundRobinBatchSize
+Max number of entries to dispatch for a shared subscription. By default it is 20 entries.
+
+**Type**: `int`
+
+**Default**: `20`
+
+**Dynamic**: `true`
+
+**Category**: Server
+
+### dispatcherMinReadBatchSize
+Min number of entries to read from bookkeeper. By default it is 1 entries.When there is an error occurred on reading entries from bookkeeper, the broker will backoff the batch size to this minimum number.
+
+**Type**: `int`
+
+**Default**: `1`
+
+**Dynamic**: `true`
+
+**Category**: Server
+
+### dispatcherReadFailureBackoffInitialTimeInMs
+The read failure backoff initial time in milliseconds. By default it is 15s.
+
+**Type**: `int`
+
+**Default**: `15000`
+
+**Dynamic**: `true`
+
+**Category**: Server
+
+### dispatcherReadFailureBackoffMandatoryStopTimeInMs
+The read failure backoff mandatory stop time in milliseconds. By default it is 0s.
+
+**Type**: `int`
+
+**Default**: `0`
+
+**Dynamic**: `true`
+
+**Category**: Server
+
+### dispatcherReadFailureBackoffMaxTimeInMs
+The read failure backoff max time in milliseconds. By default it is 60s.
+
+**Type**: `int`
+
+**Default**: `60000`
+
+**Dynamic**: `true`
+
+**Category**: Server
+
+### enableBusyWait
+Option to enable busy-wait settings. Default is false. WARNING: This option will enable spin-waiting on executors and IO threads in order to reduce latency during context switches. The spinning will consume 100% CPU even when the broker is not doing any work. It is recommended to reduce the number of IO threads and BK client threads to only have few CPU cores busy.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### enableNamespaceIsolationUpdateOnTime
+This config never takes effect and will be removed in the next release
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### enableNonPersistentTopics
+Enable broker to load non-persistent topics
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### enablePersistentTopics
+Enable broker to load persistent topics
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### enableReplicatedSubscriptions
+Enable tracking of replicated subscriptions state across clusters.
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### enableRunBookieAutoRecoveryTogether
+Enable to run bookie autorecovery along with broker
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### enableRunBookieTogether
+Enable to run bookie along with broker
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### encryptionRequireOnProducer
+Enforce producer to publish encrypted messages.(default disable).
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### entryFilterNames
+ Class name of pluggable entry filter that decides whether the entry needs to be filtered.You can use this class to decide which entries can be sent to consumers.Multiple names need to be separated by commas.
+
+**Type**: `java.util.List`
+
+**Default**: `[]`
+
+**Dynamic**: `true`
+
+**Category**: Server
+
+### entryFiltersDirectory
+ The directory for all the entry filter implementations.
+
+**Type**: `java.lang.String`
+
+**Default**: ``
+
+**Dynamic**: `true`
+
+**Category**: Server
+
+### exposingBrokerEntryMetadataToClientEnabled
+Enable or disable exposing broker entry metadata to client.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### failureDomainsEnabled
+Enable cluster's failure-domain which can distribute brokers into logical region
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `true`
+
+**Category**: Server
+
+### haProxyProtocolEnabled
+Enable or disable the proxy protocol. If true, the real IP addresses of consumers and producers can be obtained when getting topic statistics data.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### httpServerAcceptQueueSize
+Capacity for accept queue in the HTTP server Default is set to 8192.
+
+**Type**: `int`
+
+**Default**: `8192`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### httpServerGzipCompressionExcludedPaths
+Gzip compression is enabled by default. Specific paths can be excluded from compression.
+There are 2 syntaxes supported, Servlet url-pattern based, and Regex based.
+If the spec starts with '^' the spec is assumed to be a regex based path spec and will match with normal Java regex rules.
+If the spec starts with '/' then spec is assumed to be a Servlet url-pattern rules path spec for either an exact match or prefix based match.
+If the spec starts with '*.' then spec is assumed to be a Servlet url-pattern rules path spec for a suffix based match.
+All other syntaxes are unsupported.
+Disable all compression with ^.* or ^.*$
+
+**Type**: `java.util.List`
+
+**Default**: `[]`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### httpServerThreadPoolQueueSize
+Capacity for thread pool queue in the HTTP server Default is set to 8192.
+
+**Type**: `int`
+
+**Default**: `8192`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### internalListenerName
+Name of the listener used for cluster-internal broker-to-broker communication (lookup redirects, admin forwarding to owner or leader broker). Defaults to `internal`.
+ When set (the default), the internal listener is auto-configured from `advertisedAddress` plus the *Port properties. The internal listener must advertise addresses reachable from other brokers in the same cluster; avoid overriding its URLs in `advertisedListeners` to point at an external load balancer because that would route cluster-internal traffic outside the cluster. For external clients, declare a separate non-internal listener in `advertisedListeners` instead. The default name `in [...]
+ Setting this to an empty string restores the legacy fallback: the first listener parsed from `advertisedListeners` is used as the internal listener.
+
+**Type**: `java.lang.String`
+
+**Default**: `internal`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### isDelayedDeliveryDeliverAtTimeStrict
+Whether the deliverAt time is strictly followed. When false (default), messages may be sent to consumers before the deliverAt time by as much as the tickTimeMillis. This can reduce the overhead on the broker of maintaining the delayed index for a potentially very short time period. When true, messages will not be sent to consumer until the deliverAt time has passed, and they may be as late as the deliverAt time plus the tickTimeMillis for the topic plus the delayedDeliveryTickTimeMillis.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### keepAliveIntervalSeconds
+How often to check pulsar connection is still alive
+
+**Type**: `int`
+
+**Default**: `30`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### lazyCursorRecovery
+Whether to recover cursors lazily when trying to recover a managed ledger backing a persistent topic. It can improve write availability of topics.
+The caveat is now when recovered ledger is ready to write we're not sure if all old consumers last mark delete position can be recovered or not.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### lookupPropertyPrefix
+The properties whose name starts with this prefix will be uploaded to the metadata store for the topic lookup
+
+**Type**: `java.lang.String`
+
+**Default**: `lookup.`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### maxConcurrentHttpRequests
+Max concurrent web requests
+
+**Type**: `int`
+
+**Default**: `1024`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### maxConcurrentLookupRequest
+Max number of concurrent lookup request broker allows to throttle heavy incoming lookup traffic
+
+**Type**: `int`
+
+**Default**: `50000`
+
+**Dynamic**: `true`
+
+**Category**: Server
+
+### maxConcurrentNonPersistentMessagePerConnection
+Max concurrent non-persistent message can be processed per connection
+
+**Type**: `int`
+
+**Default**: `1000`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### maxConcurrentTopicLoadRequest
+Max number of concurrent topic loading request broker allows to control number of zk-operations
+
+**Type**: `int`
+
+**Default**: `5000`
+
+**Dynamic**: `true`
+
+**Category**: Server
+
+### maxConsumersPerSubscription
+Max number of consumers allowed to connect to subscription.
+
+Once this limit reaches, Broker will reject new consumers until the number of connected consumers decrease. Using a value of 0, is disabling maxConsumersPerSubscription-limit check.
+
+**Type**: `int`
+
+**Default**: `0`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### maxConsumersPerTopic
+Max number of consumers allowed to connect to topic.
+
+Once this limit reaches, Broker will reject new consumers until the number of connected consumers decrease. Using a value of 0, is disabling maxConsumersPerTopic-limit check.
+
+**Type**: `int`
+
+**Default**: `0`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### maxHttpServerConnections
+Maximum number of inbound http connections. (0 to disable limiting)
+
+**Type**: `int`
+
+**Default**: `2048`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### maxMessagePublishBufferSizeInMB
+Max memory size for broker handling messages sending from producers.
+
+ If the processing message size exceed this value, broker will stop read data from the connection. The processing messages means messages are sends to broker but broker have not send response to client, usually waiting to write to bookies.
+
+ It's shared across all the topics running in the same broker.
+
+ Use -1 to disable the memory limitation. Default is 1/2 of direct memory.
+
+
+
+**Type**: `int`
+
+**Default**: `4454`
+
+**Dynamic**: `true`
+
+**Category**: Server
+
+### maxMessageSize
+Max size of messages.
+
+**Type**: `int`
+
+**Default**: `5242880`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### maxNumPartitionsPerPartitionedTopic
+The number of partitions per partitioned topic.
+If try to create or update partitioned topics by exceeded number of partitions, then fail.
+Use 0 or negative number to disable the check.
+
+**Type**: `int`
+
+**Default**: `0`
+
+**Dynamic**: `true`
+
+**Category**: Server
+
+### maxProducersPerTopic
+Max number of producers allowed to connect to topic.
+
+Once this limit reaches, Broker will reject new producers until the number of connected producers decrease. Using a value of 0, is disabling maxProducersPerTopic-limit check.
+
+**Type**: `int`
+
+**Default**: `0`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### maxPublishRatePerTopicInBytes
+Max Rate(in 1 seconds) of Byte allowed to publish for a topic when topic publish rate limiting enabled. (Disable byte rate limit with value 0)
+
+**Type**: `long`
+
+**Default**: `0`
+
+**Dynamic**: `true`
+
+**Category**: Server
+
+### maxPublishRatePerTopicInMessages
+Max Rate(in 1 seconds) of Message allowed to publish for a topic when topic publish rate limiting enabled. (Disable byte rate limit with value 0)
+
+**Type**: `int`
+
+**Default**: `0`
+
+**Dynamic**: `true`
+
+**Category**: Server
+
+### maxSameAddressConsumersPerTopic
+Max number of consumers with the same IP address allowed to connect to topic.
+
+Once this limit reaches, Broker will reject new consumers until the number of connected consumers with the same IP address decrease. Using a value of 0, is disabling maxSameAddressConsumersPerTopic-limit check.
+
+**Type**: `int`
+
+**Default**: `0`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### maxSameAddressProducersPerTopic
+Max number of producers with the same IP address allowed to connect to topic.
+
+Once this limit reaches, Broker will reject new producers until the number of connected producers with the same IP address decrease. Using a value of 0, is disabling maxSameAddressProducersPerTopic-limit check.
+
+**Type**: `int`
+
+**Default**: `0`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### maxSubscriptionsPerTopic
+Max number of subscriptions allowed to subscribe to topic.
+
+Once this limit reaches, broker will reject new subscription until the number of subscribed subscriptions decrease.
+ Using a value of 0, is disabling maxSubscriptionsPerTopic limit check.
+
+**Type**: `int`
+
+**Default**: `0`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### maxTenants
+The maximum number of tenants that each pulsar cluster can create.This configuration is not precise control, in a concurrent scenario, the threshold will be exceeded.
+
+**Type**: `int`
+
+**Default**: `0`
+
+**Dynamic**: `true`
+
+**Category**: Server
+
+### maxTopicListInFlightDirectMemSizeMB
+Maximum direct memory for inflight topic list responses (MB).
+Default: 100 MB (network buffers for serialized responses)
+
+**Type**: `int`
+
+**Default**: `100`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### maxTopicListInFlightDirectMemSizePermitsAcquireQueueSize
+Maximum queue size for direct memory permit requests.
+Default: 10000 (prevent unbounded queueing)
+
+**Type**: `int`
+
+**Default**: `10000`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### maxTopicListInFlightDirectMemSizePermitsAcquireTimeoutMillis
+Timeout for acquiring direct memory permits (milliseconds).
+Default: 25000 (25 seconds)
+
+**Type**: `int`
+
+**Default**: `25000`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### maxTopicListInFlightHeapMemSizeMB
+Maximum heap memory for inflight topic list operations (MB).
+Default: 100 MB (supports ~1M topic names assuming 100 bytes each)
+
+**Type**: `int`
+
+**Default**: `100`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### maxTopicListInFlightHeapMemSizePermitsAcquireQueueSize
+Maximum queue size for heap memory permit requests.
+Default: 10000 (prevent unbounded queueing)
+
+**Type**: `int`
+
+**Default**: `10000`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### maxTopicListInFlightHeapMemSizePermitsAcquireTimeoutMillis
+Timeout for acquiring heap memory permits (milliseconds).
+Default: 25000 (25 seconds)
+
+**Type**: `int`
+
+**Default**: `25000`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### metadataStoreAllowReadOnlyOperations
+Is metadata store read-only operations.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### metadataStoreBatchingEnabled
+Whether we should enable metadata operations batching
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### metadataStoreBatchingMaxDelayMillis
+Maximum delay to impose on batching grouping
+
+**Type**: `int`
+
+**Default**: `5`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### metadataStoreBatchingMaxOperations
+Maximum number of operations to include in a singular batch
+
+**Type**: `int`
+
+**Default**: `1000`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### metadataStoreBatchingMaxSizeKb
+Maximum size of a batch
+
+**Type**: `int`
+
+**Default**: `128`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### metadataStoreCacheExpirySeconds
+Metadata store cache expiry time in seconds.
+
+**Type**: `int`
+
+**Default**: `300`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### metadataStoreConfigPath
+Configuration file path for local metadata store.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### metadataStoreOperationTimeoutSeconds
+Metadata store operation timeout in seconds.
+
+**Type**: `int`
+
+**Default**: `30`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### metadataStoreSerDesThreads
+The number of threads used for serializing and deserializing data to and from the metadata store
+
+**Type**: `int`
+
+**Default**: `1`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### metadataStoreSessionTimeoutMillis
+Metadata store session timeout in milliseconds.
+
+**Type**: `long`
+
+**Default**: `30000`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### metadataStoreUrl
+The metadata store URL.
+ Examples:
+ * zk:my-zk-1:2181,my-zk-2:2181,my-zk-3:2181
+ * my-zk-1:2181,my-zk-2:2181,my-zk-3:2181 (will default to ZooKeeper when the schema is not specified)
+ * zk:my-zk-1:2181,my-zk-2:2181,my-zk-3:2181/my-chroot-path (to add a ZK chroot path)
+
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### metadataSyncEventTopic
+Event topic to sync metadata between separate pulsar clusters on different cloud platforms.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `true`
+
+**Category**: Server
+
+### numAcceptorThreads
+Number of threads to use for Netty Acceptor. Default is set to `1`
+
+**Type**: `int`
+
+**Default**: `1`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### numCacheExecutorThreadPoolSize
+Number of thread pool size to use for pulsar zookeeper callback service.The cache executor thread pool is used for restarting global zookeeper session. Default is 10
+
+**Type**: `int`
+
+**Default**: `10`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### numExecutorThreadPoolSize
+Number of threads to use for pulsar broker service. The executor in thread pool will do basic broker operation like load/unload bundle, update managedLedgerConfig, update topic/subscription/replicator message dispatch rate, do leader election etc. Default is set to 20
+
+**Type**: `int`
+
+**Default**: `1`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### numHttpServerThreads
+Number of threads to use for HTTP requests processing Default is set to `2 * Runtime.getRuntime().availableProcessors()`
+
+**Type**: `int`
+
+**Default**: `8`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### numIOThreads
+Number of threads to use for Netty IO. Default is set to `2 * Runtime.getRuntime().availableProcessors()`
+
+**Type**: `int`
+
+**Default**: `2`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### numOrderedExecutorThreads
+Number of threads to use for orderedExecutor. The ordered executor is used to operate with zookeeper, such as init zookeeper client, get namespace policies from zookeeper etc. It also used to split bundle. Default is 8
+
+**Type**: `int`
+
+**Default**: `8`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### preciseDispatcherFlowControl
+Precise dispatcher flow control according to history message number of each entry
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `true`
+
+**Category**: Server
+
+### preferLaterVersions
+If true, (and ModularLoadManagerImpl is being used), the load manager will attempt to use only brokers running the latest software version (to minimize impact to bundles)
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `true`
+
+**Category**: Server
+
+### pulsarResourcesExtendedClassName
+The class name of the PulsarResourcesExtended implementation. This class must implement org.apache.pulsar.broker.PulsarResourcesExtended.
+
+**Type**: `java.lang.String`
+
+**Default**: `org.apache.pulsar.broker.DefaultPulsarResourcesExtended`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### replicatedSubscriptionsSnapshotFrequencyMillis
+Frequency of snapshots for replicated subscriptions tracking.
+
+**Type**: `int`
+
+**Default**: `1000`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### replicatedSubscriptionsSnapshotMaxCachedPerSubscription
+Max number of snapshot to be cached per subscription.
+
+**Type**: `int`
+
+**Default**: `30`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### replicatedSubscriptionsSnapshotTimeoutSeconds
+Timeout for building a consistent snapshot for tracking replicated subscriptions state.
+
+**Type**: `int`
+
+**Default**: `30`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### replicationStartAt
+The position that replication task start at, it can be set to earliest or latest (default).
+
+**Type**: `java.lang.String`
+
+**Default**: `latest`
+
+**Dynamic**: `true`
+
+**Category**: Server
+
+### retentionCheckIntervalInSeconds
+Check between intervals to see if consumed ledgers need to be trimmed
+
+**Type**: `int`
+
+**Default**: `120`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### skipBrokerShutdownOnOOM
+Flag to skip broker shutdown when broker handles Out of memory error
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `true`
+
+**Category**: Server
+
+### statusFilePath
+Path for the file used to determine the rotation status for the broker when responding to service discovery health checks
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### strictBookieAffinityEnabled
+Enable or disable strict bookie affinity.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### strictTopicNameEnabled
+# Enable strict topic name check. Which includes two parts as follows:
+# 1. Mark `-partition-` as a keyword.
+# E.g.
+ Create a non-partitioned topic.
+ No corresponding partitioned topic
+ - persistent://public/default/local-name (passed)
+ - persistent://public/default/local-name-partition-z (rejected by keyword)
+ - persistent://public/default/local-name-partition-0 (rejected by keyword)
+ Has corresponding partitioned topic, partitions=2 and topic partition name is persistent://public/default/local-name
+ - persistent://public/default/local-name-partition-0 (passed, Because it is the partition topic's sub-partition)
+ - persistent://public/default/local-name-partition-z (rejected by keyword)
+ - persistent://public/default/local-name-partition-4 (rejected, Because it exceeds the number of maximum partitions)
+ Create a partitioned topic(topic metadata)
+ - persistent://public/default/local-name (passed)
+ - persistent://public/default/local-name-partition-z (rejected by keyword)
+ - persistent://public/default/local-name-partition-0 (rejected by keyword)
+# 2. Allowed alphanumeric (a-zA-Z_0-9) and these special chars -=:. for topic name.
+# NOTE: This flag will be removed in some major releases in the future.
+
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### strictlyVerifySubscriptionName
+If 'strictSubscriptionNameVerification' is true, the new subscription name can only contain (a-zA-Z_0-9) and these special chars -=:.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `true`
+
+**Category**: Server
+
+### systemTopicEnabled
+Enable or disable system topic.
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### topicCompactionRetainNullKey
+Whether retain null-key message during topic compaction.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### topicFencingTimeoutSeconds
+If a topic remains fenced for this number of seconds, it will be closed forcefully.
+ If it is set to 0 or a negative number, the fenced topic will not be closed.
+
+**Type**: `int`
+
+**Default**: `0`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### topicLevelPoliciesEnabled
+Enable or disable topic level policies, topic level policies depends on the system topic, please enable the system topic first.
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### topicLoadTimeoutSeconds
+Amount of seconds to timeout when loading a topic. In situations with many geo-replicated clusters, this may need raised.
+
+**Type**: `long`
+
+**Default**: `60`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### topicOrderedExecutorThreadNum
+Number of worker threads to serve topic ordered executor
+
+**Type**: `int`
+
+**Default**: `1`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### topicPoliciesCacheInitTimeoutSeconds
+Amount of seconds to timeout initializing the topic policies cache of a namespace (reading the namespace's __change_events system topic to the end). Topic loading waits for this initialization, so if the system-topic reader gets stuck (for example after __change_events is unloaded and the reconnected reader stops making progress), this bounds the wait: the broker fails the initialization, closes the stuck reader and clears the cached state so that loading the namespace's topics can be re [...]
+
+**Type**: `long`
+
+**Default**: `60`
+
+**Dynamic**: `true`
+
+**Category**: Server
+
+### topicPoliciesServiceClassName
+The class name of the topic policies service. There are 2 built-in implementations:
+1. "org.apache.pulsar.broker.service.SystemTopicBasedTopicPoliciesService" (default)
+ It stores a topic's policies in the `__change_events` topic. If `systemTopicEnabled` is false,
+ the topic policies will just be disabled
+2. "org.apache.pulsar.broker.service.MetadataStoreTopicPoliciesService"
+ It stores a topic's policies in the metadata store. If `systemTopicEnabled` is true and the
+ topic's namespace has a `__change_events` topic, the policies will still be stored in the
+ `__change_events` topic for backward compatibility.
+
+
+**Type**: `java.lang.String`
+
+**Default**: `org.apache.pulsar.broker.service.SystemTopicBasedTopicPoliciesService`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### topicsPatternRegexImplementation
+The regular expression implementation to use for topic pattern matching.
+RE2J_WITH_JDK_FALLBACK is the default. It uses the RE2J implementation and falls back to the JDK implementation for backwards compatibility reasons when the pattern compilation fails with the RE2/j library.
+RE2J is more performant but does not support all regex features (e.g. negative lookaheads).
+JDK uses the standard Java regex implementation which supports all features but can be slower.
+Bad or malicious regex patterns requiring extensive backtracing could cause high resource usage with RE2J_WITH_JDK_FALLBACK or JDK implementations.
+
+**Type**: `org.apache.pulsar.common.topics.TopicsPattern.RegexImplementation`
+
+**Default**: `RE2J_WITH_JDK_FALLBACK`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### transactionLogBatchedWriteEnabled
+Provide a mechanism allowing the Transaction Log Store to aggregate multiple records into a batched record and persist into a single BK entry. This will make Pulsar transactions work more efficiently, aka batched log. see: https://github.com/apache/pulsar/issues/15370. Default false
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `true`
+
+**Category**: Server
+
+### transactionLogBatchedWriteMaxDelayInMillis
+If enabled the feature that transaction log batch, this attribute means maximum wait time(in millis) for the first record in a batch, default 1 millisecond.
+
+**Type**: `int`
+
+**Default**: `1`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### transactionLogBatchedWriteMaxRecords
+If enabled the feature that transaction log batch, this attribute means maximum log records count in a batch, default 512.
+
+**Type**: `int`
+
+**Default**: `512`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### transactionLogBatchedWriteMaxSize
+If enabled the feature that transaction log batch, this attribute means bytes size in a batch, default 4m.
+
+**Type**: `int`
+
+**Default**: `4194304`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### transactionPendingAckBatchedWriteEnabled
+Provide a mechanism allowing the transaction pending ack Log Store to aggregate multiple records into a batched record and persist into a single BK entry. This will make Pulsar transactions work more efficiently, aka batched log. see: https://github.com/apache/pulsar/issues/15370. Default false.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `true`
+
+**Category**: Server
+
+### transactionPendingAckBatchedWriteMaxDelayInMillis
+If enabled the feature that transaction pending ack log batch, this attribute means maximum wait time(in millis) for the first record in a batch, default 1 millisecond.
+
+**Type**: `int`
+
+**Default**: `1`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### transactionPendingAckBatchedWriteMaxRecords
+If enabled the feature that transaction log batch, this attribute means maximum log records count in a batch, default 512.
+
+**Type**: `int`
+
+**Default**: `512`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### transactionPendingAckBatchedWriteMaxSize
+If enabled the feature that transaction pending ack log batch, this attribute means bytes size in a batch, default 4m.
+
+**Type**: `int`
+
+**Default**: `4194304`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### webServiceHaProxyProtocolEnabled
+Enable or disable the use of HA proxy protocol for resolving the client IP for http/https requests. Default is false.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### webServiceLogDetailedAddresses
+Add detailed client/remote and server/local addresses and ports to http/https request logging.
+Defaults to true when either webServiceHaProxyProtocolEnabled or webServiceTrustXForwardedFor is enabled.
+
+**Type**: `java.lang.Boolean`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### webServicePort
+Port for the HTTP admin/REST endpoint of the internal listener. Used both for the local socket binding and the advertised URL.
+
+**Type**: `java.util.Optional`
+
+**Default**: `Optional[8080]`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### webServicePortTls
+Port for the HTTPS admin/REST endpoint of the internal listener. Used both for the local socket binding and the advertised URL. By default TLS is disabled.
+
+**Type**: `java.util.Optional`
+
+**Default**: `Optional.empty`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### webServiceTlsProvider
+Specify the TLS provider for the web service: SunJSSE, Conscrypt and etc.
+
+**Type**: `java.lang.String`
+
+**Default**: `Conscrypt`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### webServiceTrustXForwardedFor
+Trust X-Forwarded-For header for resolving the client IP for http/https requests.
+Default is false.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### bookkeeperClientAuthenticationParameters
+Parameters for bookkeeper auth plugin
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperClientAuthenticationParametersName
+BookKeeper auth plugin implementation specifics parameters name and values
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperClientAuthenticationPlugin
+Authentication plugin to use when connecting to bookies
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperClientEnforceMinNumRacksPerWriteQuorum
+Enforces rack-aware bookie selection policy to pick bookies from 'bookkeeperClientMinNumRacksPerWriteQuorum' racks for a writeQuorum.
+
+If BK can't find bookie then it would throw BKNotEnoughBookiesException instead of picking random one.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperClientExposeStatsToPrometheus
+whether expose managed ledger client stats to prometheus
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperClientGetBookieInfoIntervalSeconds
+Set the interval to periodically check bookie info
+
+**Type**: `int`
+
+**Default**: `86400`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperClientGetBookieInfoRetryIntervalSeconds
+Set the interval to retry a failed bookie info lookup
+
+**Type**: `int`
+
+**Default**: `60`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperClientHealthCheckEnabled
+Enable bookies health check.
+
+ Bookies that have more than the configured number of failure within the interval will be quarantined for some time. During this period, new ledgers won't be created on these bookies
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperClientHealthCheckErrorThresholdPerInterval
+Bookies health check error threshold per check interval
+
+**Type**: `long`
+
+**Default**: `5`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperClientHealthCheckIntervalSeconds
+Bookies health check interval in seconds
+
+**Type**: `long`
+
+**Default**: `60`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperClientHealthCheckQuarantineTimeInSeconds
+Bookie health check quarantined time in seconds
+
+**Type**: `long`
+
+**Default**: `1800`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperClientIsolationGroups
+Enable bookie isolation by specifying a list of bookie groups to choose from.
+
+Any bookie outside the specified groups will not be used by the broker
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperClientLimitStatsLogging
+whether limit per_channel_bookie_client metrics of bookkeeper client stats
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperClientMinNumRacksPerWriteQuorum
+Minimum number of racks per write quorum.
+
+BK rack-aware bookie selection policy will try to get bookies from at least 'bookkeeperClientMinNumRacksPerWriteQuorum' racks for a write quorum.
+
+**Type**: `int`
+
+**Default**: `2`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperClientNumIoThreads
+Number of BookKeeper client IO threads. Default is Runtime.getRuntime().availableProcessors() * 2
+
+**Type**: `int`
+
+**Default**: `2`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperClientNumWorkerThreads
+Number of BookKeeper client worker threads. Default is Runtime.getRuntime().availableProcessors()
+
+**Type**: `int`
+
+**Default**: `1`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperClientQuarantineRatio
+bookie quarantine ratio to avoid all clients quarantine the high pressure bookie servers at the same time
+
+**Type**: `double`
+
+**Default**: `1.0`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperClientRackawarePolicyEnabled
+Enable rack-aware bookie selection policy.
+
+BK will chose bookies from different racks when forming a new bookie ensemble
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperClientRegionawarePolicyEnabled
+Enable region-aware bookie selection policy.
+
+BK will chose bookies from different regions and racks when forming a new bookie ensemble
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperClientReorderReadSequenceEnabled
+Enable/disable reordering read sequence on reading entries
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperClientSecondaryIsolationGroups
+Enable bookie secondary-isolation group if bookkeeperClientIsolationGroups doesn't have enough bookie available.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperClientSeparatedIoThreadsEnabled
+Use separated IO threads for BookKeeper client. Default is false, which will use Pulsar IO threads
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperClientSpeculativeReadTimeoutInMillis
+Speculative reads are initiated if a read request doesn't complete within a certain time Using a value of 0, is disabling the speculative reads
+
+**Type**: `int`
+
+**Default**: `0`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperClientThrottleValue
+Throttle value for bookkeeper client
+
+**Type**: `int`
+
+**Default**: `0`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperClientTimeoutInSeconds
+Timeout for BK add / read operations
+
+**Type**: `long`
+
+**Default**: `30`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperDiskWeightBasedPlacementEnabled
+Enable/disable disk weight based placement. Default is false
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperEnableStickyReads
+Enable/disable having read operations for a ledger to be sticky to a single bookie.
+If this flag is enabled, the client will use one single bookie (by preference) to read all entries for a ledger.
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperExplicitLacIntervalInMills
+Set the interval to check the need for sending an explicit LAC
+
+**Type**: `int`
+
+**Default**: `0`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperMetadataServiceUri
+Metadata service uri that bookkeeper is used for loading corresponding metadata driver and resolving its metadata service location
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperNumberOfChannelsPerBookie
+Number of channels per bookie
+
+**Type**: `int`
+
+**Default**: `16`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperTLSCertificateFilePath
+Path for the TLS certificate file
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperTLSClientAuthentication
+Enable tls authentication with bookie
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperTLSKeyFilePath
+Path for the TLS private key file
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperTLSKeyFileType
+Supported type: PEM, JKS, PKCS12. Default value: PEM
+
+**Type**: `java.lang.String`
+
+**Default**: `PEM`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperTLSKeyStorePasswordPath
+Path to file containing keystore password, if the client keystore is password protected.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperTLSProviderFactoryClass
+Set the client security provider factory class name. Default: org.apache.bookkeeper.tls.TLSContextFactory
+
+**Type**: `java.lang.String`
+
+**Default**: `org.apache.bookkeeper.tls.TLSContextFactory`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperTLSTrustCertTypes
+Supported type: PEM, JKS, PKCS12. Default value: PEM
+
+**Type**: `java.lang.String`
+
+**Default**: `PEM`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperTLSTrustCertsFilePath
+Path for the trusted TLS certificate file
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperTLSTrustStorePasswordPath
+Path to file containing truststore password, if the client truststore is password protected.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperTlsCertFilesRefreshDurationSeconds
+Tls cert refresh duration at bookKeeper-client in seconds (0 to disable check)
+
+**Type**: `int`
+
+**Default**: `300`
+
+**Dynamic**: `false`
+
+**Category**: Storage (BookKeeper)
+
+### bookkeeperUseV2WireProtocol
+Use older Bookkeeper wire protocol with bookie
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `true`
+
+**Category**: Storage (BookKeeper)
+
+### managedLedgerOffloadAutoTriggerSizeThresholdBytes
+The number of bytes before triggering automatic offload to long term storage
+
+**Type**: `long`
+
+**Default**: `-1`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Ledger Offloading)
+
+### managedLedgerOffloadDeletionLagMs
+Delay between a ledger being successfully offloaded to long term storage, and the ledger being deleted from bookkeeper
+
+**Type**: `long`
+
+**Default**: `14400000`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Ledger Offloading)
+
+### managedLedgerOffloadDriver
+Driver to use to offload old data to long term storage
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Ledger Offloading)
+
+### managedLedgerOffloadMaxThreads
+Maximum number of thread pool threads for ledger offloading
+
+**Type**: `int`
+
+**Default**: `2`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Ledger Offloading)
+
+### managedLedgerOffloadPrefetchRounds
+Maximum prefetch rounds for ledger reading for offloading
+
+**Type**: `int`
+
+**Default**: `1`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Ledger Offloading)
+
+### managedLedgerOffloadReadThreads
+Maximum number of thread pool threads for offloaded ledger reading
+
+**Type**: `int`
+
+**Default**: `2`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Ledger Offloading)
+
+### managedLedgerOffloadThresholdInSeconds
+The threshold to triggering automatic offload to long term storage
+
+**Type**: `long`
+
+**Default**: `-1`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Ledger Offloading)
+
+### managedLedgerUnackedRangesOpenCacheSetEnabled
+When set to true, a BitSet will be used to track acknowledged messages that come after the "mark delete position" for each subscription.
+
+RoaringBitmap is used as a memory efficient BitSet implementation for the acknowledged messages tracking. Unacknowledged ranges are the message ranges excluding the acknowledged messages.
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Ledger Offloading)
+
+### narExtractionDirectory
+The directory where nar Extraction of offloaders happens
+
+**Type**: `java.lang.String`
+
+**Default**: `/var/folders/gt/xywq0qwd4cvdqfhy7t7js7b00000gn/T/`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Ledger Offloading)
+
+### offloadersDirectory
+The directory to locate offloaders
+
+**Type**: `java.lang.String`
+
+**Default**: `./offloaders`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Ledger Offloading)
+
+### triggerOffloadOnTopicLoad
+Trigger offload on topic load or not. Default is false
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Ledger Offloading)
+
+### allowAutoSubscriptionCreation
+Allow automated creation of subscriptions if set to true (default value).
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `true`
+
+**Category**: Storage (Managed Ledger)
+
+### allowAutoTopicCreation
+Allow automated creation of topics if set to true (default value).
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `true`
+
+**Category**: Storage (Managed Ledger)
+
+### allowAutoTopicCreationType
+The type of topic that is allowed to be automatically created.(partitioned/non-partitioned)
+
+**Type**: `org.apache.pulsar.common.policies.data.TopicType`
+
+**Default**: `non-partitioned`
+
+**Dynamic**: `true`
+
+**Category**: Storage (Managed Ledger)
+
+### autoSkipNonRecoverableData
+Skip reading non-recoverable/unreadable data-ledger under managed-ledger's list.
+
+ It helps when data-ledgers gets corrupted at bookkeeper and managed-cursor is stuck at that ledger.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `true`
+
+**Category**: Storage (Managed Ledger)
+
+### cacheEvictionByExpectedReadCount
+Evicting cache data by expected read count. Expected read count is calculated by the number of active cursors with a read position that is behind the position of the cached entry. This setting will override the cacheEvictionByMarkDeletedPosition setting.
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### cacheEvictionByMarkDeletedPosition
+Evicting cache data by the slowest markDeletedPosition (true) or slowest read position (false).This setting is ignored when cacheEvictionByExpectedReadCount is true.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### defaultNumPartitions
+The number of partitioned topics that is allowed to be automatically created if allowAutoTopicCreationType is partitioned.
+
+**Type**: `int`
+
+**Default**: `1`
+
+**Dynamic**: `true`
+
+**Category**: Storage (Managed Ledger)
+
+### dispatcherPauseOnAckStatePersistentEnabled
+After enabling this feature, Pulsar will stop delivery messages to clients if the cursor metadata is too large to persist, it will help to reduce the duplicates caused by the ack state that can not be fully persistent. Default false.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `true`
+
+**Category**: Storage (Managed Ledger)
+
+### managedCursorInfoCompressionThresholdInBytes
+ManagedCursorInfo compression size threshold (bytes), only compress metadata when origin size more then this value.
+0 means compression will always apply.
+
+
+**Type**: `long`
+
+**Default**: `16384`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedCursorInfoCompressionType
+ManagedCursorInfo compression type, option values (NONE, LZ4, ZLIB, ZSTD, SNAPPY).
+If value is NONE, then save the ManagedCursorInfo bytes data directly.
+
+**Type**: `java.lang.String`
+
+**Default**: `LZ4`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerAddEntryTimeoutSeconds
+Add entry timeout when broker tries to publish message to bookkeeper.(0 to disable it)
+
+**Type**: `long`
+
+**Default**: `0`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerCacheCopyEntries
+Whether we should make a copy of the entry payloads when inserting in cache
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerCacheEvictionExtendTTLOfEntriesWithRemainingExpectedReadsMaxTimes
+Maximum number of times the cache can extend
+the TTL of an entry that has remaining expected reads.
+Only takes effect when cacheEvictionByExpectedReadCount is enabled.
+This helps optimize cache efficiency for scenarios like:
+- Key_Shared subscription replays
+- Catch-up reads for lagging consumers
+- Consumers temporarily falling behind the tail
+Entries with remaining expected reads will have their TTL extended up to this many times
+before being eligible for eviction. The TTL will be extended by
+managedLedgerCacheEvictionTimeThresholdMillis each time.
+Default is 5.
+
+**Type**: `int`
+
+**Default**: `5`
+
+**Dynamic**: `true`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerCacheEvictionExtendTTLOfRecentlyAccessed
+Controls whether recently accessed entries in the managed ledger cache should have their lifetime extended before cache eviction.
+When enabled:
+ - During eviction check, if an entry has been accessed since the last check, its expiration time will be extended by managedLedgerCacheEvictionTimeThresholdMillis
+ - Makes the cache behave like a Least Recently Used (LRU) cache by keeping frequently accessed entries longer
+ - Helps optimize performance for frequently accessed entries while still allowing old unused entries to be evicted
+ - Minimum eviction time is 2x managedLedgerCacheEvictionTimeThresholdMillis
+When disabled:
+ - Cache behaves more like a FIFO queue with time-based and size-based eviction
+ - Minimum eviction time is managedLedgerCacheEvictionTimeThresholdMillis
+Default is true, to behave like a LRU cache.
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `true`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerCacheEvictionFrequency
+Configure the cache eviction frequency for the managed ledger cache.
+
+**Type**: `double`
+
+**Default**: `0.0`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerCacheEvictionIntervalMs
+Configure the cache eviction interval in milliseconds for the managed ledger cache, default is 10ms
+
+**Type**: `long`
+
+**Default**: `10`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerCacheEvictionTimeThresholdMillis
+Controls time-to-live (TTL) for entries in the managed ledger (broker) cache.
+The TTL can be extended in two ways:
+1. When cacheEvictionByExpectedReadCount is enabled: TTL is extended for entries with remaining
+expected reads. The maximum number of extensions is controlled by
+managedLedgerCacheEvictionExtendTTLOfEntriesWithRemainingExpectedReadsMaxTimes.
+2. When cacheEvictionExtendTTLOfRecentlyAccessed is enabled: TTL is extended for entries
+accessed since the last expiration check.
+Default value is 1000ms.
+
+**Type**: `long`
+
+**Default**: `1000`
+
+**Dynamic**: `true`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerCacheEvictionWatermark
+Threshold to which bring down the cache level when eviction is triggered
+
+**Type**: `double`
+
+**Default**: `0.9`
+
+**Dynamic**: `true`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerCacheSizeMB
+Amount of memory to use for caching data payload in managed ledger.
+
+This memory is allocated from JVM direct memory and it's shared across all the topics running in the same broker. By default, uses 1/5th of available direct memory
+
+**Type**: `int`
+
+**Default**: `1781`
+
+**Dynamic**: `true`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerContinueCachingAddedEntriesAfterLastActiveCursorLeavesMillis
+This setting configures the duration of continuing to cache added entries while there are no active cursors, when the last active cursor has left or immediately after initialization when the persistent topic and the managed ledger gets loaded. This setting is ignored unless cacheEvictionByExpectedReadCount is enabled.The default value is 2 * managedLedgerCacheEvictionTimeThresholdMillis.
+
+**Type**: `java.lang.Long`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerCursorBackloggedThreshold
+Configure the threshold (in number of entries) from where a cursor should be considered 'backlogged' and thus should be set as inactive.
+Set to -1 to disable this behavior.
+This setting has no effect when cacheEvictionByExpectedReadCount is enabled.
+
+**Type**: `long`
+
+**Default**: `1000`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerCursorMaxEntriesPerLedger
+Max number of entries to append to a cursor ledger
+
+**Type**: `int`
+
+**Default**: `50000`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerCursorPositionFlushSeconds
+How frequently to flush the cursor positions that were accumulated due to rate limiting. (seconds). Default is 60 seconds
+
+**Type**: `int`
+
+**Default**: `60`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerCursorResetLedgerCloseTimestampMaxClockSkewMillis
+When resetting a subscription by timestamp, the broker will use the ledger closing timestamp metadata to determine the range of ledgers to search for the message where the subscription position is reset to. Since by default, the search condition is based on the message publish time provided by the client at the publish time, there will be some clock skew between the ledger closing timestamp metadata and the publish time. This configuration is used to set the max clock skew between the [...]
+
+**Type**: `int`
+
+**Default**: `60000`
+
+**Dynamic**: `true`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerCursorRolloverTimeInSeconds
+Max time before triggering a rollover on a cursor ledger
+
+**Type**: `int`
+
+**Default**: `14400`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerDataReadPriority
+Read priority when ledgers exists in both bookkeeper and the second layer storage.
+
+**Type**: `java.lang.String`
+
+**Default**: `tiered-storage-first`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerDefaultAckQuorum
+Ack quorum (Qa) size, Number of guaranteed copies (acks to wait for before a write is considered completed)
+
+**Type**: `int`
+
+**Default**: `2`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerDefaultEnsembleSize
+Ensemble (E) size, Number of bookies to use for storing entries in a ledger.
+Please notice that sticky reads enabled by bookkeeperEnableStickyReads=true aren’t used unless ensemble size (E) equals write quorum (Qw) size.
+
+**Type**: `int`
+
+**Default**: `2`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerDefaultMarkDeleteRateLimit
+Rate limit the amount of writes per second generated by consumer acking the messages
+
+**Type**: `double`
+
+**Default**: `1.0`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerDefaultWriteQuorum
+Write quorum (Qw) size, Replication factor for storing entries (messages) in a ledger.
+
+**Type**: `int`
+
+**Default**: `2`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerDeleteMaxConcurrentRequests
+Max number of concurrent requests for deleting ledgers at broker level
+
+**Type**: `int`
+
+**Default**: `1000`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerDigestType
+Default type of checksum to use when writing to BookKeeper.
+
+Default is `CRC32C`. Other possible options are `CRC32`, `MAC` or `DUMMY` (no checksum).
+
+**Type**: `org.apache.bookkeeper.client.api.DigestType`
+
+**Default**: `CRC32C`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerForceRecovery
+Skip managed ledger failure to forcefully recover managed ledger.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `true`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerInactiveLedgerRolloverTimeSeconds
+Time to rollover ledger for inactive topic (duration without any publish on that topic). Disable rollover with value 0 (Default value 0)
+
+**Type**: `int`
+
+**Default**: `0`
+
+**Dynamic**: `true`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerInactiveOffloadedLedgerEvictionTimeSeconds
+Time to evict inactive offloaded ledger for inactive topic. Disable eviction with value 0 (Default value 600)
+
+**Type**: `int`
+
+**Default**: `600`
+
+**Dynamic**: `true`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerInfoCompressionThresholdInBytes
+ManagedLedgerInfo compression size threshold (bytes), only compress metadata when origin size more then this value.
+0 means compression will always apply.
+
+
+**Type**: `long`
+
+**Default**: `16384`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerInfoCompressionType
+ManagedLedgerInfo compression type, option values (NONE, LZ4, ZLIB, ZSTD, SNAPPY).
+If value is invalid or NONE, then save the ManagedLedgerInfo bytes data directly.
+
+**Type**: `java.lang.String`
+
+**Default**: `LZ4`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerMaxAckQuorum
+Max number of guaranteed copies (acks to wait before write is complete)
+
+**Type**: `int`
+
+**Default**: `5`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerMaxBacklogBetweenCursorsForCaching
+Maximum backlog entry difference to prevent caching entries that can't be reused
+This has no effect when cacheEvictionByExpectedReadCount is enabled.
+
+**Type**: `int`
+
+**Default**: `1000`
+
+**Dynamic**: `true`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerMaxBatchDeletedIndexToPersist
+Maximum number of partially acknowledged batch messages per subscription that will have their batch deleted indexes persisted. Batch deleted index state is handled when acknowledgmentAtBatchIndexLevelEnabled=true.
+
+When this limit is exceeded, remaining batch message containing the batch deleted indexes will only be tracked in memory. In case of broker restarts or load balancing events, the batch deleted indexes will be cleared while redelivering the messages to consumers.
+
+**Type**: `int`
+
+**Default**: `200000`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerMaxEnsembleSize
+Max number of bookies to use when creating a ledger
+
+**Type**: `int`
+
+**Default**: `5`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerMaxEntriesPerLedger
+Max number of entries to append to a ledger before triggering a rollover.
+
+A ledger rollover is triggered after the min rollover time has passed and one of the following conditions is true: the max rollover time has been reached, the max entries have been written to the ledger, or the max ledger size has been written to the ledger
+
+**Type**: `int`
+
+**Default**: `50000`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerMaxLedgerRolloverTimeMinutes
+Maximum time before forcing a ledger rollover for a topic
+
+**Type**: `int`
+
+**Default**: `240`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerMaxReadsInFlightPermitsAcquireQueueSize
+Maximum number of reads that can be queued for acquiring permits for max reads in flight when managedLedgerMaxReadsInFlightSizeInMB is set (\>0) and the limit is reached.
+
+**Type**: `int`
+
+**Default**: `50000`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerMaxReadsInFlightPermitsAcquireTimeoutMillis
+Maximum time to wait for acquiring permits for max reads in flight when managedLedgerMaxReadsInFlightSizeInMB is set (\>0) and the limit is reached.
+
+**Type**: `long`
+
+**Default**: `60000`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerMaxReadsInFlightSizeInMB
+Maximum buffer size in MB for bytes read from storage (or from the cache). This is the memory retained by data read from storage (or cache) until it has been delivered to the Consumer Netty channel. This provides backpressure for BookKeeper and tiered storage reads, preventing the broker from having too many concurrent reads and running into Out of Memory errors when there are multiple concurrent reads to multiple concurrent consumers.
+When left unset (empty), it defaults to the greater of dispatcherMaxReadSizeBytes and 15% of available JVM direct memory; dispatcherMaxReadSizeBytes is the minimum value so the limiter can never block the completion of a single read.
+Set to 0 to disable the feature.
+Set to a value greater than 0 to use that many MB.
+
+**Type**: `java.lang.Long`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerMaxSizePerLedgerMbytes
+Maximum ledger size before triggering a rollover for a topic (MB)
+
+**Type**: `int`
+
+**Default**: `2048`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerMaxUnackedRangesToPersist
+Max number of `acknowledgment holes` that are going to be persistently stored.
+
+When acknowledging out of order, a consumer will leave holes that are supposed to be quickly filled by acking all the messages. The information of which messages are acknowledged is persisted by compressing in `ranges` of messages that were acknowledged. After the max number of ranges is reached, the information will only be tracked in memory and messages will be redelivered in case of crashes.
+Note: when managedLedgerPersistIndividualAckAsLongArray is enabled (the default), the persisted size is bounded by the backlog size (the range of entries the cursor spans), not by this max number of unacked ranges. For BookKeeper ledger storage, with the default broker maxMessageSize and BookKeeper nettyMaxFrameSizeBytes, the state fits a backlog of about 30M entries (excluding the managedLedgerMaxBatchDeletedIndexToPersist storage, whose size is instead relative to the number of acknowl [...]
+
+**Type**: `int`
+
+**Default**: `200000`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerMaxUnackedRangesToPersistInMetadataStore
+Max number of `acknowledgment holes` that can be stored in MetadataStore.
+
+If number of unack message range is higher than this limit then broker will persist unacked ranges into bookkeeper to avoid additional data overhead into MetadataStore.
+
+**Type**: `int`
+
+**Default**: `200000`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerMaxWriteQuorum
+Max number of copies to store for each message
+
+**Type**: `int`
+
+**Default**: `5`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerMetadataOperationsTimeoutSeconds
+operation timeout while updating managed-ledger metadata.
+
+**Type**: `long`
+
+**Default**: `60`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerMinLedgerRolloverTimeMinutes
+Minimum time between ledger rollover for a topic
+
+**Type**: `int`
+
+**Default**: `10`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerMinimumBacklogCursorsForCaching
+Minimum cursors that must be in backlog state to cache and reuse the read entries.(Default =0 to disable backlog reach cache)
+This has no effect when cacheEvictionByExpectedReadCount is enabled.
+
+**Type**: `int`
+
+**Default**: `0`
+
+**Dynamic**: `true`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerMinimumBacklogEntriesForCaching
+Minimum backlog entries for any cursor before start caching reads
+This has no effect when cacheEvictionByExpectedReadCount is enabled.
+
+**Type**: `int`
+
+**Default**: `1000`
+
+**Dynamic**: `true`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerNewEntriesCheckDelayInMillis
+New entries check delay for the cursor under the managed ledger.
+If no new messages in the topic, the cursor will try to check again after the delay time.
+For consumption latency sensitive scenario, can set to a smaller value or set to 0.
+Of course, this may degrade consumption throughput. Default is 10ms.
+
+**Type**: `int`
+
+**Default**: `10`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerNumSchedulerThreads
+Number of threads to be used for managed ledger scheduled tasks
+
+**Type**: `int`
+
+**Default**: `1`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerPassword
+Default password to use when writing to BookKeeper.
+
+Default is ``.
+
+**Type**: `java.lang.String`
+
+**Default**: ``
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerPersistIndividualAckAsLongArray
+When storing acknowledgement state, choose a more compact serialization format that stores individual acknowledgements as a bitmap which is serialized to an array of long values.
+
+NOTE: This setting requires managedLedgerUnackedRangesOpenCacheSetEnabled=true to be effective.
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerPrometheusStatsLatencyRolloverSeconds
+Managed ledger prometheus stats latency rollover seconds
+
+**Type**: `int`
+
+**Default**: `60`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerReadEntryTimeoutSeconds
+Read entries timeout when broker tries to read messages from bookkeeper (0 to disable it)
+
+**Type**: `long`
+
+**Default**: `0`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerStatsPeriodSeconds
+How frequently to refresh the stats. (seconds). Default is 60 seconds
+
+**Type**: `int`
+
+**Default**: `60`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerStorageClassName
+The class of the managed ledger storage
+
+**Type**: `java.lang.String`
+
+**Default**: `org.apache.pulsar.broker.ManagedLedgerClientFactory`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### managedLedgerTraceTaskExecution
+Whether trace managed ledger task execution time
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `true`
+
+**Category**: Storage (Managed Ledger)
+
+### persistentUnackedRangesWithMultipleEntriesEnabled
+If enabled, the maximum "acknowledgment holes" will not be limited and "acknowledgment holes" are stored in multiple entries.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+### schemaLedgerForceRecovery
+Skip schema ledger failure to forcefully recover topic successfully.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `true`
+
+**Category**: Storage (Managed Ledger)
+
+### brokerClientSslFactoryPlugin
+SSL Factory Plugin class used by internal client to provide SSLEngine and SSLContext objects. The default class used is DefaultSslFactory.
+
+**Type**: `java.lang.String`
+
+**Default**: `org.apache.pulsar.common.util.DefaultPulsarSslFactory`
+
+**Dynamic**: `false`
+
+**Category**: TLS
+
+### brokerClientSslFactoryPluginParams
+SSL Factory plugin configuration parameters used by internal client.
+
+**Type**: `java.lang.String`
+
+**Default**: ``
+
+**Dynamic**: `false`
+
+**Category**: TLS
+
+### sslFactoryPlugin
+SSL Factory Plugin class to provide SSLEngine and SSLContext objects. The default class used is DefaultSslFactory.
+
+**Type**: `java.lang.String`
+
+**Default**: `org.apache.pulsar.common.util.DefaultPulsarSslFactory`
+
+**Dynamic**: `false`
+
+**Category**: TLS
+
+### sslFactoryPluginParams
+SSL Factory plugin configuration parameters.
+
+**Type**: `java.lang.String`
+
+**Default**: ``
+
+**Dynamic**: `false`
+
+**Category**: TLS
+
+### tlsAllowInsecureConnection
+Accept untrusted TLS certificate from client
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: TLS
+
+### tlsCertRefreshCheckDurationSec
+Tls cert refresh duration in seconds (set 0 to check on every new connection)
+
+**Type**: `long`
+
+**Default**: `300`
+
+**Dynamic**: `false`
+
+**Category**: TLS
+
+### tlsCertificateFilePath
+Path for the TLS certificate file
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: TLS
+
+### tlsCiphers
+Specify the tls cipher the broker will use to negotiate during TLS Handshake.
+
+Example:- [TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256]
+
+**Type**: `java.util.Set`
+
+**Default**: `[]`
+
+**Dynamic**: `false`
+
+**Category**: TLS
+
+### tlsEnabled
+Enable TLS
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: TLS
+
+### tlsHostnameVerificationEnabled
+Whether the hostname is validated when the broker creates a TLS connection with other brokers
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: TLS
+
+### tlsKeyFilePath
+Path for the TLS private key file
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: TLS
+
+### tlsProtocols
+Specify the tls protocols the broker will use to negotiate during TLS Handshake.
+
+Example:- [TLSv1.3, TLSv1.2]
+
+**Type**: `java.util.Set`
+
+**Default**: `[]`
+
+**Dynamic**: `false`
+
+**Category**: TLS
+
+### tlsRequireTrustedClientCertOnConnect
+Specify whether Client certificates are required for TLS Reject.
+the Connection if the Client Certificate is not trusted
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: TLS
+
+### tlsTrustCertsFilePath
+Path for the trusted TLS certificate file
+
+**Type**: `java.lang.String`
+
+**Default**: ``
+
+**Dynamic**: `false`
+
+**Category**: TLS
+
+### webServiceTlsCiphers
+Specify the tls cipher the proxy's web service will use to negotiate during TLS Handshake.
+
+Example:- [TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256]
+
+**Type**: `java.util.Set`
+
+**Default**: `[]`
+
+**Dynamic**: `false`
+
+**Category**: TLS
+
+### webServiceTlsProtocols
+Specify the tls protocols the proxy's web service will use to negotiate during TLS Handshake.
+
+Example:- [TLSv1.3, TLSv1.2]
+
+**Type**: `java.util.Set`
+
+**Default**: `[]`
+
+**Dynamic**: `false`
+
+**Category**: TLS
+
+### maxActiveTransactionsPerCoordinator
+The max active transactions per transaction coordinator, default value 0 indicates no limit.
+
+**Type**: `long`
+
+**Default**: `0`
+
+**Dynamic**: `false`
+
+**Category**: Transaction
+
+### numTransactionReplayThreadPoolSize
+Number of threads to use for pulsar transaction replay PendingAckStore or TransactionBuffer.Default is 5
+
+**Type**: `int`
+
+**Default**: `1`
+
+**Dynamic**: `false`
+
+**Category**: Transaction
+
+### transactionBufferClientMaxConcurrentRequests
+The max concurrent requests for transaction buffer client.
+
+**Type**: `int`
+
+**Default**: `1000`
+
+**Dynamic**: `false`
+
+**Category**: Transaction
+
+### transactionBufferClientOperationTimeoutInMills
+The transaction buffer client's operation timeout in milliseconds.
+
+**Type**: `long`
+
+**Default**: `3000`
+
+**Dynamic**: `false`
+
+**Category**: Transaction
+
+### transactionBufferProviderClassName
+Class name for transaction buffer provider. The default DispatchingTransactionBufferProvider routes segment:// topics to the metadata-driven MetadataTransactionBuffer (PIP-473) and persistent:// / topic:// topics to the legacy TopicTransactionBuffer. Set this to org.apache.pulsar.broker.transaction.buffer.impl.TopicTransactionBufferProvider to force the legacy buffer for all topics.
+
+**Type**: `java.lang.String`
+
+**Default**: `org.apache.pulsar.broker.transaction.buffer.impl.DispatchingTransactionBufferProvider`
+
+**Dynamic**: `false`
+
+**Category**: Transaction
+
+### transactionBufferSegmentedSnapshotEnabled
+Whether to enable segmented transaction buffer snapshot to handle a large number of aborted transactions.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Transaction
+
+### transactionBufferSnapshotMaxTransactionCount
+Transaction buffer take snapshot transaction countIf transaction buffer enables snapshot segment, transaction buffer updates snapshot metadataafter the number of transaction operations reaches this value.
+
+**Type**: `int`
+
+**Default**: `1000`
+
+**Dynamic**: `false`
+
+**Category**: Transaction
+
+### transactionBufferSnapshotMinTimeInMillis
+The interval time for transaction buffer to take snapshots.If transaction buffer enables snapshot segment, it is the interval time for transaction buffer to update snapshot metadata.
+
+**Type**: `int`
+
+**Default**: `5000`
+
+**Dynamic**: `false`
+
+**Category**: Transaction
+
+### transactionBufferSnapshotSegmentSize
+Transaction buffer stores the transaction ID of aborted transactions and takes snapshots.This configuration determines the size of the snapshot segment. The default value is 256 KB (262144 bytes).
+
+**Type**: `int`
+
+**Default**: `262144`
+
+**Dynamic**: `false`
+
+**Category**: Transaction
+
+### transactionCoordinatorEnabled
+Enable transaction coordinator in broker
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Transaction
+
+### transactionCoordinatorScalableTopicsEnabled
+Enable the metadata-driven transaction coordinator used by scalable topics. When true, transaction wire commands flagged as scalable (sent by v5 SDK clients) are served by the metadata-store-backed coordinator, while legacy (v4) clients continue to be served by TransactionMetadataStoreService — the two coexist on the same cluster. Requires transactionCoordinatorEnabled = true. Enabled by default together with the dispatching transaction buffer and pending-ack store providers.
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `false`
+
+**Category**: Transaction
+
+### transactionCoordinatorScalableTopicsGcIntervalSeconds
+Interval, in seconds, at which the scalable-topics transaction coordinator sweeps for finalized transactions whose retention has elapsed and garbage-collects their metadata. Only relevant when transactionCoordinatorScalableTopicsEnabled = true.
+
+**Type**: `int`
+
+**Default**: `300`
+
+**Dynamic**: `false`
+
+**Category**: Transaction
+
+### transactionCoordinatorScalableTopicsGcRetentionSeconds
+How long, in seconds, a finalized (committed/aborted) transaction's metadata is retained before the scalable-topics transaction coordinator's GC sweep is allowed to delete it. Gives participants time to observe the outcome via the durable per-segment visibility state. Only relevant when transactionCoordinatorScalableTopicsEnabled = true.
+
+**Type**: `int`
+
+**Default**: `900`
+
+**Dynamic**: `false`
+
+**Category**: Transaction
+
+### transactionCoordinatorScalableTopicsParallelism
+Degree of parallelism for the scalable-topics transaction coordinator: how many independent coordinator instances run across the cluster. Each is leader-elected independently in the metadata store and coordinates the transactions whose id maps to it. Fixed at cluster bring-up — changing it later would strand the coordinator id encoded in existing transaction ids (and, because an aborted transaction's records are retained as long as its messages are, the value can only be reduced once all [...]
+
+**Type**: `int`
+
+**Default**: `16`
+
+**Dynamic**: `false`
+
+**Category**: Transaction
+
+### transactionCoordinatorScalableTopicsTimeoutSweepIntervalSeconds
+Interval, in seconds, at which the scalable-topics transaction coordinator sweeps for timed-out open transactions and aborts them. Only the broker that owns partition 0 of the transaction-coordinator-assign topic runs the sweep. Only relevant when transactionCoordinatorScalableTopicsEnabled = true.
+
+**Type**: `int`
+
+**Default**: `60`
+
+**Dynamic**: `false`
+
+**Category**: Transaction
+
+### transactionMetadataStoreProviderClassName
+Class name for transaction metadata store provider
+
+**Type**: `java.lang.String`
+
+**Default**: `org.apache.pulsar.transaction.coordinator.impl.MLTransactionMetadataStoreProvider`
+
+**Dynamic**: `false`
+
+**Category**: Transaction
+
+### transactionPendingAckLogIndexMinLag
+MLPendingAckStore maintain a ConcurrentSkipListMap pendingAckLogIndex`,it store the position in pendingAckStore as value and save a position used to determinewhether the previous data can be cleaned up as a key.transactionPendingAckLogIndexMinLag is used to configure the minimum lag between indexes
+
+**Type**: `long`
+
+**Default**: `500`
+
+**Dynamic**: `false`
+
+**Category**: Transaction
+
+### transactionPendingAckStoreProviderClassName
+Class name for transaction pending ack store provider. The default DispatchingTransactionPendingAckStoreProvider routes subscriptions on segment:// topics to the metadata-driven MetadataPendingAckStore (PIP-473) and others to the legacy MLPendingAckStore. Set this to org.apache.pulsar.broker.transaction.pendingack.impl.MLPendingAckStoreProvider to force the legacy store for all subscriptions.
+
+**Type**: `java.lang.String`
+
+**Default**: `org.apache.pulsar.broker.transaction.pendingack.impl.DispatchingTransactionPendingAckStoreProvider`
+
+**Dynamic**: `false`
+
+**Category**: Transaction
+
+### isRunningStandalone
+Flag indicates whether to run broker in standalone mode
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: WebSocket
+
+### webSocketConnectionsPerBroker
+Number of connections per Broker in Pulsar Client used in WebSocket proxy
+
+**Type**: `int`
+
+**Default**: `1`
+
+**Dynamic**: `false`
+
+**Category**: WebSocket
+
+### webSocketMaxTextFrameSize
+The maximum size of a text message during parsing in WebSocket proxy.
+
+**Type**: `int`
+
+**Default**: `1048576`
+
+**Dynamic**: `false`
+
+**Category**: WebSocket
+
+### webSocketNumIoThreads
+Number of IO threads in Pulsar Client used in WebSocket proxy
+
+**Type**: `int`
+
+**Default**: `1`
+
+**Dynamic**: `false`
+
+**Category**: WebSocket
+
+### webSocketNumServiceThreads
+Number of threads used by Websocket service
+
+**Type**: `int`
+
+**Default**: `20`
+
+**Dynamic**: `false`
+
+**Category**: WebSocket
+
+### webSocketPingDurationSeconds
+Interval of time to sending the ping to keep alive in WebSocket proxy. This value greater than 0 means enabled
+
+**Type**: `int`
+
+**Default**: `-1`
+
+**Dynamic**: `false`
+
+**Category**: WebSocket
+
+### webSocketPulsarClientMemoryLimitInMB
+Memory limit in MBs for direct memory in Pulsar Client used in WebSocket proxy
+
+**Type**: `int`
+
+**Default**: `0`
+
+**Dynamic**: `false`
+
+**Category**: WebSocket
+
+### webSocketServiceEnabled
+Enable the WebSocket API service in broker
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: WebSocket
+
+### webSocketSessionIdleTimeoutMillis
+Time in milliseconds that idle WebSocket session times out
+
+**Type**: `int`
+
+**Default**: `300000`
+
+**Dynamic**: `false`
+
+**Category**: WebSocket
+
+## Deprecated
+### loadBalancerBrokerComfortLoadLevelPercentage
+Usage threshold to determine a broker is having just right level of load (only used by SimpleLoadManagerImpl)
+
+**Type**: `int`
+
+**Default**: `65`
+
+**Dynamic**: `false`
+
+**Category**: Load Balancer
+
+### loadBalancerBrokerUnderloadedThresholdPercentage
+Usage threshold to determine a broker as under-loaded (only used by SimpleLoadManagerImpl)
+
+**Type**: `int`
+
+**Default**: `50`
+
+**Dynamic**: `false`
+
+**Category**: Load Balancer
+
+### loadBalancerMemoryResourceWeight
+Memory Resource Usage Weight. Deprecated: Memory is no longer used as a load balancing item.
+
+**Type**: `double`
+
+**Default**: `0.0`
+
+**Dynamic**: `true`
+
+**Category**: Load Balancer
+
+### loadBalancerPlacementStrategy
+load placement strategy[weightedRandomSelection/leastLoadedServer] (only used by SimpleLoadManagerImpl)
+
+**Type**: `java.lang.String`
+
+**Default**: `leastLoadedServer`
+
+**Dynamic**: `false`
+
+**Category**: Load Balancer
+
+### brokerServicePurgeInactiveFrequencyInSeconds
+How often broker checks for inactive topics to be deleted (topics with no subscriptions and no one connected) Deprecated in favor of using `brokerDeleteInactiveTopicsFrequencySeconds`
+@deprecated - unused.
+
+**Type**: `int`
+
+**Default**: `60`
+
+**Dynamic**: `false`
+
+**Category**: Policies
+
+### replicationTlsEnabled
+@deprecated - Use brokerClientTlsEnabled instead.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Replication
+
+### configurationStoreServers
+Configuration store connection string (as a comma-separated list). Deprecated in favor of `configurationMetadataStoreUrl`
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### globalZookeeperServers
+Global Zookeeper quorum connection string (as a comma-separated list). Deprecated in favor of using `configurationStoreServers`
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### numWorkerThreadsForNonPersistentTopic
+Number of worker threads to serve non-persistent topic.
+@deprecated - use topicOrderedExecutorThreadNum instead.
+
+**Type**: `int`
+
+**Default**: `-1`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### zooKeeperAllowReadOnlyOperations
+Is zookeeper allow read-only operations.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### zooKeeperCacheExpirySeconds
+ZooKeeper cache expiry time in seconds. @deprecated - Use metadataStoreCacheExpirySeconds instead.
+
+**Type**: `int`
+
+**Default**: `-1`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### zooKeeperOperationTimeoutSeconds
+ZooKeeper operation timeout in seconds. @deprecated - Use metadataStoreOperationTimeoutSeconds instead.
+
+**Type**: `int`
+
+**Default**: `-1`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### zooKeeperSessionTimeoutMillis
+ZooKeeper session timeout in milliseconds. @deprecated - Use metadataStoreSessionTimeoutMillis instead.
+
+**Type**: `long`
+
+**Default**: `-1`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### zookeeperServers
+The Zookeeper quorum connection string (as a comma-separated list). Deprecated in favour of metadataStoreUrl
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Server
+
+### managedLedgerMaxUnackedRangesToPersistInZooKeeper
+Max number of `acknowledgment holes` that can be stored in Zookeeper.
+
+If number of unack message range is higher than this limit then broker will persist unacked ranges into bookkeeper to avoid additional data overhead into zookeeper.
+@deprecated - use managedLedgerMaxUnackedRangesToPersistInMetadataStore.
+
+**Type**: `int`
+
+**Default**: `-1`
+
+**Dynamic**: `false`
+
+**Category**: Storage (Managed Ledger)
+
+
diff --git a/static/reference/5.0.x/config/reference-configuration-client.md b/static/reference/5.0.x/config/reference-configuration-client.md
new file mode 100644
index 00000000000..be0bcc58a8e
--- /dev/null
+++ b/static/reference/5.0.x/config/reference-configuration-client.md
@@ -0,0 +1,432 @@
+# Client
+
+## Required
+### serviceUrl
+Pulsar cluster HTTP URL to connect to a broker.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+## Optional
+### authParamMap
+Authentication map of the client.
+
+**Type**: `java.util.Map`
+
+**Default**: `null`
+
+### authParams
+Authentication parameter of the client.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### authPluginClassName
+Class name of authentication plugin of the client.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### authentication
+Authentication settings of the client.
+
+**Type**: `org.apache.pulsar.client.api.Authentication`
+
+**Default**: `null`
+
+### autoCertRefreshSeconds
+Seconds of auto refreshing certificate.
+
+**Type**: `int`
+
+**Default**: `300`
+
+### concurrentLookupRequest
+The number of concurrent lookup requests that can be sent on each broker connection. Setting a maximum prevents overloading a broker.
+
+**Type**: `int`
+
+**Default**: `5000`
+
+### connectionMaxIdleSeconds
+Release the connection if it is not used for more than [connectionMaxIdleSeconds] seconds. If [connectionMaxIdleSeconds] < 0, disables the feature that auto-releases the idle connections
+
+**Type**: `int`
+
+**Default**: `60`
+
+### connectionTimeoutMs
+Duration of waiting for a connection to a broker to be established. If the duration passes without a response from a broker, the connection attempt is dropped.
+
+**Type**: `int`
+
+**Default**: `10000`
+
+### connectionsPerBroker
+Number of connections established between the client and each Broker. A value of 0 means to disable connection pooling.
+
+**Type**: `int`
+
+**Default**: `1`
+
+### description
+The extra description of the client version. The length cannot exceed 64.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### dnsLookupBindAddress
+The Pulsar client dns lookup bind address, default behavior is bind on 0.0.0.0
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### dnsLookupBindPort
+The Pulsar client dns lookup bind port, takes effect when dnsLookupBindAddress is configured, default value is 0.
+
+**Type**: `int`
+
+**Default**: `0`
+
+### dnsServerAddresses
+The Pulsar client dns lookup server address
+
+**Type**: `java.util.List`
+
+**Default**: `[]`
+
+### enableBusyWait
+Whether to enable BusyWait for EpollEventLoopGroup.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+### enableTransaction
+Whether to enable transaction.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+### initialBackoffIntervalNanos
+Initial backoff interval (in nanosecond).
+
+**Type**: `long`
+
+**Default**: `100000000`
+
+### keepAliveIntervalSeconds
+Seconds of keeping alive interval for each client broker connection.
+
+**Type**: `int`
+
+**Default**: `30`
+
+### listenerName
+Listener name for lookup. Clients can use listenerName to choose one of the listeners as the service URL to create a connection to the broker as long as the network is accessible. "advertisedListeners" must be enabled on the broker side.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### lookupTimeoutMs
+Client lookup timeout (in milliseconds).
+
+**Type**: `long`
+
+**Default**: `-1`
+
+### maxBackoffIntervalNanos
+Max backoff interval (in nanosecond).
+
+**Type**: `long`
+
+**Default**: `60000000000`
+
+### maxLookupRedirects
+Maximum times of redirected lookup requests.
+
+**Type**: `int`
+
+**Default**: `20`
+
+### maxLookupRequest
+Maximum number of lookup requests allowed on each broker connection to prevent overloading a broker.
+
+**Type**: `int`
+
+**Default**: `50000`
+
+### maxNumberOfRejectedRequestPerConnection
+Maximum number of rejected requests of a broker in a certain time frame (60 seconds) after the current connection is closed and the client creating a new connection to connect to a different broker.
+
+**Type**: `int`
+
+**Default**: `50`
+
+### memoryLimitBytes
+Limit of client memory usage (in byte). The 64M default can guarantee a high producer throughput.
+
+**Type**: `long`
+
+**Default**: `67108864`
+
+### numIoThreads
+Number of IO threads.
+
+**Type**: `int`
+
+**Default**: `1`
+
+### numListenerThreads
+Number of consumer listener threads.
+
+**Type**: `int`
+
+**Default**: `1`
+
+### operationTimeoutMs
+Client operation timeout (in milliseconds).
+
+**Type**: `long`
+
+**Default**: `30000`
+
+### originalPrincipal
+Original principal for proxy authentication scenarios.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### proxyProtocol
+Protocol of proxy service. proxyServiceUrl and proxyProtocol must be mutually inclusive.
+
+**Type**: `org.apache.pulsar.client.api.ProxyProtocol`
+
+**Default**: `null`
+
+### proxyServiceUrl
+URL of proxy service. proxyServiceUrl and proxyProtocol must be mutually inclusive.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### readTimeoutMs
+Maximum read time of a request.
+
+**Type**: `int`
+
+**Default**: `60000`
+
+### requestTimeoutMs
+Maximum duration for completing a request.
+
+**Type**: `int`
+
+**Default**: `60000`
+
+### serviceUrlProvider
+The implementation class of ServiceUrlProvider used to generate ServiceUrl.
+
+**Type**: `org.apache.pulsar.client.api.ServiceUrlProvider`
+
+**Default**: `null`
+
+### serviceUrlQuarantineInitDurationMs
+The initial duration (in milliseconds) to quarantine endpoints that fail to connect. A value of 0 means don't quarantine any endpoints even if they fail.
+
+**Type**: `long`
+
+**Default**: `60000`
+
+### serviceUrlQuarantineMaxDurationMs
+The max duration (in milliseconds) to quarantine endpoints that fail to connect. A value of 0 means don't quarantine any endpoints even if they fail.
+
+**Type**: `long`
+
+**Default**: `86400000`
+
+### socks5ProxyAddress
+Address of SOCKS5 proxy.
+
+**Type**: `java.net.InetSocketAddress`
+
+**Default**: `null`
+
+### socks5ProxyPassword
+Password of SOCKS5 proxy.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### socks5ProxyScope
+Selector that controls which connections go through the SOCKS5 proxy. BINARY_ONLY (default for PulsarClient) only routes Pulsar binary protocol connections; HTTP_ONLY only routes HTTP/HTTPS traffic (HTTP lookups, failover HTTP clients, admin REST); BOTH routes both. This preserves backward compatibility with the pre-existing behavior where the SOCKS5 proxy on PulsarClient only applied to the binary protocol.
+
+**Type**: `org.apache.pulsar.client.api.Socks5ProxyScope`
+
+**Default**: `BINARY_ONLY`
+
+### socks5ProxyUsername
+User name of SOCKS5 proxy.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### sslFactoryPlugin
+SSL Factory Plugin class to provide SSLEngine and SSLContext objects. The default class used is DefaultPulsarSslFactory.
+
+**Type**: `java.lang.String`
+
+**Default**: `org.apache.pulsar.common.util.DefaultPulsarSslFactory`
+
+### sslFactoryPluginParams
+SSL Factory plugin configuration parameters.
+
+**Type**: `java.lang.String`
+
+**Default**: ``
+
+### sslProvider
+The TLS provider used by an internal client to authenticate with other Pulsar brokers.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### statsIntervalSeconds
+Interval to print client stats (in seconds).
+
+**Type**: `long`
+
+**Default**: `60`
+
+### tlsAllowInsecureConnection
+Whether the client accepts untrusted TLS certificates from the broker.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+### tlsCertificateFilePath
+Path to the TLS certificate file.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### tlsCiphers
+Set of TLS Ciphers.
+
+**Type**: `java.util.Set`
+
+**Default**: `[]`
+
+### tlsHostnameVerificationEnable
+Whether the hostname is validated when the client creates a TLS connection with brokers.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+### tlsKeyFilePath
+Path to the TLS key file.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### tlsKeyStorePassword
+Password of TLS KeyStore.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### tlsKeyStorePath
+Path of TLS KeyStore.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### tlsKeyStoreType
+TLS KeyStore type configuration.
+
+**Type**: `java.lang.String`
+
+**Default**: `JKS`
+
+### tlsProtocols
+Protocols of TLS.
+
+**Type**: `java.util.Set`
+
+**Default**: `[]`
+
+### tlsTrustCertsFilePath
+Path to the trusted TLS certificate file.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### tlsTrustStorePassword
+Password of TLS TrustStore.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### tlsTrustStorePath
+Path of TLS TrustStore.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+### tlsTrustStoreType
+TLS TrustStore type configuration. You need to set this configuration when client authentication is required.
+
+**Type**: `java.lang.String`
+
+**Default**: `JKS`
+
+### tracingEnabled
+Whether to enable OpenTelemetry distributed tracing. When enabled, tracing interceptors are automatically added to producers and consumers.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+### useKeyStoreTls
+Set TLS using KeyStore way.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+### useTcpNoDelay
+Whether to use TCP NoDelay option.
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+### useTls
+Whether to use TLS.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+
diff --git a/static/reference/5.0.x/config/reference-configuration-log4j-shell.md b/static/reference/5.0.x/config/reference-configuration-log4j-shell.md
new file mode 100644
index 00000000000..43fca015c0d
--- /dev/null
+++ b/static/reference/5.0.x/config/reference-configuration-log4j-shell.md
@@ -0,0 +1,37 @@
+# Log4j shell
+
+### bookkeeper.root.logger
+
+**Default**: ERROR,CONSOLE
+
+### log4j.rootLogger
+
+**Default**: ${bookkeeper.root.logger}
+
+### log4j.appender.CONSOLE
+
+**Default**: org.apache.log4j.ConsoleAppender
+
+### log4j.appender.CONSOLE.Threshold
+
+**Default**: DEBUG
+
+### log4j.appender.CONSOLE.layout
+
+**Default**: org.apache.log4j.PatternLayout
+
+### log4j.appender.CONSOLE.layout.ConversionPattern
+
+**Default**: %d{ABSOLUTE} %-5p %m%n
+
+### log4j.logger.org.apache.zookeeper
+
+**Default**: ERROR
+
+### log4j.logger.org.apache.bookkeeper
+
+**Default**: ERROR
+
+### log4j.logger.org.apache.bookkeeper.bookie.BookieShell
+
+**Default**: INFO
diff --git a/static/reference/5.0.x/config/reference-configuration-log4j.md b/static/reference/5.0.x/config/reference-configuration-log4j.md
new file mode 100644
index 00000000000..6aa18e03a23
--- /dev/null
+++ b/static/reference/5.0.x/config/reference-configuration-log4j.md
@@ -0,0 +1,80 @@
+# Log4j
+
+You can set the log level and configuration in the [log4j2.yaml](https://github.com/apache/pulsar/blob/d557e0aa286866363bc6261dec87790c055db1b0/conf/log4j2.yaml#L155) file. The following logging configuration parameters are available.
+
+### pulsar.root.logger
+
+**Default**: WARN,CONSOLE
+
+### pulsar.log.dir
+
+**Default**: logs
+
+### pulsar.log.file
+
+**Default**: pulsar.log
+
+### log4j.rootLogger
+
+**Default**: ${pulsar.root.logger}
+
+### log4j.appender.CONSOLE
+
+**Default**: org.apache.log4j.ConsoleAppender
+
+### log4j.appender.CONSOLE.Threshold
+
+**Default**: DEBUG
+
+### log4j.appender.CONSOLE.layout
+
+**Default**: org.apache.log4j.PatternLayout
+
+### log4j.appender.CONSOLE.layout.ConversionPattern
+
+**Default**: %d{ISO8601} - %-5p - [%t:%C{1}@%L] - %m%n
+
+### log4j.appender.ROLLINGFILE
+
+**Default**: org.apache.log4j.DailyRollingFileAppender
+
+### log4j.appender.ROLLINGFILE.Threshold
+
+**Default**: DEBUG
+
+### log4j.appender.ROLLINGFILE.File
+
+**Default**: ${pulsar.log.dir}/${pulsar.log.file}
+
+### log4j.appender.ROLLINGFILE.layout
+
+**Default**: org.apache.log4j.PatternLayout
+
+### log4j.appender.ROLLINGFILE.layout.ConversionPattern
+
+**Default**: %d{ISO8601} - %-5p [%t:%C{1}@%L] - %m%n
+
+### log4j.appender.TRACEFILE
+
+**Default**: org.apache.log4j.FileAppender
+
+### log4j.appender.TRACEFILE.Threshold
+
+**Default**: TRACE
+
+### log4j.appender.TRACEFILE.File
+
+**Default**: pulsar-trace.log
+
+### log4j.appender.TRACEFILE.layout
+
+**Default**: org.apache.log4j.PatternLayout
+
+### log4j.appender.TRACEFILE.layout.ConversionPattern
+
+**Default**: %d{ISO8601} - %-5p [%t:%C{1}@%L][%x] - %m%n
+
+> Note: 'topic' in log4j2.appender is configurable.
+>
+> - If you want to append all logs to a single topic, set the same topic name.
+> - If you want to append logs to different topics, you can set different topic names.
diff --git a/static/reference/5.0.x/config/reference-configuration-pulsar-proxy.md b/static/reference/5.0.x/config/reference-configuration-pulsar-proxy.md
new file mode 100644
index 00000000000..3b71b4065dc
--- /dev/null
+++ b/static/reference/5.0.x/config/reference-configuration-pulsar-proxy.md
@@ -0,0 +1,1500 @@
+# Pulsar proxy
+
+## Required
+## Optional
+### brokerClientAuthenticationParameters
+The authentication parameters used by the Pulsar proxy to authenticate with Pulsar brokers
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Broker Client Authorization
+
+### brokerClientAuthenticationPlugin
+The authentication plugin used by the Pulsar proxy to authenticate with Pulsar brokers
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Broker Client Authorization
+
+### brokerClientCertificateFilePath
+The path to the TLS certificate used by the Pulsar proxy to authenticate with Pulsar brokers
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Broker Client Authorization
+
+### brokerClientKeyFilePath
+The path to TLS private key used by the Pulsar proxy to authenticate with Pulsar brokers
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Broker Client Authorization
+
+### brokerClientTrustCertsFilePath
+The path to trusted certificates used by the Pulsar proxy to authenticate with Pulsar brokers
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Broker Client Authorization
+
+### tlsEnabledWithBroker
+Whether TLS is enabled when communicating with Pulsar brokers
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Broker Client Authorization
+
+### brokerServiceURL
+If does not set metadataStoreUrl or configurationMetadataStoreUrl, this url should point to the discovery service provider. URL must have the pulsar:// prefix. And does not support multi url yet.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Broker Discovery
+
+### brokerServiceURLTLS
+If does not set metadataStoreUrl or configurationMetadataStoreUrl, this url should point to the discovery service provider. URL must have the pulsar+ssl:// prefix. And does not support multi url yet.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Broker Discovery
+
+### brokerWebServiceURL
+The web service url points to the discovery service provider of the broker cluster, and does not support multi url yet.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Broker Discovery
+
+### brokerWebServiceURLTLS
+The tls web service url points to the discovery service provider of the broker cluster, and does not support multi url yet.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Broker Discovery
+
+### configurationMetadataStoreUrl
+The metadata store URL for the configuration data. If empty, we fall back to use metadataStoreUrl
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Broker Discovery
+
+### functionWorkerWebServiceURL
+The web service url points to the discovery service provider of the function worker cluster, and does not support multi url yet. Only configure it when you setup function workers in a separate cluster
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Broker Discovery
+
+### functionWorkerWebServiceURLTLS
+The tls web service url points to the discovery service provider of the function worker cluster, and does not support multi url yet. Only configure it when you setup function workers in a separate cluster
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Broker Discovery
+
+### metadataStoreUrl
+The metadata store URL.
+ Examples:
+ * zk:my-zk-1:2181,my-zk-2:2181,my-zk-3:2181
+ * my-zk-1:2181,my-zk-2:2181,my-zk-3:2181 (will default to ZooKeeper when the schema is not specified)
+ * zk:my-zk-1:2181,my-zk-2:2181,my-zk-3:2181/my-chroot-path (to add a ZK chroot path)
+
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: Broker Discovery
+
+### brokerProxyAllowedHostNames
+Allowed broker target host names. Supports multiple comma separated entries and a wildcard.
+
+**Type**: `java.lang.String`
+
+**Default**: `*`
+
+**Dynamic**: `false`
+
+**Category**: Broker Proxy
+
+### brokerProxyAllowedIPAddresses
+Allowed broker target ip addresses or ip networks / netmasks. Supports multiple comma separated entries.
+
+**Type**: `java.lang.String`
+
+**Default**: `*`
+
+**Dynamic**: `false`
+
+**Category**: Broker Proxy
+
+### brokerProxyAllowedTargetPorts
+Allowed broker target ports
+
+**Type**: `java.lang.String`
+
+**Default**: `6650,6651`
+
+**Dynamic**: `false`
+
+**Category**: Broker Proxy
+
+### brokerProxyConnectTimeoutMs
+Broker proxy connect timeout.
+The timeout value for Broker proxy connect timeout is in millisecond. Set to 0 to disable.
+
+**Type**: `int`
+
+**Default**: `10000`
+
+**Dynamic**: `false`
+
+**Category**: Broker Proxy
+
+### brokerProxyReadTimeoutMs
+Broker proxy read timeout.
+The timeout value for Broker proxy read timeout is in millisecond. Set to 0 to disable.
+
+**Type**: `int`
+
+**Default**: `75000`
+
+**Dynamic**: `false`
+
+**Category**: Broker Proxy
+
+### checkActiveBrokers
+When enabled, checks that the target broker is active before connecting. zookeeperServers and configurationStoreServers must be configured in proxy configuration for retrieving the active brokers.
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Broker Proxy
+
+### enableProxyStatsEndpoints
+Whether to enable the proxy's /metrics and /proxy-stats http endpoints
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `false`
+
+**Category**: HTTP
+
+### httpInputMaxReplayBufferSize
+Http input buffer max size.
+
+The maximum amount of data that will be buffered for incoming http requests so that the request body can be replayed when the backend broker issues a redirect response.
+
+**Type**: `int`
+
+**Default**: `5242880`
+
+**Dynamic**: `false`
+
+**Category**: HTTP
+
+### httpMaxRequestHeaderSize
+ The maximum size in bytes of the request header.
+ Larger headers will allow for more and/or larger cookies plus larger form content encoded in a URL.
+ However, larger headers consume more memory and can make a server more vulnerable to denial of service
+ attacks.
+
+
+**Type**: `int`
+
+**Default**: `8192`
+
+**Dynamic**: `false`
+
+**Category**: HTTP
+
+### httpNumThreads
+Number of threads to use for HTTP requests processing
+
+**Type**: `int`
+
+**Default**: `8`
+
+**Dynamic**: `false`
+
+**Category**: HTTP
+
+### httpOutputBufferSize
+Http output buffer size.
+
+The amount of data that will be buffered for http requests before it is flushed to the channel. A larger buffer size may result in higher http throughput though it may take longer for the client to see data. If using HTTP streaming via the reverse proxy, this should be set to the minimum value, 1, so that clients see the data as soon as possible.
+
+**Type**: `int`
+
+**Default**: `32768`
+
+**Dynamic**: `false`
+
+**Category**: HTTP
+
+### httpProxyIdleTimeout
+Http proxy idle timeout.
+
+The idle timeout value for HTTP proxy is in millisecond.
+
+**Type**: `int`
+
+**Default**: `30000`
+
+**Dynamic**: `false`
+
+**Category**: HTTP
+
+### httpProxyTimeout
+Http proxy timeout.
+
+The timeout value for HTTP proxy is in millisecond.
+
+**Type**: `int`
+
+**Default**: `300000`
+
+**Dynamic**: `false`
+
+**Category**: HTTP
+
+### httpRequestsLimitEnabled
+Enable the enforcement of limits on the incoming HTTP requests
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: HTTP
+
+### httpRequestsMaxPerSecond
+Max HTTP requests per seconds allowed. The excess of requests will be rejected with HTTP code 429 (Too many requests)
+
+**Type**: `double`
+
+**Default**: `100.0`
+
+**Dynamic**: `false`
+
+**Category**: HTTP
+
+### httpReverseProxyConfigs
+Http directs to redirect to non-pulsar services
+
+**Type**: `java.util.Set`
+
+**Default**: `[]`
+
+**Dynamic**: `false`
+
+**Category**: HTTP
+
+### httpServerIdleTimeout
+Idle timeout for HTTP server connections in milliseconds.
+
+**Type**: `int`
+
+**Default**: `30000`
+
+**Dynamic**: `false`
+
+**Category**: HTTP
+
+### metricsServletTimeoutMs
+Time in milliseconds that metrics endpoint would time out. Default is 30s.
+ Set it to 0 to disable timeout.
+
+**Type**: `long`
+
+**Default**: `30000`
+
+**Dynamic**: `false`
+
+**Category**: HTTP
+
+### brokerClientSslProvider
+The TLS Provider used by the Pulsar proxy to authenticate with Pulsar brokers
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: KeyStoreTLS
+
+### brokerClientTlsCiphers
+Specify the tls cipher the proxy will use to negotiate during TLS Handshake (a comma-separated list of ciphers).
+
+Examples:- [TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256].
+ used by the Pulsar proxy to authenticate with Pulsar brokers
+
+**Type**: `java.util.Set`
+
+**Default**: `[]`
+
+**Dynamic**: `false`
+
+**Category**: KeyStoreTLS
+
+### brokerClientTlsEnabledWithKeyStore
+Whether the Pulsar proxy use KeyStore type to authenticate with Pulsar brokers
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: KeyStoreTLS
+
+### brokerClientTlsKeyStore
+TLS KeyStore path for internal client, used by the Pulsar proxy to authenticate with Pulsar brokers
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: KeyStoreTLS
+
+### brokerClientTlsKeyStorePassword
+TLS KeyStore password for proxy, used by the Pulsar proxy to authenticate with Pulsar brokers
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: KeyStoreTLS
+
+### brokerClientTlsKeyStoreType
+TLS KeyStore type configuration for proxy: JKS, PKCS12 used by the Pulsar proxy to authenticate with Pulsar brokers
+
+**Type**: `java.lang.String`
+
+**Default**: `JKS`
+
+**Dynamic**: `false`
+
+**Category**: KeyStoreTLS
+
+### brokerClientTlsProtocols
+Specify the tls protocols the broker will use to negotiate during TLS handshake (a comma-separated list of protocol names).
+
+Examples:- [TLSv1.3, TLSv1.2]
+ used by the Pulsar proxy to authenticate with Pulsar brokers
+
+**Type**: `java.util.Set`
+
+**Default**: `[]`
+
+**Dynamic**: `false`
+
+**Category**: KeyStoreTLS
+
+### brokerClientTlsTrustStore
+TLS TrustStore path for proxy, used by the Pulsar proxy to authenticate with Pulsar brokers
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: KeyStoreTLS
+
+### brokerClientTlsTrustStorePassword
+TLS TrustStore password for proxy, used by the Pulsar proxy to authenticate with Pulsar brokers
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: KeyStoreTLS
+
+### brokerClientTlsTrustStoreType
+TLS TrustStore type configuration for proxy: JKS, PKCS12 used by the Pulsar proxy to authenticate with Pulsar brokers
+
+**Type**: `java.lang.String`
+
+**Default**: `JKS`
+
+**Dynamic**: `false`
+
+**Category**: KeyStoreTLS
+
+### tlsEnabledWithKeyStore
+Enable TLS with KeyStore type configuration for proxy
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: KeyStoreTLS
+
+### tlsKeyStore
+TLS KeyStore path for proxy
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: KeyStoreTLS
+
+### tlsKeyStorePassword
+TLS KeyStore password for proxy
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: KeyStoreTLS
+
+### tlsKeyStoreType
+TLS KeyStore type configuration for proxy: JKS, PKCS12
+
+**Type**: `java.lang.String`
+
+**Default**: `JKS`
+
+**Dynamic**: `false`
+
+**Category**: KeyStoreTLS
+
+### tlsProvider
+Specify the TLS provider for the broker service:
+When using TLS authentication with CACert, the valid value is either OPENSSL or JDK.
+When using TLS authentication with KeyStore, available values can be SunJSSE, Conscrypt and etc.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: KeyStoreTLS
+
+### tlsTrustStore
+TLS TrustStore path for proxy
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: KeyStoreTLS
+
+### tlsTrustStorePassword
+TLS TrustStore password for proxy, null means empty password.
+
+**Type**: `java.lang.String`
+
+**Default**: `null`
+
+**Dynamic**: `false`
+
+**Category**: KeyStoreTLS
+
+### tlsTrustStoreType
+TLS TrustStore type configuration for proxy: JKS, PKCS12
+
+**Type**: `java.lang.String`
+
+**Default**: `JKS`
+
+**Dynamic**: `false`
+
+**Category**: KeyStoreTLS
+
+### webServiceTlsProvider
+Specify the TLS provider for the web service, available values can be SunJSSE, Conscrypt and etc.
+
+**Type**: `java.lang.String`
+
+**Default**: `Conscrypt`
+
+**Dynamic**: `false`
+
+**Category**: KeyStoreTLS
+
+### authenticateMetricsEndpoint
+Whether the '/metrics' endpoint requires authentication. Defaults to true.'authenticationEnabled' must also be set for this to take effect.
+
+**Type**: `boolean`
+
+**Default**: `true`
+
+**Dynamic**: `false`
+
+**Category**: Proxy Authentication
+
+### authenticationEnabled
+Whether authentication is enabled for the Pulsar proxy
+
+**Type**: `boolean`
+
+**Default**: `false`
+
+**Dynamic**: `false`
+
+**Category**: Proxy Authentication
+
+### authenticationProviders
+Authentication provider name list (a comma-separated list of class names
+
+**Type**: `java.util.Set`
+
+**Default**: `[]`
+
+**Dynamic**: `false`
+
+**Category**: Proxy Authentication
... 471202 lines suppressed ...
(pulsar-site) 07/16: Update 5.0.x to .htaccess redirect
Posted by lh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
lhotari pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/pulsar-site.git
commit a0ac084cce55e097674eeadcc75b03e1ee025650
Author: Lari Hotari <lh...@users.noreply.github.com>
AuthorDate: Tue Jun 23 21:41:23 2026 +0300
Update 5.0.x to .htaccess redirect
---
static/.htaccess | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/static/.htaccess b/static/.htaccess
index 25f6ff1cab7..861f80a4e4d 100755
--- a/static/.htaccess
+++ b/static/.htaccess
@@ -19,7 +19,7 @@ RewriteCond expr "%{REQUEST_URI} !~ m|^/docs/\d+\.\d+\.\d+/.*|"
RewriteCond expr "%{REQUEST_URI} !~ m|^/docs/\d+\.\d+\.x|"
RewriteCond expr "%{REQUEST_URI} !~ m|^/docs/\d+\.\d+\.x/.*|"
RewriteCond expr "%{REQUEST_URI} !~ m|^/docs/client-libraries|"
-RewriteRule "^docs/(.*)$" "/docs/4.2.x/$1" [R=301,DPI,L]
+RewriteRule "^docs/(.*)$" "/docs/5.0.x/$1" [R=301,DPI,L]
# Redirect legacy versioned client-libraries URLs to the unversioned location.
# The version segment is captured and dropped; the client-libraries- slug prefix is also stripped.
(pulsar-site) 11/16: Show 5.0.0-M1 as a milestone release on the download page
Posted by lh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
lhotari pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/pulsar-site.git
commit 0d8b637e0e796220e7d9bc08dfa3aae19cf63154
Author: Lari Hotari <lh...@users.noreply.github.com>
AuthorDate: Tue Jun 23 23:53:55 2026 +0300
Show 5.0.0-M1 as a milestone release on the download page
5.0.0-M1 is an LTS milestone release that is not meant for production
use. Reflect this on the /download and /contribute/release-policy pages:
- Supported Versions table: milestone (-M*) rows show "5.0 milestone"
(no "(LTS)"), "-" for active and security support, and the full
"5.0.0-M1" as the latest version.
- Download page: title the current section "Pulsar 5.0 milestone release
5.0.0-M1" and add a "Current stable version 4.2.2" section below for
production users.
- Connectors moved to a separate repository in 5.0 (PIP-465), so the
connectors download section is hidden for 5.x+ releases and kept for
4.x releases.
---
src/components/SupportedVersionsTable.tsx | 52 ++++++++++-----
src/components/downloads.tsx | 102 +++++++++++++++++++++++++++---
src/pages/download.mdx | 30 +--------
3 files changed, 133 insertions(+), 51 deletions(-)
diff --git a/src/components/SupportedVersionsTable.tsx b/src/components/SupportedVersionsTable.tsx
index b9312466f38..c8e27252b23 100644
--- a/src/components/SupportedVersionsTable.tsx
+++ b/src/components/SupportedVersionsTable.tsx
@@ -11,20 +11,30 @@ import {styled} from "@mui/system";
type SimpleReleaseData = {
version: semver.SemVer,
+ displayVersion: string,
+ milestone: boolean,
released: moment.Moment,
releaseNoteLink: string,
};
type SupportedVersionData = {
version: semver.SemVer,
+ milestone: boolean,
released: moment.Moment,
- activeSupport: moment.Moment,
- securitySupport: moment.Moment,
+ activeSupport: moment.Moment | null,
+ securitySupport: moment.Moment | null,
latest: semver.SemVer,
+ latestDisplay: string,
latestReleased: moment.Moment,
latestReleaseNoteLink: string,
};
+// Milestone releases (e.g. 5.0.0-M1) are published ahead of an LTS release and
+// are not meant for production use, so they carry no active/security support window.
+function isMilestone(tagName: string): boolean {
+ return /-M\d+/i.test(tagName)
+}
+
function resolveActiveSupport(version: semver.SemVer, released: moment.Moment): moment.Moment {
const support = moment(released)
if (version.compareMain('3.0.0') < 0) {
@@ -57,8 +67,10 @@ function isSameFeatureRelease(v1: semver.SemVer, v2: semver.SemVer): boolean {
return v1.major == v2.major && v1.minor == v2.minor
}
-function renderVersionCell(version: semver.SemVer): JSX.Element {
- if (version.compareMain('3.0.0') < 0) {
+function renderVersionCell(version: semver.SemVer, milestone: boolean): JSX.Element {
+ if (milestone) {
+ return <TableCell>{version.major}.{version.minor} milestone</TableCell>
+ } else if (version.compareMain('3.0.0') < 0) {
return <TableCell>{version.major}.{version.minor}</TableCell>
} else if (version.minor != 0) {
return <TableCell>{version.major}.{version.minor}</TableCell>
@@ -82,7 +94,10 @@ const Dot = styled('div')({
borderRadius: '50%',
});
-function renderSupportCell(support: moment.Moment): JSX.Element {
+function renderSupportCell(support: moment.Moment | null): JSX.Element {
+ if (!support) {
+ return <TableCell>-</TableCell>
+ }
const now = moment()
return <TableCell><>
<Stack direction="row" spacing={2}>
@@ -101,15 +116,15 @@ function renderSupportCell(support: moment.Moment): JSX.Element {
function renderLatestVersionCell(d: SupportedVersionData): JSX.Element {
const now = moment()
- if (d.activeSupport.isBefore(now) && d.securitySupport.isBefore(now)) {
+ if (!d.milestone && d.activeSupport.isBefore(now) && d.securitySupport.isBefore(now)) {
// no longer supported
return <TableCell>
- <del>{d.latest.version}</del>
+ <del>{d.latestDisplay}</del>
</TableCell>
}
return <TableCell><>
- <Link href={useBaseUrl(d.latestReleaseNoteLink)}>{d.latest.version}</Link>
+ <Link href={useBaseUrl(d.latestReleaseNoteLink)}>{d.latestDisplay}</Link>
<br/>
({d.latestReleased.format('DD MMM YYYY')})
</>
@@ -123,6 +138,8 @@ type SupportedVersionsTableProps = {
const SupportedVersionsTable: FC<SupportedVersionsTableProps> = (props) => {
let releaseList: SimpleReleaseData[] = releases.map(r => ({
version: semver.coerce(r.tagName),
+ displayVersion: r.tagName.replace(/^v/, ''),
+ milestone: isMilestone(r.tagName),
released: moment(r.publishedAt),
releaseNoteLink: r.releaseNotes,
}))
@@ -136,16 +153,20 @@ const SupportedVersionsTable: FC<SupportedVersionsTableProps> = (props) => {
if (last && isSameFeatureRelease(last.version, release.version)) {
// early patch release - the support period is counted from the first patch release
last.released = release.released
- last.activeSupport = resolveActiveSupport(last.version, last.released)
- last.securitySupport = resolveSecuritySupport(last.version, last.released)
+ if (!last.milestone) {
+ last.activeSupport = resolveActiveSupport(last.version, last.released)
+ last.securitySupport = resolveSecuritySupport(last.version, last.released)
+ }
continue
}
supportedVersionList.push({
version: version,
+ milestone: release.milestone,
released: released,
- activeSupport: resolveActiveSupport(version, released),
- securitySupport: resolveSecuritySupport(version, released),
+ activeSupport: release.milestone ? null : resolveActiveSupport(version, released),
+ securitySupport: release.milestone ? null : resolveSecuritySupport(version, released),
latest: version,
+ latestDisplay: release.milestone ? release.displayVersion : version.version,
latestReleased: released,
latestReleaseNoteLink: release.releaseNoteLink,
})
@@ -153,8 +174,9 @@ const SupportedVersionsTable: FC<SupportedVersionsTableProps> = (props) => {
if (props.isHideUnmaintained) {
supportedVersionList = supportedVersionList.filter(v =>
- v.activeSupport.isAfter(new Date()) ||
- v.securitySupport.isAfter(new Date())
+ v.milestone ||
+ (v.activeSupport && v.activeSupport.isAfter(new Date())) ||
+ (v.securitySupport && v.securitySupport.isAfter(new Date()))
);
}
@@ -175,7 +197,7 @@ const SupportedVersionsTable: FC<SupportedVersionsTableProps> = (props) => {
{
supportedVersionList.map((r, i) => <>
<TableRow key={i}>
- {renderVersionCell(r.version)}
+ {renderVersionCell(r.version, r.milestone)}
{renderReleasedCell(r.released)}
{renderSupportCell(r.activeSupport)}
{renderSupportCell(r.securitySupport)}
diff --git a/src/components/downloads.tsx b/src/components/downloads.tsx
index c8e54c2c75f..6e3ef971709 100644
--- a/src/components/downloads.tsx
+++ b/src/components/downloads.tsx
@@ -11,6 +11,32 @@ import ReleaseTable from "@site/src/components/ReleaseTable";
import ConnectorTable from "@site/src/components/ConnectorTable";
import useDocusaurusContext from "@docusaurus/useDocusaurusContext";
import OldReleaseTable from "@site/src/components/OldReleaseTable";
+import useBaseUrl from "@docusaurus/useBaseUrl";
+
+type VersionProps = { version?: string }
+
+// Milestone releases (e.g. 5.0.0-M1) are published ahead of an LTS release and
+// are not meant for production use.
+function isMilestoneVersion(version: string): boolean {
+ return /-M\d+/i.test(version)
+}
+
+// Connectors moved to a separate repository starting with Pulsar 5.0 (PIP-465),
+// so 5.x+ releases no longer ship connector NARs.
+function versionHasConnectors(version: string): boolean {
+ return Number(version.split('.')[0]) < 5
+}
+
+// The "major.minor" feature line of a version, e.g. "5.0.0-M1" -> "5.0".
+function featureLine(version: string): string {
+ const [major, minor] = version.split('.')
+ return `${major}.${minor}`
+}
+
+// The latest non-milestone (stable) release, falling back to the latest release.
+function latestStablePulsarVersion(): string {
+ return pulsarReleases.find((v) => !isMilestoneVersion(v)) ?? pulsarReleases[0]
+}
export function CurrentPulsarVersion(): JSX.Element {
return <>{pulsarReleases[0]}</>
@@ -24,8 +50,8 @@ export function CurrentPulsarAdaptersVersion(): JSX.Element {
return <>{pulsarAdaptersReleases[0]}</>
}
-export function CurrentPulsarDownloadTable(): JSX.Element {
- const latestVersion = pulsarReleases[0]
+export function CurrentPulsarDownloadTable({ version }: VersionProps = {}): JSX.Element {
+ const latestVersion = version ?? pulsarReleases[0]
const latestArchiveMirrorUrl = getLatestArchiveMirrorUrl(latestVersion, "bin")
const latestSrcArchiveMirrorUrl = getLatestArchiveMirrorUrl(latestVersion, "src")
const latestArchiveUrl = distUrl(latestVersion, "bin")
@@ -51,8 +77,8 @@ export function CurrentPulsarDownloadTable(): JSX.Element {
</div>
}
-export function CurrentPulsarOffloadersDownloadTable(): JSX.Element {
- const latestVersion = pulsarReleases[0]
+export function CurrentPulsarOffloadersDownloadTable({ version }: VersionProps = {}): JSX.Element {
+ const latestVersion = version ?? pulsarReleases[0]
const data = [
{
release: "Offloaders",
@@ -67,8 +93,8 @@ export function CurrentPulsarOffloadersDownloadTable(): JSX.Element {
</div>
}
-export function CurrentPulsarConnectorsDownloadTable(): JSX.Element {
- const latestVersion = pulsarReleases[0]
+export function CurrentPulsarConnectorsDownloadTable({ version }: VersionProps = {}): JSX.Element {
+ const latestVersion = version ?? pulsarReleases[0]
const data = connectors.map((connector) => ({
connector: connector.link,
connectorText: connector.longName,
@@ -88,8 +114,8 @@ export function CurrentPulsarConnectorsDownloadTable(): JSX.Element {
</div>
}
-export function CurrentPulsarShellDownloadTable(): JSX.Element {
- const latestVersion = pulsarReleases[0]
+export function CurrentPulsarShellDownloadTable({ version }: VersionProps = {}): JSX.Element {
+ const latestVersion = version ?? pulsarReleases[0]
const data = [
{
release: "Linux / MacOS",
@@ -111,6 +137,66 @@ export function CurrentPulsarShellDownloadTable(): JSX.Element {
</div>
}
+function ArchiveNote({ label }: { label: string }): JSX.Element {
+ return <p>
+ You can download all previous versions of {label} at{' '}
+ <a href="https://archive.apache.org/dist/pulsar/">the archive page</a>.
+ </p>
+}
+
+// Renders the binary/source, shell, offloaders and (for pre-5.x releases) connectors
+// download tables for a single Pulsar version. The `primary` section owns the canonical
+// `#shell`/`#offloaders`/`#connectors` anchors that other pages link to; a secondary
+// (milestone) section uses prefixed ids so the heading anchors stay unique.
+function PulsarReleaseDownloads({ version, primary }: { version: string, primary: boolean }): JSX.Element {
+ const anchor = (name: string) => (primary ? name : `milestone-${name}`)
+ return <>
+ <ArchiveNote label="Pulsar" />
+ <CurrentPulsarDownloadTable version={version} />
+
+ <h3 id={anchor("shell")}>Shell</h3>
+ <ArchiveNote label="Pulsar shell" />
+ <CurrentPulsarShellDownloadTable version={version} />
+
+ <h3 id={anchor("offloaders")}>Offloaders</h3>
+ <ArchiveNote label="offloaders" />
+ <CurrentPulsarOffloadersDownloadTable version={version} />
+
+ {versionHasConnectors(version) && <>
+ <h3 id={anchor("connectors")}>Connectors</h3>
+ <ArchiveNote label="connectors" />
+ <CurrentPulsarConnectorsDownloadTable version={version} />
+ </>}
+ </>
+}
+
+export function CurrentPulsarDownloads(): JSX.Element {
+ const releasePolicyUrl = useBaseUrl('/contribute/release-policy')
+ const current = pulsarReleases[0]
+
+ if (!isMilestoneVersion(current)) {
+ return <>
+ <h2 id="current-version">Current version {current}</h2>
+ <PulsarReleaseDownloads version={current} primary={true} />
+ </>
+ }
+
+ const stable = latestStablePulsarVersion()
+ return <>
+ <h2 id="current-version">Pulsar {featureLine(current)} milestone release {current}</h2>
+ <p>
+ This is a milestone release published ahead of the {featureLine(current)} LTS release.
+ Milestone releases are intended for early testing and feedback and are{' '}
+ <strong>not meant for production use</strong>; see the{' '}
+ <a href={releasePolicyUrl}>release policy</a> for details.
+ </p>
+ <PulsarReleaseDownloads version={current} primary={false} />
+
+ <h2 id="current-stable-version">Current stable version {stable}</h2>
+ <PulsarReleaseDownloads version={stable} primary={true} />
+ </>
+}
+
const legacyReleaseNoteVersions = [
"2.5.0",
"2.4.2",
diff --git a/src/pages/download.mdx b/src/pages/download.mdx
index 93d84130738..6181b541d32 100644
--- a/src/pages/download.mdx
+++ b/src/pages/download.mdx
@@ -6,13 +6,9 @@ hide_table_of_contents: true
---
import {
- CurrentPulsarVersion,
CurrentPulsarManagerVersion,
CurrentPulsarAdaptersVersion,
- CurrentPulsarDownloadTable,
- CurrentPulsarOffloadersDownloadTable,
- CurrentPulsarConnectorsDownloadTable,
- CurrentPulsarShellDownloadTable,
+ CurrentPulsarDownloads,
ArchivedPulsarDownloadTable,
CppReleasesDownloadTable,
GoReleasesDownloadTable,
@@ -51,30 +47,8 @@ The container image can be used with Docker or Kubernetes:
- [Run a standalone Pulsar cluster in Docker 📘](https://pulsar.apache.org/docs/next/getting-started-docker/)
- [Apache Pulsar Helm Chart](https://github.com/apache/pulsar-helm-chart/)
-## Current version <CurrentPulsarVersion/>
-You can download all previous versions of Pulsar at [the archive page](https://archive.apache.org/dist/pulsar/).
-
-<CurrentPulsarDownloadTable/>
-- [What's New in Apache Pulsar 4.0](pathname:///blog/2024/10/24/announcing-apache-pulsar-4-0)
-
-### Shell
-
-You can download all previous versions of Pulsar shell at [the archive page](https://archive.apache.org/dist/pulsar/).
-
-<CurrentPulsarShellDownloadTable/>
-
-### Offloaders
-
-You can download all previous versions of offloaders at [the archive page](https://archive.apache.org/dist/pulsar/).
-
-<CurrentPulsarOffloadersDownloadTable/>
-
-### Connectors
-
-You can download all previous versions of connectors at [the archive page](https://archive.apache.org/dist/pulsar/).
-
-<CurrentPulsarConnectorsDownloadTable/>
+<CurrentPulsarDownloads/>
## Release integrity
(pulsar-site) 14/16: Add versioned_docs for 5.0.x
Posted by lh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
lhotari pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/pulsar-site.git
commit 1a5b9955667dbfd42f530bae19e9a68ff2cd0bf4
Author: Lari Hotari <lh...@users.noreply.github.com>
AuthorDate: Wed Jun 24 00:32:34 2026 +0300
Add versioned_docs for 5.0.x
---
versioned_docs/version-5.0.x/about.md | 60 +
versioned_docs/version-5.0.x/adaptors-kafka.md | 274 ++
versioned_docs/version-5.0.x/adaptors-spark.md | 83 +
versioned_docs/version-5.0.x/adaptors-storm.md | 90 +
versioned_docs/version-5.0.x/admin-api-brokers.md | 267 ++
versioned_docs/version-5.0.x/admin-api-clusters.md | 265 ++
versioned_docs/version-5.0.x/admin-api-features.md | 41 +
.../version-5.0.x/admin-api-functions.md | 764 +++++
.../version-5.0.x/admin-api-namespaces.md | 1251 ++++++++
.../admin-api-non-partitioned-topics.md | 7 +
.../admin-api-non-persistent-topics.md | 7 +
versioned_docs/version-5.0.x/admin-api-overview.md | 31 +
versioned_docs/version-5.0.x/admin-api-packages.md | 363 +++
.../version-5.0.x/admin-api-partitioned-topics.md | 7 +
.../version-5.0.x/admin-api-permissions.md | 177 ++
.../version-5.0.x/admin-api-persistent-topics.md | 7 +
.../version-5.0.x/admin-api-scalable-topics.md | 210 ++
versioned_docs/version-5.0.x/admin-api-schemas.md | 678 +++++
versioned_docs/version-5.0.x/admin-api-tenants.md | 234 ++
versioned_docs/version-5.0.x/admin-api-tools.md | 49 +
versioned_docs/version-5.0.x/admin-api-topics.md | 2096 ++++++++++++++
.../version-5.0.x/admin-api-transactions.md | 725 +++++
versioned_docs/version-5.0.x/admin-api-tutorial.md | 85 +
.../version-5.0.x/admin-api-use-cases.md | 37 +
versioned_docs/version-5.0.x/admin-get-started.md | 530 ++++
.../administration-anti-affinity-namespaces.md | 59 +
.../version-5.0.x/administration-dekaf-ui.md | 24 +
versioned_docs/version-5.0.x/administration-geo.md | 554 ++++
.../administration-isolation-bookie.md | 270 ++
.../administration-isolation-broker.md | 61 +
.../version-5.0.x/administration-isolation.md | 74 +
.../version-5.0.x/administration-load-balance.md | 285 ++
.../administration-metadata-store-migration.md | 181 ++
.../version-5.0.x/administration-metadata-store.md | 136 +
.../version-5.0.x/administration-proxy.md | 146 +
.../version-5.0.x/administration-pulsar-manager.md | 197 ++
.../version-5.0.x/administration-pulsar-shell.md | 175 ++
.../version-5.0.x/administration-stats.md | 190 ++
.../version-5.0.x/administration-upgrade.md | 204 ++
.../version-5.0.x/administration-zk-bk.md | 452 +++
.../bookkeeper-metadata-serviceuri.md | 117 +
.../concepts-architecture-overview.md | 207 ++
.../version-5.0.x/concepts-authentication.md | 9 +
.../concepts-broker-load-balancing-benefits.md | 56 +
.../concepts-broker-load-balancing-concepts.md | 642 +++++
.../concepts-broker-load-balancing-features.md | 29 +
.../concepts-broker-load-balancing-migration.md | 170 ++
.../concepts-broker-load-balancing-overview.md | 44 +
.../concepts-broker-load-balancing-quick-start.md | 595 ++++
.../concepts-broker-load-balancing-types.md | 49 +
.../concepts-broker-load-balancing-use-cases.md | 33 +
versioned_docs/version-5.0.x/concepts-clients.md | 169 ++
.../concepts-cluster-level-failover.md | 193 ++
versioned_docs/version-5.0.x/concepts-messaging.md | 1458 ++++++++++
.../version-5.0.x/concepts-multi-tenancy.md | 58 +
.../concepts-multiple-advertised-listeners.md | 162 ++
versioned_docs/version-5.0.x/concepts-overview.md | 38 +
.../version-5.0.x/concepts-proxy-sni-routing.md | 165 ++
.../version-5.0.x/concepts-replication.md | 65 +
.../version-5.0.x/concepts-scalable-topics.md | 76 +
.../version-5.0.x/concepts-throttling.md | 168 ++
.../version-5.0.x/concepts-tiered-storage.md | 125 +
.../version-5.0.x/concepts-topic-compaction.md | 78 +
.../version-5.0.x/concepts-transactions.md | 132 +
.../version-5.0.x/cookbooks-bookkeepermetadata.md | 21 +
.../version-5.0.x/cookbooks-compaction.md | 155 +
.../version-5.0.x/cookbooks-deduplication.md | 145 +
.../version-5.0.x/cookbooks-encryption.md | 12 +
.../version-5.0.x/cookbooks-message-queue.md | 140 +
.../version-5.0.x/cookbooks-non-persistent.md | 57 +
.../version-5.0.x/cookbooks-partitioned.md | 6 +
.../version-5.0.x/cookbooks-retention-expiry.md | 482 ++++
.../version-5.0.x/cookbooks-tiered-storage.md | 308 ++
versioned_docs/version-5.0.x/deploy-aws.md | 247 ++
.../deploy-bare-metal-multi-cluster.md | 412 +++
versioned_docs/version-5.0.x/deploy-bare-metal.md | 674 +++++
versioned_docs/version-5.0.x/deploy-docker.md | 214 ++
versioned_docs/version-5.0.x/deploy-ibm.md | 241 ++
versioned_docs/version-5.0.x/deploy-kubernetes.md | 27 +
versioned_docs/version-5.0.x/deploy-monitoring.md | 241 ++
.../version-5.0.x/develop-load-manager.md | 435 +++
versioned_docs/version-5.0.x/develop-plugin.md | 239 ++
versioned_docs/version-5.0.x/develop-tools.md | 105 +
versioned_docs/version-5.0.x/developers-landing.md | 25 +
.../version-5.0.x/developing-binary-protocol.md | 636 +++++
versioned_docs/version-5.0.x/functions-cli.md | 194 ++
versioned_docs/version-5.0.x/functions-concepts.md | 194 ++
.../version-5.0.x/functions-debug-cli.md | 183 ++
.../version-5.0.x/functions-debug-localrun.md | 70 +
.../version-5.0.x/functions-debug-log-topic.md | 47 +
.../version-5.0.x/functions-debug-stderr.md | 8 +
.../version-5.0.x/functions-debug-unit-test.md | 64 +
versioned_docs/version-5.0.x/functions-debug.md | 12 +
.../version-5.0.x/functions-deploy-arguments.md | 33 +
.../functions-deploy-cluster-builtin.md | 29 +
.../functions-deploy-cluster-encryption.md | 27 +
.../functions-deploy-cluster-package.md | 24 +
.../functions-deploy-cluster-parallelism.md | 46 +
.../functions-deploy-cluster-resource.md | 33 +
.../version-5.0.x/functions-deploy-cluster.md | 36 +
.../version-5.0.x/functions-deploy-localrun.md | 34 +
.../version-5.0.x/functions-deploy-trigger.md | 67 +
versioned_docs/version-5.0.x/functions-deploy.md | 21 +
.../version-5.0.x/functions-develop-admin-api.md | 50 +
.../version-5.0.x/functions-develop-api.md | 231 ++
.../version-5.0.x/functions-develop-log.md | 175 ++
.../version-5.0.x/functions-develop-metrics.md | 90 +
.../functions-develop-schema-registry.md | 23 +
.../version-5.0.x/functions-develop-security.md | 115 +
.../version-5.0.x/functions-develop-serde.md | 147 +
.../version-5.0.x/functions-develop-state.md | 314 ++
.../version-5.0.x/functions-develop-tutorial.md | 116 +
.../functions-develop-user-defined-configs.md | 147 +
versioned_docs/version-5.0.x/functions-develop.md | 24 +
versioned_docs/version-5.0.x/functions-overview.md | 80 +
.../version-5.0.x/functions-package-go.md | 41 +
.../version-5.0.x/functions-package-java.md | 197 ++
.../version-5.0.x/functions-package-python.md | 179 ++
versioned_docs/version-5.0.x/functions-package.md | 19 +
.../version-5.0.x/functions-quickstart.md | 627 ++++
.../functions-runtime-java-options.md | 21 +
.../version-5.0.x/functions-runtime-kubernetes.md | 199 ++
.../version-5.0.x/functions-runtime-process.md | 59 +
.../version-5.0.x/functions-runtime-thread.md | 35 +
versioned_docs/version-5.0.x/functions-runtime.md | 21 +
.../version-5.0.x/functions-worker-corun.md | 58 +
.../functions-worker-for-geo-replication.md | 20 +
.../functions-worker-run-separately.md | 228 ++
.../version-5.0.x/functions-worker-stateful.md | 71 +
.../functions-worker-temp-file-path.md | 15 +
.../functions-worker-troubleshooting.md | 42 +
versioned_docs/version-5.0.x/functions-worker.md | 19 +
.../version-5.0.x/get-started-pulsar-admin.md | 219 ++
.../getting-started-docker-compose.md | 141 +
.../version-5.0.x/getting-started-docker.md | 303 ++
.../version-5.0.x/getting-started-helm.md | 407 +++
.../version-5.0.x/getting-started-home.md | 14 +
.../version-5.0.x/getting-started-standalone.md | 151 +
versioned_docs/version-5.0.x/helm-deploy.md | 424 +++
versioned_docs/version-5.0.x/helm-install.md | 12 +
versioned_docs/version-5.0.x/helm-overview.md | 12 +
versioned_docs/version-5.0.x/helm-prepare.md | 28 +
versioned_docs/version-5.0.x/helm-tools.md | 12 +
versioned_docs/version-5.0.x/helm-upgrade.md | 37 +
versioned_docs/version-5.0.x/how-to-landing.md | 13 +
.../install-deploy-upgrade-landing.md | 24 +
versioned_docs/version-5.0.x/io-aerospike-sink.md | 31 +
versioned_docs/version-5.0.x/io-aerospike.md | 5 +
versioned_docs/version-5.0.x/io-alluxio.md | 68 +
.../version-5.0.x/io-azuredataexplorer-sink.md | 77 +
versioned_docs/version-5.0.x/io-canal-source.md | 208 ++
versioned_docs/version-5.0.x/io-cassandra-sink.md | 66 +
versioned_docs/version-5.0.x/io-cassandra.md | 5 +
versioned_docs/version-5.0.x/io-cdc-canal.md | 5 +
versioned_docs/version-5.0.x/io-cdc-debezium.md | 516 ++++
versioned_docs/version-5.0.x/io-cdc.md | 26 +
versioned_docs/version-5.0.x/io-cli.md | 586 ++++
versioned_docs/version-5.0.x/io-connectors.md | 265 ++
versioned_docs/version-5.0.x/io-debezium-source.md | 746 +++++
versioned_docs/version-5.0.x/io-debug.md | 392 +++
versioned_docs/version-5.0.x/io-develop.md | 395 +++
versioned_docs/version-5.0.x/io-dynamodb-source.md | 83 +
versioned_docs/version-5.0.x/io-dynamodb.md | 5 +
.../version-5.0.x/io-elasticsearch-sink.md | 238 ++
versioned_docs/version-5.0.x/io-elasticsearch.md | 5 +
versioned_docs/version-5.0.x/io-file-source.md | 154 +
versioned_docs/version-5.0.x/io-file.md | 5 +
versioned_docs/version-5.0.x/io-hbase-sink.md | 68 +
versioned_docs/version-5.0.x/io-hbase.md | 5 +
versioned_docs/version-5.0.x/io-hdfs.md | 5 +
versioned_docs/version-5.0.x/io-hdfs2-sink.md | 66 +
versioned_docs/version-5.0.x/io-hdfs3-sink.md | 61 +
versioned_docs/version-5.0.x/io-http-sink.md | 62 +
versioned_docs/version-5.0.x/io-influxdb-sink.md | 118 +
versioned_docs/version-5.0.x/io-influxdb.md | 5 +
versioned_docs/version-5.0.x/io-jdbc-sink.md | 187 ++
versioned_docs/version-5.0.x/io-jdbc.md | 5 +
versioned_docs/version-5.0.x/io-kafka-sink.md | 82 +
versioned_docs/version-5.0.x/io-kafka-source.md | 222 ++
versioned_docs/version-5.0.x/io-kafka.md | 5 +
versioned_docs/version-5.0.x/io-kinesis-sink.md | 83 +
versioned_docs/version-5.0.x/io-kinesis-source.md | 87 +
versioned_docs/version-5.0.x/io-kinesis.md | 5 +
versioned_docs/version-5.0.x/io-mongo-sink.md | 58 +
versioned_docs/version-5.0.x/io-mongo-source.md | 61 +
versioned_docs/version-5.0.x/io-mongo.md | 5 +
versioned_docs/version-5.0.x/io-netty-source.md | 204 ++
versioned_docs/version-5.0.x/io-netty.md | 5 +
versioned_docs/version-5.0.x/io-nsq-source.md | 26 +
versioned_docs/version-5.0.x/io-nsq.md | 5 +
versioned_docs/version-5.0.x/io-overview.md | 163 ++
versioned_docs/version-5.0.x/io-quickstart.md | 913 ++++++
versioned_docs/version-5.0.x/io-rabbitmq-sink.md | 84 +
versioned_docs/version-5.0.x/io-rabbitmq-source.md | 188 ++
versioned_docs/version-5.0.x/io-rabbitmq.md | 5 +
versioned_docs/version-5.0.x/io-redis-sink.md | 142 +
versioned_docs/version-5.0.x/io-redis.md | 5 +
versioned_docs/version-5.0.x/io-solr-sink.md | 64 +
versioned_docs/version-5.0.x/io-solr.md | 5 +
versioned_docs/version-5.0.x/io-tcp.md | 5 +
versioned_docs/version-5.0.x/io-use.md | 1673 +++++++++++
versioned_docs/version-5.0.x/kubernetes-helm.md | 369 +++
.../version-5.0.x/performance-pulsar-perf.md | 247 ++
.../version-5.0.x/pulsar-api-overview.md | 50 +
.../version-5.0.x/reference-cli-tools.md | 30 +
.../version-5.0.x/reference-configuration.md | 7 +
.../version-5.0.x/reference-connector-admin.md | 12 +
versioned_docs/version-5.0.x/reference-landing.md | 15 +
.../reference-metrics-opentelemetry.md | 1389 +++++++++
versioned_docs/version-5.0.x/reference-metrics.md | 851 ++++++
.../version-5.0.x/reference-pulsar-admin.md | 3021 ++++++++++++++++++++
.../version-5.0.x/reference-rest-api-overview.md | 21 +
.../version-5.0.x/reference-terminology.md | 95 +
.../schema-evolution-compatibility.md | 12 +
versioned_docs/version-5.0.x/schema-get-started.md | 957 +++++++
versioned_docs/version-5.0.x/schema-manage.md | 12 +
versioned_docs/version-5.0.x/schema-overview.md | 148 +
versioned_docs/version-5.0.x/schema-understand.md | 377 +++
versioned_docs/version-5.0.x/security-athenz.md | 312 ++
.../version-5.0.x/security-authorization.md | 118 +
.../version-5.0.x/security-basic-auth.md | 154 +
.../version-5.0.x/security-bouncy-castle.md | 143 +
.../version-5.0.x/security-encryption.md | 389 +++
versioned_docs/version-5.0.x/security-extending.md | 91 +
versioned_docs/version-5.0.x/security-jwt.md | 244 ++
versioned_docs/version-5.0.x/security-kerberos.md | 319 +++
versioned_docs/version-5.0.x/security-oauth2.md | 273 ++
.../version-5.0.x/security-openid-connect.md | 147 +
versioned_docs/version-5.0.x/security-overview.md | 82 +
.../version-5.0.x/security-tls-authentication.md | 296 ++
.../version-5.0.x/security-tls-transport.md | 683 +++++
.../version-5.0.x/security-token-admin.md | 162 ++
versioned_docs/version-5.0.x/standalone-docker.md | 203 ++
versioned_docs/version-5.0.x/standalone.md | 12 +
.../version-5.0.x/tiered-storage-aliyun.md | 205 ++
versioned_docs/version-5.0.x/tiered-storage-aws.md | 249 ++
.../version-5.0.x/tiered-storage-azure.md | 192 ++
.../version-5.0.x/tiered-storage-filesystem.md | 575 ++++
versioned_docs/version-5.0.x/tiered-storage-gcs.md | 243 ++
.../version-5.0.x/tiered-storage-overview.md | 88 +
versioned_docs/version-5.0.x/tiered-storage-s3.md | 201 ++
versioned_docs/version-5.0.x/transaction-api.md | 149 +
.../version-5.0.x/transaction-guarantee.md | 16 +
.../version-5.0.x/tutorials-namespace.md | 39 +
.../version-5.0.x/tutorials-produce-consume.md | 79 +
versioned_docs/version-5.0.x/tutorials-tenant.md | 56 +
versioned_docs/version-5.0.x/tutorials-topic.md | 43 +
.../version-5.0.x/txn-advanced-features.md | 46 +
versioned_docs/version-5.0.x/txn-how.md | 143 +
versioned_docs/version-5.0.x/txn-monitor.md | 10 +
versioned_docs/version-5.0.x/txn-use.md | 306 ++
versioned_docs/version-5.0.x/txn-what.md | 60 +
versioned_docs/version-5.0.x/txn-why.md | 45 +
.../version-5.0.x/window-functions-context.md | 530 ++++
versioned_sidebars/version-5.0.x-sidebars.json | 438 +++
versions.json | 1 +
256 files changed, 50801 insertions(+)
diff --git a/versioned_docs/version-5.0.x/about.md b/versioned_docs/version-5.0.x/about.md
new file mode 100644
index 00000000000..72ad7aea3aa
--- /dev/null
+++ b/versioned_docs/version-5.0.x/about.md
@@ -0,0 +1,60 @@
+---
+slug: /
+id: about
+title: Welcome to the Apache Pulsar documentation portal
+sidebar_label: "About"
+description: Explore the Apache Pulsar documentation and join the knowledgeable Pulsar community.
+---
+
+import BlockLinks from "@site/src/components/ui/BlockLinks";
+import BlockLink from "@site/src/components/ui/BlockLink";
+import { docUrl } from "@site/src/utils/index";
+
+# Welcome to the Apache Pulsar™ documentation portal
+***
+
+This portal holds a variety of topics, tutorials, guides, and reference material to help you work with Pulsar.
+
+## Choose your path
+Select one of the content blocks below to begin your Pulsar journey. If you ...
+* Are new to Pulsar, start with **About Pulsar** to learn about features and concepts.
+* Want to jump to the quickstart, select **Get Started**.
+* Are an operator responsible for architecting and supporting Apache Pulsar, start with **Install, Deploy, Upgrade**.
+* Are a developer who wants to master Apache Pulsar, select **Pulsar for Developers**.
+* Want to try out Pulsar, select **How To** for access to the "hello world" tutorial.
+* An experienced Pulsar coder looking for API, metrics, or configuration documentation, go to **Reference**.
+
+<BlockLinks>
+ <BlockLink title="About Pulsar" url="concepts-overview" />
+ <BlockLink title="Get Started" url="getting-started-home" />
+ <BlockLink title="Install, Deploy, Upgrade" url="install-deploy-upgrade-landing" />
+ <BlockLink title="Pulsar for Developers" url="developers-landing" />
+ <BlockLink title="How To" url="how-to-landing" />
+ <BlockLink title="Reference" url="reference-landing" />
+</BlockLinks>
+
+## Continuous Improvement
+***
+
+As you probably know, we are working on a new user experience for our documentation portal that will make learning about and building on top of Apache Pulsar a much better experience. Whether you need overview concepts, how-to procedures, curated guides or quick references, we're building content to support it. This welcome page is just the first step. We will be providing updates every month.
+
+## Help Improve These Documents
+***
+
+Participation is not only welcomed – it's essential!
+
+📚 There are multiple ways you can help to make the Pulsar documentation better:
+
+- **Submit a Pull Request**: You'll find the "Edit this page" link at the bottom of each page. Click the link and follow the [Pulsar Documentation Contribution Guide](pathname:///contribute/document-intro).
+
+- **💡 Suggest changes**: If you found a mistake, the documentation is incomplete, but for any reason you're not ready to submit a PR, or you have any other suggestion, please click the appropriate link at the top right of any documentation page.
+- **🛟 Get support**: If something isn't clear for you in the documentation, or you have general questions about Pulsar, you can ask the community by clicking the appropriate link at the top right of any documentation page. This way you will help people searching for the answer to this question in the future after someone from the community answers your question.
+
+## Join the Community!
+***
+
+The Pulsar community on GitHub is active, passionate, and knowledgeable. Join discussions, voice opinions, suggest features, and dive into the code itself. Find your Pulsar family here at [apache/pulsar](https://github.com/apache/pulsar).
+
+* Please go to [the community page](pathname:///community/#section-discussions) to find the contact information for joining various communication channels.
+* The main communication channel for the Apache Pulsar project are [the mailing lists](pathname:///contact/).
+* There's a separate page for Apache Pulsar [Security advisories and Security policy](pathname:///security/).
\ No newline at end of file
diff --git a/versioned_docs/version-5.0.x/adaptors-kafka.md b/versioned_docs/version-5.0.x/adaptors-kafka.md
new file mode 100644
index 00000000000..5d8b9c71c57
--- /dev/null
+++ b/versioned_docs/version-5.0.x/adaptors-kafka.md
@@ -0,0 +1,274 @@
+---
+id: adaptors-kafka
+title: Pulsar adaptor for Apache Kafka
+sidebar_label: "Kafka client wrapper"
+description: Learn to use the Pulsar Kafka compatibility wrapper and configure Pulsar authentication provider.
+---
+
+
+Pulsar provides an easy option for applications that are currently written using the [Apache Kafka](http://kafka.apache.org) Java client API.
+
+:::note
+
+The Pulsar Kafka wrapper artifacts (`pulsar-client-kafka` and `pulsar-client-kafka-original`) live in the separate [apache/pulsar-adapters](https://github.com/apache/pulsar-adapters) repository, and the last released version on Maven Central is [`@pulsar:version:adapters@`](https://repo1.maven.org/maven2/org/apache/pulsar/pulsar-client-kafka/). Even when you run a newer Pulsar broker (3.x / 4.x), keep the dependency pinned to `@pulsar:version:adapters@` -- newer matching artifacts are no [...]
+
+:::
+
+## Use the Pulsar Kafka compatibility wrapper
+
+To use the Pulsar Kafka compatibility wrapper, complete the following steps.
+
+**Step 1:** In an existing application, change the regular Kafka client dependency and replace it with the Pulsar Kafka wrapper. Remove the following dependency in `pom.xml`:
+
+```xml
+<dependency>
+ <groupId>org.apache.kafka</groupId>
+ <artifactId>kafka-clients</artifactId>
+ <version>0.10.2.1</version>
+</dependency>
+```
+
+**Step 2:** Then include this dependency for the Pulsar Kafka wrapper:
+
+```xml
+<dependency>
+ <groupId>org.apache.pulsar</groupId>
+ <artifactId>pulsar-client-kafka</artifactId>
+ <version>@pulsar:version:adapters@</version>
+</dependency>
+```
+
+With the new dependency, the existing code works without any changes. You need to adjust the configuration, and make sure it points the
+producers and consumers to Pulsar service rather than Kafka, and uses a particular
+Pulsar topic.
+
+## Use the Pulsar Kafka compatibility wrapper together with existing Kafka client
+
+When migrating from Kafka to Pulsar, the application might use the original Kafka client
+and the Pulsar Kafka wrapper together during migration. You should consider using the
+unshaded Pulsar Kafka client wrapper.
+
+```xml
+<dependency>
+ <groupId>org.apache.pulsar</groupId>
+ <artifactId>pulsar-client-kafka-original</artifactId>
+ <version>@pulsar:version:adapters@</version>
+</dependency>
+```
+
+When using this dependency, construct producers using `org.apache.kafka.clients.producer.PulsarKafkaProducer`
+instead of `org.apache.kafka.clients.producer.KafkaProducer` and `org.apache.kafka.clients.producer.PulsarKafkaConsumer` for consumers.
+
+## Producer example
+
+```java
+// Topic needs to be a regular Pulsar topic
+String topic = "persistent://public/default/my-topic";
+
+Properties props = new Properties();
+// Point to a Pulsar service
+props.put("bootstrap.servers", "pulsar://localhost:6650");
+
+props.put("key.serializer", IntegerSerializer.class.getName());
+props.put("value.serializer", StringSerializer.class.getName());
+
+Producer<Integer, String> producer = new KafkaProducer(props);
+
+for (int i = 0; i < 10; i++) {
+ producer.send(new ProducerRecord<Integer, String>(topic, i, "hello-" + i));
+ log.info("Message {} sent successfully", i);
+}
+
+producer.close();
+```
+
+## Consumer example
+
+```java
+String topic = "persistent://public/default/my-topic";
+
+Properties props = new Properties();
+// Point to a Pulsar service
+props.put("bootstrap.servers", "pulsar://localhost:6650");
+props.put("group.id", "my-subscription-name");
+props.put("enable.auto.commit", "false");
+props.put("key.deserializer", IntegerDeserializer.class.getName());
+props.put("value.deserializer", StringDeserializer.class.getName());
+
+Consumer<Integer, String> consumer = new KafkaConsumer(props);
+consumer.subscribe(Arrays.asList(topic));
+
+while (true) {
+ ConsumerRecords<Integer, String> records = consumer.poll(100);
+ records.forEach(record -> {
+ log.info("Received record: {}", record);
+ });
+
+ // Commit last offset
+ consumer.commitSync();
+}
+```
+
+## Complete Examples
+
+You can find the complete producer and consumer examples [here](https://github.com/apache/pulsar-adapters/tree/master/pulsar-client-kafka-compat/pulsar-client-kafka-tests/src/test/java/org/apache/pulsar/client/kafka/compat/examples).
+
+## Compatibility matrix
+
+Currently, the Pulsar Kafka wrapper supports most of the operations offered by the Kafka API.
+
+### Producer
+
+APIs:
+
+| Producer Method | Supported | Notes |
+|:------------------------------------------------------------------------------|:----------|:-------------------------------------------------------------------------|
+| `Future<RecordMetadata> send(ProducerRecord<K, V> record)` | Yes | |
+| `Future<RecordMetadata> send(ProducerRecord<K, V> record, Callback callback)` | Yes | |
+| `void flush()` | Yes | |
+| `List<PartitionInfo> partitionsFor(String topic)` | No | |
+| `Map<MetricName, ? extends Metric> metrics()` | No | |
+| `void close()` | Yes | |
+| `void close(long timeout, TimeUnit unit)` | Yes | |
+
+Properties:
+
+| Config property | Supported | Notes |
+|:----------------------------------------|:----------|:------------------------------------------------------------------------------|
+| `acks` | Ignored | Durability and quorum writes are configured at the namespace level |
+| `auto.offset.reset` | Yes | It uses a default value of `earliest` if you do not give a specific setting. |
+| `batch.size` | Ignored | |
+| `bootstrap.servers` | Yes | |
+| `buffer.memory` | Ignored | |
+| `client.id` | Ignored | |
+| `compression.type` | Yes | Allows `gzip` and `lz4`. No `snappy`. |
+| `connections.max.idle.ms` | Yes | Only support up to 2,147,483,647,000(Integer.MAX_VALUE * 1000) ms of idle time|
+| `interceptor.classes` | Yes | |
+| `key.serializer` | Yes | |
+| `linger.ms` | Yes | Controls the group commit time when batching messages |
+| `max.block.ms` | Ignored | |
+| `max.in.flight.requests.per.connection` | Ignored | In Pulsar ordering is maintained even with multiple requests in flight |
+| `max.request.size` | Ignored | |
+| `metric.reporters` | Ignored | |
+| `metrics.num.samples` | Ignored | |
+| `metrics.sample.window.ms` | Ignored | |
+| `partitioner.class` | Yes | |
+| `receive.buffer.bytes` | Ignored | |
+| `reconnect.backoff.ms` | Ignored | |
+| `request.timeout.ms` | Ignored | |
+| `retries` | Ignored | Pulsar client retries with exponential backoff until the send timeout expires. |
+| `send.buffer.bytes` | Ignored | |
+| `timeout.ms` | Yes | |
+| `value.serializer` | Yes | |
+
+
+### Consumer
+
+The following table lists consumer APIs.
+
+| Consumer Method | Supported | Notes |
+|:--------------------------------------------------------------------------------------------------------|:----------|:------|
+| `Set<TopicPartition> assignment()` | No | |
+| `Set<String> subscription()` | Yes | |
+| `void subscribe(Collection<String> topics)` | Yes | |
+| `void subscribe(Collection<String> topics, ConsumerRebalanceListener callback)` | No | |
+| `void assign(Collection<TopicPartition> partitions)` | No | |
+| `void subscribe(Pattern pattern, ConsumerRebalanceListener callback)` | No | |
+| `void unsubscribe()` | Yes | |
+| `ConsumerRecords<K, V> poll(long timeoutMillis)` | Yes | |
+| `void commitSync()` | Yes | |
+| `void commitSync(Map<TopicPartition, OffsetAndMetadata> offsets)` | Yes | |
+| `void commitAsync()` | Yes | |
+| `void commitAsync(OffsetCommitCallback callback)` | Yes | |
+| `void commitAsync(Map<TopicPartition, OffsetAndMetadata> offsets, OffsetCommitCallback callback)` | Yes | |
+| `void seek(TopicPartition partition, long offset)` | Yes | |
+| `void seekToBeginning(Collection<TopicPartition> partitions)` | Yes | |
+| `void seekToEnd(Collection<TopicPartition> partitions)` | Yes | |
+| `long position(TopicPartition partition)` | Yes | |
+| `OffsetAndMetadata committed(TopicPartition partition)` | Yes | |
+| `Map<MetricName, ? extends Metric> metrics()` | No | |
+| `List<PartitionInfo> partitionsFor(String topic)` | No | |
+| `Map<String, List<PartitionInfo>> listTopics()` | No | |
+| `Set<TopicPartition> paused()` | No | |
+| `void pause(Collection<TopicPartition> partitions)` | No | |
+| `void resume(Collection<TopicPartition> partitions)` | No | |
+| `Map<TopicPartition, OffsetAndTimestamp> offsetsForTimes(Map<TopicPartition, Long> timestampsToSearch)` | No | |
+| `Map<TopicPartition, Long> beginningOffsets(Collection<TopicPartition> partitions)` | No | |
+| `Map<TopicPartition, Long> endOffsets(Collection<TopicPartition> partitions)` | No | |
+| `void close()` | Yes | |
+| `void close(long timeout, TimeUnit unit)` | Yes | |
+| `void wakeup()` | No | |
+
+Properties:
+
+| Config property | Supported | Notes |
+|:--------------------------------|:----------|:------------------------------------------------------|
+| `group.id` | Yes | Maps to a Pulsar subscription name |
+| `max.poll.records` | Yes | |
+| `max.poll.interval.ms` | Ignored | Messages are "pushed" from broker |
+| `session.timeout.ms` | Ignored | |
+| `heartbeat.interval.ms` | Ignored | |
+| `bootstrap.servers` | Yes | Needs to point to a single Pulsar service URL |
+| `enable.auto.commit` | Yes | |
+| `auto.commit.interval.ms` | Ignored | With auto-commit, acks are sent immediately to broker |
+| `partition.assignment.strategy` | Ignored | |
+| `auto.offset.reset` | Yes | Only support earliest and latest. |
+| `fetch.min.bytes` | Ignored | |
+| `fetch.max.bytes` | Ignored | |
+| `fetch.max.wait.ms` | Ignored | |
+| `interceptor.classes` | Yes | |
+| `metadata.max.age.ms` | Ignored | |
+| `max.partition.fetch.bytes` | Ignored | |
+| `send.buffer.bytes` | Ignored | |
+| `receive.buffer.bytes` | Ignored | |
+| `client.id` | Ignored | |
+
+
+## Customize Pulsar configurations
+
+You can configure Pulsar authentication provider directly from the Kafka properties.
+
+### Pulsar client properties
+
+| Config property | Default | Notes |
+|:---------------------------------------|:--------|:---------------------------------------------------------------------------------------|
+| [`pulsar.authentication.class`](@pulsar:javadoc:client@/org/apache/pulsar/client/api/ClientConfiguration.html#setAuthentication-org.apache.pulsar.client.api.Authentication-) | | Configure to auth provider. For example, `org.apache.pulsar.client.impl.auth.AuthenticationTls`.|
+| [`pulsar.authentication.params.map`](@pulsar:javadoc:client@/org/apache/pulsar/client/api/ClientConfiguration.html#setAuthentication-java.lang.String-java.util.Map-) | | Map which represents parameters for the Authentication-Plugin. |
+| [`pulsar.authentication.params.string`](@pulsar:javadoc:client@/org/apache/pulsar/client/api/ClientConfiguration.html#setAuthentication-java.lang.String-java.lang.String-) | | String which represents parameters for the Authentication-Plugin, for example, `key1:val1,key2:val2`. |
+| [`pulsar.use.tls`](@pulsar:javadoc:client@/org/apache/pulsar/client/api/ClientConfiguration.html#setUseTls-boolean-) | `false` | Enable TLS transport encryption. |
+| [`pulsar.tls.trust.certs.file.path`](@pulsar:javadoc:client@/org/apache/pulsar/client/api/ClientConfiguration.html#setTlsTrustCertsFilePath-java.lang.String-) | | Path for the TLS trust certificate store. |
+| [`pulsar.tls.allow.insecure.connection`](@pulsar:javadoc:client@/org/apache/pulsar/client/api/ClientConfiguration.html#setTlsAllowInsecureConnection-boolean-) | `false` | Accept self-signed certificates from brokers. |
+| [`pulsar.operation.timeout.ms`](@pulsar:javadoc:client@/org/apache/pulsar/client/api/ClientConfiguration.html#setOperationTimeout-int-java.util.concurrent.TimeUnit-) | `30000` | General operations timeout. |
+| [`pulsar.stats.interval.seconds`](@pulsar:javadoc:client@/org/apache/pulsar/client/api/ClientConfiguration.html#setStatsInterval-long-java.util.concurrent.TimeUnit-) | `60` | Pulsar client lib stats printing interval. |
+| [`pulsar.num.io.threads`](@pulsar:javadoc:client@/org/apache/pulsar/client/api/ClientConfiguration.html#setIoThreads-int-) | `1` | The number of Netty IO threads to use. |
+| [`pulsar.connections.per.broker`](@pulsar:javadoc:client@/org/apache/pulsar/client/api/ClientConfiguration.html#setConnectionsPerBroker-int-) | `1` | The maximum number of connection to each broker. |
+| [`pulsar.use.tcp.nodelay`](@pulsar:javadoc:client@/org/apache/pulsar/client/api/ClientConfiguration.html#setUseTcpNoDelay-boolean-) | `true` | TCP no-delay. |
+| [`pulsar.concurrent.lookup.requests`](@pulsar:javadoc:client@/org/apache/pulsar/client/api/ClientConfiguration.html#setConcurrentLookupRequest-int-) | `50000` | The maximum number of concurrent topic lookups. |
+| [`pulsar.max.number.rejected.request.per.connection`](@pulsar:javadoc:client@/org/apache/pulsar/client/api/ClientConfiguration.html#setMaxNumberOfRejectedRequestPerConnection-int-) | `50` | The threshold of errors to forcefully close a connection. |
+| [`pulsar.keepalive.interval.ms`](@pulsar:javadoc:client@/org/apache/pulsar/client/api/ClientBuilder.html#keepAliveInterval-int-java.util.concurrent.TimeUnit-)| `30000` | Keep alive interval for each client-broker-connection. |
+
+
+### Pulsar producer properties
+
+| Config property | Default | Notes |
+|:---------------------------------------|:--------|:---------------------------------------------------------------------------------------|
+| [`pulsar.producer.name`](@pulsar:javadoc:client@/org/apache/pulsar/client/api/ProducerConfiguration.html#setProducerName-java.lang.String-) | | Specify the producer name. |
+| [`pulsar.producer.initial.sequence.id`](@pulsar:javadoc:client@/org/apache/pulsar/client/api/ProducerConfiguration.html#setInitialSequenceId-long-) | | Specify baseline for sequence ID of this producer. |
+| [`pulsar.producer.max.pending.messages`](@pulsar:javadoc:client@/org/apache/pulsar/client/api/ProducerConfiguration.html#setMaxPendingMessages-int-) | `1000` | Set the maximum size of the message queue pending to receive an acknowledgment from the broker. |
+| [`pulsar.producer.max.pending.messages.across.partitions`](@pulsar:javadoc:client@/org/apache/pulsar/client/api/ProducerConfiguration.html#setMaxPendingMessagesAcrossPartitions-int-) | `50000` | Set the maximum number of pending messages across all the partitions. |
+| [`pulsar.producer.batching.enabled`](@pulsar:javadoc:client@/org/apache/pulsar/client/api/ProducerConfiguration.html#setBatchingEnabled-boolean-) | `true` | Control whether automatic batching of messages is enabled for the producer. |
+| [`pulsar.producer.batching.max.messages`](@pulsar:javadoc:client@/org/apache/pulsar/client/api/ProducerConfiguration.html#setBatchingMaxMessages-int-) | `1000` | The maximum number of messages in a batch. |
+| [`pulsar.block.if.producer.queue.full`](@pulsar:javadoc:client@/org/apache/pulsar/client/api/ProducerConfiguration.html#setBlockIfQueueFull-boolean-) | | Specify the block producer if queue is full. |
+| [`pulsar.crypto.reader.factory.class.name`](@pulsar:javadoc:client@/org/apache/pulsar/client/api/ProducerConfiguration.html#setCryptoKeyReader-org.apache.pulsar.client.api.CryptoKeyReader-) | | Specify the CryptoReader-Factory(`CryptoKeyReaderFactory`) classname which allows producer to create CryptoKeyReader. |
+
+
+### Pulsar consumer Properties
+
+| Config property | Default | Notes |
+|:---------------------------------------|:--------|:---------------------------------------------------------------------------------------|
+| [`pulsar.consumer.name`](@pulsar:javadoc:client@/org/apache/pulsar/client/api/ConsumerConfiguration.html#setConsumerName-java.lang.String-) | | Specify the consumer name. |
+| [`pulsar.consumer.receiver.queue.size`](@pulsar:javadoc:client@/org/apache/pulsar/client/api/ConsumerConfiguration.html#setReceiverQueueSize-int-) | 1000 | Set the size of the consumer receiver queue. |
+| [`pulsar.consumer.acknowledgments.group.time.millis`](@pulsar:javadoc:client@/org/apache/pulsar/client/api/ConsumerBuilder.html#acknowledgmentGroupTime-long-java.util.concurrent.TimeUnit-) | 100 | Set the maximum amount of group time for consumers to send the acknowledgments to the broker. |
+| [`pulsar.consumer.total.receiver.queue.size.across.partitions`](@pulsar:javadoc:client@/org/apache/pulsar/client/api/ConsumerConfiguration.html#setMaxTotalReceiverQueueSizeAcrossPartitions-int-) | 50000 | Set the maximum size of the total receiver queue across partitions. |
+| [`pulsar.consumer.subscription.topics.mode`](@pulsar:javadoc:client@/org/apache/pulsar/client/api/ConsumerBuilder.html#subscriptionTopicsMode-Mode-) | PersistentOnly | Set the subscription topic mode for consumers. |
+| [`pulsar.crypto.reader.factory.class.name`](@pulsar:javadoc:client@/org/apache/pulsar/client/api/ProducerConfiguration.html#setCryptoKeyReader-org.apache.pulsar.client.api.CryptoKeyReader-) | | Specify the CryptoReader-Factory(`CryptoKeyReaderFactory`) classname which allows consumer to create CryptoKeyReader. |
diff --git a/versioned_docs/version-5.0.x/adaptors-spark.md b/versioned_docs/version-5.0.x/adaptors-spark.md
new file mode 100644
index 00000000000..1346a381be0
--- /dev/null
+++ b/versioned_docs/version-5.0.x/adaptors-spark.md
@@ -0,0 +1,83 @@
+---
+id: adaptors-spark
+title: Pulsar adaptor for Apache Spark
+sidebar_label: "Apache Spark"
+description: Get a comprehensive understanding of concepts, configuration methods, and usage of Pulsar adaptor for Apache Spark.
+---
+
+## Spark Streaming receiver
+The Spark Streaming receiver for Pulsar is a custom receiver that enables Apache [Spark Streaming](https://spark.apache.org/streaming/) to receive raw data from Pulsar.
+
+An application can receive data in [Resilient Distributed Dataset](https://spark.apache.org/docs/latest/programming-guide.html#resilient-distributed-datasets-rdds) (RDD) format via the Spark Streaming receiver and can process it in a variety of ways.
+
+### Prerequisites
+
+To use the receiver, include a dependency for the `pulsar-spark` library in your Java configuration.
+
+#### Maven
+
+If you're using Maven, add this to your `pom.xml`:
+
+```xml
+<!-- in your <properties> block -->
+<pulsar.version>@pulsar:version@</pulsar.version>
+
+<!-- in your <dependencies> block -->
+<dependency>
+ <groupId>org.apache.pulsar</groupId>
+ <artifactId>pulsar-spark</artifactId>
+ <version>${pulsar.version}</version>
+</dependency>
+```
+
+#### Gradle
+
+If you're using Gradle, add this to your `build.gradle` file:
+
+```groovy
+def pulsarVersion = "@pulsar:version@"
+
+dependencies {
+ compile group: 'org.apache.pulsar', name: 'pulsar-spark', version: pulsarVersion
+}
+```
+
+### Usage
+
+Pass an instance of `SparkStreamingPulsarReceiver` to the `receiverStream` method in `JavaStreamingContext`:
+
+```java
+ String serviceUrl = "pulsar://localhost:6650/";
+ String topic = "persistent://public/default/test_src";
+ String subs = "test_sub";
+
+ SparkConf sparkConf = new SparkConf().setMaster("local[*]").setAppName("Pulsar Spark Example");
+
+ JavaStreamingContext jsc = new JavaStreamingContext(sparkConf, Durations.seconds(60));
+
+ ConsumerConfigurationData<byte[]> pulsarConf = new ConsumerConfigurationData();
+
+ Set<String> set = new HashSet();
+ set.add(topic);
+ pulsarConf.setTopicNames(set);
+ pulsarConf.setSubscriptionName(subs);
+
+ SparkStreamingPulsarReceiver pulsarReceiver = new SparkStreamingPulsarReceiver(
+ serviceUrl,
+ pulsarConf,
+ new AuthenticationDisabled());
+
+ JavaReceiverInputDStream<byte[]> lineDStream = jsc.receiverStream(pulsarReceiver);
+```
+
+For a complete example, click [here](https://github.com/apache/pulsar-adapters/blob/master/examples/spark/src/main/java/org/apache/spark/streaming/receiver/example/SparkStreamingPulsarReceiverExample.java). In this example, the number of messages that contain the string "Pulsar" in received messages is counted.
+
+Note that if needed, other Pulsar authentication classes can be used. For example, to use a token during authentication the following parameters for the `SparkStreamingPulsarReceiver` constructor can be set:
+
+```java
+SparkStreamingPulsarReceiver pulsarReceiver = new SparkStreamingPulsarReceiver(
+ serviceUrl,
+ pulsarConf,
+ new AuthenticationToken("token:<secret-JWT-token>"));
+```
+
diff --git a/versioned_docs/version-5.0.x/adaptors-storm.md b/versioned_docs/version-5.0.x/adaptors-storm.md
new file mode 100644
index 00000000000..0bbe4b17eca
--- /dev/null
+++ b/versioned_docs/version-5.0.x/adaptors-storm.md
@@ -0,0 +1,90 @@
+---
+id: adaptors-storm
+title: Pulsar adaptor for Apache Storm
+sidebar_label: "Apache Storm"
+description: Get a comprehensive understanding of Pulsar adaptor for Apache Storm.
+---
+
+Pulsar Storm is an adaptor for integrating with [Apache Storm](http://storm.apache.org/) topologies. It provides core Storm implementations for sending and receiving data.
+
+An application can inject data into a Storm topology via a generic Pulsar spout, as well as consume data from a Storm topology via a generic Pulsar bolt.
+
+## Using the Pulsar Storm Adaptor
+
+To use the Pulsar Storm Adaptor, you need to include dependency for Pulsar Storm Adaptor:
+
+```xml
+<dependency>
+ <groupId>org.apache.pulsar</groupId>
+ <artifactId>pulsar-storm</artifactId>
+ <version>${pulsar.version}</version>
+</dependency>
+```
+
+## Pulsar Spout
+
+The Pulsar Spout allows for the data published on a topic to be consumed by a Storm topology. It emits a Storm tuple based on the message received and the `MessageToValuesMapper` provided by the client.
+
+The tuples that fail to be processed by the downstream bolts will be re-injected by the spout with an exponential backoff, within a configurable timeout (the default is 60 seconds) or a configurable number of retries, whichever comes first, after which it is acknowledged by the consumer. Here's an example construction of a spout:
+
+```java
+MessageToValuesMapper messageToValuesMapper = new MessageToValuesMapper() {
+
+ @Override
+ public Values toValues(Message msg) {
+ return new Values(new String(msg.getData()));
+ }
+
+ @Override
+ public void declareOutputFields(OutputFieldsDeclarer declarer) {
+ // declare the output fields
+ declarer.declare(new Fields("string"));
+ }
+};
+
+// Configure a Pulsar Spout
+PulsarSpoutConfiguration spoutConf = new PulsarSpoutConfiguration();
+spoutConf.setServiceUrl("pulsar://broker.messaging.usw.example.com:6650");
+spoutConf.setTopic("persistent://my-property/usw/my-ns/my-topic1");
+spoutConf.setSubscriptionName("my-subscriber-name1");
+spoutConf.setMessageToValuesMapper(messageToValuesMapper);
+
+// Create a Pulsar Spout
+PulsarSpout spout = new PulsarSpout(spoutConf);
+```
+
+For a complete example, click [here](https://github.com/apache/pulsar-adapters/blob/master/pulsar-storm/src/test/java/org/apache/pulsar/storm/PulsarSpoutTest.java).
+
+## Pulsar Bolt
+
+The Pulsar bolt allows data in a Storm topology to be published on a topic. It publishes messages based on the Storm tuple received and the `TupleToMessageMapper` provided by the client.
+
+A partitioned topic can also be used to publish messages on different topics. In the implementation of the `TupleToMessageMapper`, a "key" will need to be provided in the message which will send the messages with the same key to the same topic. Here's an example bolt:
+
+```java
+TupleToMessageMapper tupleToMessageMapper = new TupleToMessageMapper() {
+
+ @Override
+ public TypedMessageBuilder<byte[]> toMessage(TypedMessageBuilder<byte[]> msgBuilder, Tuple tuple) {
+ String receivedMessage = tuple.getString(0);
+ // message processing
+ String processedMsg = receivedMessage + "-processed";
+ return msgBuilder.value(processedMsg.getBytes());
+ }
+
+ @Override
+ public void declareOutputFields(OutputFieldsDeclarer declarer) {
+ // declare the output fields
+ }
+};
+
+// Configure a Pulsar Bolt
+PulsarBoltConfiguration boltConf = new PulsarBoltConfiguration();
+boltConf.setServiceUrl("pulsar://broker.messaging.usw.example.com:6650");
+boltConf.setTopic("persistent://my-property/usw/my-ns/my-topic2");
+boltConf.setTupleToMessageMapper(tupleToMessageMapper);
+
+// Create a Pulsar Bolt
+PulsarBolt bolt = new PulsarBolt(boltConf);
+```
+
diff --git a/versioned_docs/version-5.0.x/admin-api-brokers.md b/versioned_docs/version-5.0.x/admin-api-brokers.md
new file mode 100644
index 00000000000..b0ff391196c
--- /dev/null
+++ b/versioned_docs/version-5.0.x/admin-api-brokers.md
@@ -0,0 +1,267 @@
+---
+id: admin-api-brokers
+title: Managing Brokers
+sidebar_label: "Brokers"
+description: Learn how to manage brokers using Pulsar CLI and admin APIs.
+---
+
+````mdx-code-block
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+````
+
+:::tip
+
+This page only shows **some frequently used operations**. For the latest and complete information, see the **reference docs** below.
+
+:::
+
+Category|Method|If you want to manage brokers...
+|---|---|---
+[Pulsar CLI](reference-cli-tools.md) |[pulsar-admin](/reference/#/@pulsar:version_reference@/pulsar-admin/), which lists all commands, flags, descriptions, and more.| See the `broker` command
+[Pulsar admin APIs](admin-api-overview.md)| {@inject: rest:REST API:/}, which lists all parameters, responses, samples, and more.|See the `/admin/v2/brokers` endpoint
+[Pulsar admin APIs](admin-api-overview.md)|[Java admin API](@pulsar:javadoc:admin@/), which lists all classes, methods, descriptions, and more.|See the `brokers` method of the `PulsarAdmin` object
+
+## List active broker
+
+Fetch all available active brokers that are serving traffic with cluster name.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin brokers list use
+```
+
+Example output:
+
+```
+localhost:8080
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getActiveBrokers_1)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.brokers().getActiveBrokers(clusterName)
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+## List namespace owned by broker
+
+You can list all namespaces which are owned and served by a given broker.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin brokers namespaces use \
+ --url localhost:8080
+```
+
+Example output:
+
+```
+public/default/0x00000000_0x40000000 [broker_assignment=shared is_controlled=false is_active=true]
+public/default/0xc0000000_0xffffffff [broker_assignment=shared is_controlled=false is_active=true]
+public/functions/0x40000000_0x80000000 [broker_assignment=shared is_controlled=false is_active=true]
+public/functions/0x00000000_0x40000000 [broker_assignment=shared is_controlled=false is_active=true]
+pulsar/standalone/localhost:8080/0x00000000_0xffffffff [broker_assignment=shared is_controlled=false is_active=true]
+pulsar/localhost:8080/0x00000000_0xffffffff [broker_assignment=shared is_controlled=false is_active=true]
+public/functions/0x80000000_0xc0000000 [broker_assignment=shared is_controlled=false is_active=true]
+public/default/0x80000000_0xc0000000 [broker_assignment=shared is_controlled=false is_active=true]
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getOwnedNamespaces)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.brokers().getOwnedNamespaces(cluster,brokerUrl);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+## Update broker conf
+
+You can update broker configurations using one of the following ways:
+
+- Supply [configurations](/reference/#/@pulsar:version_reference@/config/reference-configuration-broker) when starting up brokers.
+
+- [Update configurations dynamically](#update-broker-conf-dynamically) **when running brokers**.
+
+ Since all broker configurations in Pulsar are stored in ZooKeeper, configuration values can also be dynamically updated when brokers are running. When you update broker configurations dynamically, ZooKeeper will notify the broker of the change and then the broker will override any existing configuration values.
+
+### List updatable broker conf
+
+Fetch a list of all potentially updatable configuration parameters.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin brokers list-dynamic-config
+```
+
+Example output:
+
+```
+forceDeleteNamespaceAllowed
+loadBalancerMemoryResourceWeight
+allowAutoTopicCreation
+brokerDeleteInactivePartitionedTopicMetadataEnabled
+managedLedgerInactiveLedgerRolloverTimeSeconds
+loadBalancerNamespaceBundleMaxMsgRate
+resourceUsageTransportPublishIntervalInSecs
+# omit...
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getDynamicConfigurationName)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.brokers().getDynamicConfigurationNames();
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Update broker conf dynamically
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+The [`update-dynamic-config`](/reference/#/@pulsar:version_reference@/pulsar-admin/brokers?id=update-dynamic-config) subcommand will update existing configuration. It takes two arguments: the name of the parameter and the new value using the `config` and `value` flag respectively. Here's an example of the [`brokerShutdownTimeoutMs`](reference-configuration.md#broker-brokerShutdownTimeoutMs) parameter:
+
+```shell
+pulsar-admin brokers update-dynamic-config --config brokerShutdownTimeoutMs --value 100
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/updateDynamicConfiguration)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.brokers().updateDynamicConfiguration(configName, configValue);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### List updated broker conf
+
+Fetch a list of all parameters that have been dynamically updated.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin brokers get-all-dynamic-config
+```
+Example output:
+
+```
+brokerShutdownTimeoutMs 100
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getAllDynamicConfigurations)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.brokers().getAllDynamicConfigurations();
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+## Get info of leader broker
+
+Fetch the information of the leader broker, for example, the service URL.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin brokers leader-broker
+```
+
+Example output:
+
+```json
+{
+ "serviceUrl" : "http://localhost:8080"
+}
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getLeaderBroker)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.brokers().getLeaderBroker()
+```
+
+For the detail of the code above, see [here](https://github.com/apache/pulsar/blob/master/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/BrokersImpl.java#L80)
+
+</TabItem>
+
+</Tabs>
+````
diff --git a/versioned_docs/version-5.0.x/admin-api-clusters.md b/versioned_docs/version-5.0.x/admin-api-clusters.md
new file mode 100644
index 00000000000..2b5712f2704
--- /dev/null
+++ b/versioned_docs/version-5.0.x/admin-api-clusters.md
@@ -0,0 +1,265 @@
+---
+id: admin-api-clusters
+title: Managing Clusters
+sidebar_label: "Clusters"
+description: Learn how to manage clusters using Pulsar CLI and admin APIs.
+---
+
+````mdx-code-block
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+````
+
+:::tip
+
+This page only shows **some frequently used operations**. For the latest and complete information, see the **reference docs** below.
+
+:::
+
+Category|Method|If you want to manage clusters...
+|---|---|---
+[Pulsar CLI](reference-cli-tools.md) |[pulsar-admin](/reference/#/@pulsar:version_reference@/pulsar-admin/), which lists all commands, flags, descriptions, and more.| See the `clusters` command
+[Pulsar admin APIs](admin-api-overview.md)| {@inject: rest:REST API:/}, which lists all parameters, responses, samples, and more.|See the `/admin/v2/clusters` endpoint
+[Pulsar admin APIs](admin-api-overview.md)|[Java admin API](@pulsar:javadoc:admin@/), which lists all classes, methods, descriptions, and more.|See the `clusters` method of the `PulsarAdmin` object
+
+You can perform the following operations on [clusters](reference-terminology.md#cluster).
+
+## Provision cluster
+
+You can provision new clusters using the admin interface.
+
+:::note
+
+- This operation requires superuser privileges.
+
+- When provisioning a new cluster, you need to [initialize cluster metadata](deploy-bare-metal.md#initialize-cluster-metadata). Cluster metadata can be initialized through the pulsar-admin CLI **only**. It cannot be performed via Pulsar admin APIs (REST API and Java admin API).
+
+:::
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+You can provision a new cluster using the [`create`](/reference/#/@pulsar:version_reference@/pulsar-admin/clusters?id=create) subcommand. Here's an example:
+
+```shell
+pulsar-admin clusters create cluster-1 \
+ --url http://my-cluster.org.com:8080 \
+ --broker-url pulsar://my-cluster.org.com:6650
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/createCluster)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+ClusterData clusterData = new ClusterData(
+ serviceUrl,
+ serviceUrlTls,
+ brokerServiceUrl,
+ brokerServiceUrlTls
+);
+admin.clusters().createCluster(clusterName, clusterData);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+## Get cluster configuration
+
+You can fetch the [configuration](reference-configuration.md) for an existing cluster at any time.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+Use the [`get`](/reference/#/@pulsar:version_reference@/pulsar-admin/clusters?id=get) subcommand and specify the name of the cluster. Here's an example:
+
+```shell
+pulsar-admin clusters get cluster-1
+```
+Output:
+
+```json
+{
+ "serviceUrl": "http://my-cluster.org.com:8080/",
+ "serviceUrlTls": null,
+ "brokerServiceUrl": "pulsar://my-cluster.org.com:6650/",
+ "brokerServiceUrlTls": null
+ "peerClusterNames": null
+}
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getCluster)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.clusters().getCluster(clusterName);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+## Update cluster
+
+### Update cluster configuration
+
+You can update the configuration for an existing cluster at any time.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+Use the [`update`](/reference/#/@pulsar:version_reference@/pulsar-admin/clusters?id=update) subcommand and specify new configuration values using flags.
+
+```shell
+pulsar-admin clusters update cluster-1 \
+ --url http://my-cluster.org.com:4081 \
+ --broker-url pulsar://my-cluster.org.com:3350
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/updateCluster)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+ClusterData clusterData = new ClusterData(
+ serviceUrl,
+ serviceUrlTls,
+ brokerServiceUrl,
+ brokerServiceUrlTls
+);
+admin.clusters().updateCluster(clusterName, clusterData);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Update peer-cluster data
+
+Peer clusters can be configured for a given cluster in a Pulsar [instance](reference-terminology.md#instance).
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+Use the [`update-peer-clusters`](/reference/#/@pulsar:version_reference@/pulsar-admin/clusters?id=update) subcommand and specify the list of peer-cluster names.
+
+```shell
+pulsar-admin update-peer-clusters cluster-1 --peer-clusters cluster-2
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/setPeerClusterNames)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.clusters().updatePeerClusterNames(clusterName, peerClusterList);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+## List cluster
+
+You can fetch a list of all clusters in a Pulsar [instance](reference-terminology.md#instance).
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+Use the [`list`](/reference/#/@pulsar:version_reference@/pulsar-admin/clusters?id=list) subcommand.
+
+```shell
+pulsar-admin clusters list
+```
+
+Output:
+
+```
+cluster-1
+cluster-2
+```
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getClusters)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.clusters().getClusters();
+```
+
+</TabItem>
+
+</Tabs>
+````
+## Delete cluster
+
+Clusters can be deleted from a Pulsar [instance](reference-terminology.md#instance).
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+Use the [`delete`](/reference/#/@pulsar:version_reference@/pulsar-admin/clusters?id=delete) subcommand and specify the name of the cluster.
+
+```
+pulsar-admin clusters delete cluster-1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/deleteCluster)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.clusters().deleteCluster(clusterName);
+```
+
+</TabItem>
+
+</Tabs>
+````
diff --git a/versioned_docs/version-5.0.x/admin-api-features.md b/versioned_docs/version-5.0.x/admin-api-features.md
new file mode 100644
index 00000000000..7a0bf2ba9d7
--- /dev/null
+++ b/versioned_docs/version-5.0.x/admin-api-features.md
@@ -0,0 +1,41 @@
+---
+id: admin-api-features
+title: Pulsar admin interfaces - Features
+sidebar_label: "Features"
+description: Get a comprehensive understanding of features of Pulsar admin APIs.
+---
+
+````mdx-code-block
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+````
+
+Below are the most common tasks you may want to do. For the exhaustive lists of tasks and the method to perform these tasks, see [Tools](admin-api-tools.md).
+
+
+
+These administrative tasks are categorized based on Pulsar components.
+
+Category |Components|What do you want to do?
+|---|---|---
+Server|Broker|Operations on brokers.<br/><br/>For example, <br/>- Set dynamic configurations on brokers<br/> - Run health checks against brokers<br/> - Shutdown brokers<br/> - Get broker-level stats metrics
+Storage|Bookie|Operations on bookie placement policy. <br/><br/>For example, <br/> - Get or set bookie replacement policy
+Entities|- Topic <br/><br/> - Schema <br/><br/> - Namespace <br/><br/> - Tenant <br/><br/> - Cluster|Operations on topics, schemas, namespaces, tenants, or clusters.<br/><br/> For example, <br/> - Create, update or delete topics, tenants, namespaces, or clusters <br/> - Set isolation policies, configure offload thresholds, or set permissions for namespaces <br/> - Upload, extract, or delete schemas
+Stream processing|<br/><br/> - Function <br/><br/> - Connector <br/><br/> - Transaction <br/><br/> - Package | Operations on functions, function workers, or connectors. <br/> For example, <br/> - Create, update, and delete functions or connectors <br/> - Get stats of function workers, trigger rebalance of functions to workers <br/><br/> Operations on transactions. <br/> For example, <br/> - Get stats of transactions <br/> - Update the scale of transaction coordinators <br/><br/> Operatio [...]
+Others| - Proxy <br/><br/> - Resource groups <br/><br/> - Resource quotas | Operations on proxy stats. <br/> For example, <br/> - Get various monitoring metrics for proxy stats <br/><br/> Operations on resource groups.<br/>For example, <br/> - Create, update, and delete resource groups <br/><br/>Operations on resource quotas.<br/>For example, <br/> - Set resource quota for namespace bundles
+
+### Related topics
+
+- To understand the basics, see [Pulsar admin API - Overview](admin-api-overview.md)
+
+- To learn usage scenarios, see [Pulsar admin API - Use cases](admin-api-use-cases.md).
+
+- To perform administrative operations, see [Pulsar admin API - Tools](admin-api-tools.md).
+
+- To get up quickly, see [Pulsar admin API - Get started](admin-get-started.md).
+
+- To check the detailed usage, see the API references below.
+
+ - [Java admin API](@pulsar:javadoc:admin@/)
+
+ - [REST API](reference-rest-api-overview.md)
diff --git a/versioned_docs/version-5.0.x/admin-api-functions.md b/versioned_docs/version-5.0.x/admin-api-functions.md
new file mode 100644
index 00000000000..124c27b20b8
--- /dev/null
+++ b/versioned_docs/version-5.0.x/admin-api-functions.md
@@ -0,0 +1,764 @@
+---
+id: admin-api-functions
+title: Manage Functions
+sidebar_label: "Functions"
+description: Learn how to manage functions using Pulsar CLI and admin APIs.
+---
+
+````mdx-code-block
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+````
+
+:::tip
+
+This page only shows **some frequently used operations**. For the latest and complete information, see the **reference docs** below.
+
+:::
+
+Category|Method|If you want to manage functions...
+|---|---|---
+[Pulsar CLI](reference-cli-tools.md) |[pulsar-admin](/reference/#/@pulsar:version_reference@/pulsar-admin/), which lists all commands, flags, descriptions, and more.| See the `functions` command
+[Pulsar admin APIs](admin-api-overview.md)| {@inject: rest:REST API:/}, which lists all parameters, responses, samples, and more.|See the `/admin/v3/functions` endpoint
+[Pulsar admin APIs](admin-api-overview.md)|[Java admin API](@pulsar:javadoc:admin@/), which lists all classes, methods, descriptions, and more.|See the `functions` method of the `PulsarAdmin` object
+
+
+You can perform the following operations on [functions](functions-overview.md/#what-are-pulsar-functions).
+## Create a function
+
+You can create a Pulsar function in cluster mode (deploy it on a Pulsar cluster) using Admin CLI, REST API or Java Admin API.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="Admin CLI"
+ values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="Admin CLI">
+
+Use the [`create`](/reference/#/@pulsar:version_reference@/pulsar-admin/functions?id=create) subcommand.
+
+**Example**
+
+```shell
+pulsar-admin functions create \
+ --tenant public \
+ --namespace default \
+ --name (the name of Pulsar Functions) \
+ --inputs test-input-topic \
+ --output persistent://public/default/test-output-topic \
+ --classname org.apache.pulsar.functions.api.examples.ExclamationFunction \
+ --jar $PWD/examples/api-examples.jar
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v3/functions/registerFunction)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+FunctionConfig functionConfig = new FunctionConfig();
+functionConfig.setTenant(tenant);
+functionConfig.setNamespace(namespace);
+functionConfig.setName(functionName);
+functionConfig.setRuntime(FunctionConfig.Runtime.JAVA);
+functionConfig.setParallelism(1);
+functionConfig.setClassName("org.apache.pulsar.functions.api.examples.ExclamationFunction");
+functionConfig.setProcessingGuarantees(FunctionConfig.ProcessingGuarantees.ATLEAST_ONCE);
+functionConfig.setTopicsPattern(sourceTopicPattern);
+functionConfig.setSubName(subscriptionName);
+functionConfig.setAutoAck(true);
+functionConfig.setOutput(sinkTopic);
+admin.functions().createFunction(functionConfig, fileName);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+## Update a function
+
+You can update a Pulsar function that has been deployed to a Pulsar cluster using Admin CLI, REST API or Java Admin API.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="Admin CLI"
+ values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="Admin CLI">
+
+Use the [`update`](/reference/#/@pulsar:version_reference@/pulsar-admin/functions?id=update) subcommand.
+
+**Example**
+
+```shell
+pulsar-admin functions update \
+ --tenant public \
+ --namespace default \
+ --name (the name of Pulsar Functions) \
+ --output persistent://public/default/update-output-topic \
+ # other options
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v3/functions/updateFunction)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+FunctionConfig functionConfig = new FunctionConfig();
+functionConfig.setTenant(tenant);
+functionConfig.setNamespace(namespace);
+functionConfig.setName(functionName);
+functionConfig.setRuntime(FunctionConfig.Runtime.JAVA);
+functionConfig.setParallelism(1);
+functionConfig.setClassName("org.apache.pulsar.functions.api.examples.ExclamationFunction");
+UpdateOptions updateOptions = new UpdateOptions();
+updateOptions.setUpdateAuthData(updateAuthData);
+admin.functions().updateFunction(functionConfig, userCodeFile, updateOptions);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+## Start a function
+
+You can [start an instance of a function](#start-an-instance-of-a-function) or [start all instances of a function](#start-all-instances-of-a-function).
+### Start an instance of a function
+
+You can start a stopped function instance with `instance-id` using Admin CLI, REST API or Java Admin API.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="Admin CLI"
+ values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="Admin CLI">
+
+Use the [`start`](/reference/#/@pulsar:version_reference@/pulsar-admin/functions?id=start) subcommand.
+
+```shell
+pulsar-admin functions start \
+ --tenant public \
+ --namespace default \
+ --name (the name of Pulsar Functions) \
+ --instance-id 1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v3/functions/startFunction_1)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.functions().startFunction(tenant, namespace, functionName, Integer.parseInt(instanceId));
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Start all instances of a function
+
+You can start all stopped function instances using Admin CLI, REST API or Java Admin API.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="Admin CLI"
+ values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="Admin CLI">
+
+Use the [`start`](/reference/#/@pulsar:version_reference@/pulsar-admin/functions?id=start) subcommand.
+
+**Example**
+
+```shell
+pulsar-admin functions start \
+ --tenant public \
+ --namespace default \
+ --name (the name of Pulsar Functions) \
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v3/functions/startFunction)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.functions().startFunction(tenant, namespace, functionName);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+## Stop a function
+
+You can [stop an instance of a function](#stop-an-instance-of-a-function) or [stop all instances of a function](#stop-all-instances-of-a-function).
+
+### Stop an instance of a function
+
+You can stop a function instance with `instance-id` using Admin CLI, REST API or Java Admin API.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="Admin CLI"
+ values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="Admin CLI">
+
+Use the [`stop`](/reference/#/@pulsar:version_reference@/pulsar-admin/functions?id=stop) subcommand.
+
+**Example**
+
+```shell
+pulsar-admin functions stop \
+ --tenant public \
+ --namespace default \
+ --name (the name of Pulsar Functions) \
+ --instance-id 1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v3/functions/stopFunction_1)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.functions().stopFunction(tenant, namespace, functionName, Integer.parseInt(instanceId));
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Stop all instances of a function
+
+You can stop all function instances using Admin CLI, REST API or Java Admin API.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="Admin CLI"
+ values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="Admin CLI">
+
+Use the [`stop`](/reference/#/@pulsar:version_reference@/pulsar-admin/functions?id=stop) subcommand.
+
+**Example**
+
+```shell
+pulsar-admin functions stop \
+ --tenant public \
+ --namespace default \
+ --name (the name of Pulsar Functions)
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v3/functions/stopFunction)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.functions().stopFunction(tenant, namespace, functionName);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+## Restart a function
+
+You can [restart an instance of a function](#restart-an-instance-of-a-function) or [restart all instances of a function](#restart-all-instances-of-a-function).
+
+### Restart an instance of a function
+
+Restart a function instance with `instance-id` using Admin CLI, REST API or Java Admin API.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="Admin CLI"
+ values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="Admin CLI">
+
+Use the [`restart`](/reference/#/@pulsar:version_reference@/pulsar-admin/functions?id=restart) subcommand.
+
+**Example**
+
+```shell
+pulsar-admin functions restart \
+ --tenant public \
+ --namespace default \
+ --name (the name of Pulsar Functions) \
+ --instance-id 1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v3/functions/restartFunction_1)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.functions().restartFunction(tenant, namespace, functionName, Integer.parseInt(instanceId));
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Restart all instances of a function
+
+You can restart all function instances using Admin CLI, REST API or Java admin API.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="Admin CLI"
+ values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="Admin CLI">
+
+Use the [`restart`](/reference/#/@pulsar:version_reference@/pulsar-admin/functions?id=restart) subcommand.
+
+**Example**
+
+```shell
+pulsar-admin functions restart \
+ --tenant public \
+ --namespace default \
+ --name (the name of Pulsar Functions)
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v3/functions/restartFunction)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.functions().restartFunction(tenant, namespace, functionName);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+## List all functions
+
+You can list all Pulsar functions running under a specific tenant and namespace using Admin CLI, REST API or Java Admin API.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="Admin CLI"
+ values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="Admin CLI">
+
+Use the [`list`](/reference/#/@pulsar:version_reference@/pulsar-admin/functions?id=list) subcommand.
+
+**Example**
+
+```shell
+pulsar-admin functions list \
+ --tenant public \
+ --namespace default
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v3/functions/listFunctions)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.functions().getFunctions(tenant, namespace);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+## Delete a function
+
+You can delete a Pulsar function that is running on a Pulsar cluster using Admin CLI, REST API or Java Admin API.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="Admin CLI"
+ values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="Admin CLI">
+
+Use the [`delete`](/reference/#/@pulsar:version_reference@/pulsar-admin/functions?id=delete) subcommand.
+
+**Example**
+
+```shell
+pulsar-admin functions delete \
+ --tenant public \
+ --namespace default \
+ --name (the name of Pulsar Functions)
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v3/functions/deregisterFunction)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.functions().deleteFunction(tenant, namespace, functionName);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+## Get info about a function
+
+You can get information about a Pulsar function currently running in cluster mode using Admin CLI, REST API or Java Admin API.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="Admin CLI"
+ values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="Admin CLI">
+
+Use the [`get`](/reference/#/@pulsar:version_reference@/pulsar-admin/functions?id=get) subcommand.
+
+**Example**
+
+```shell
+pulsar-admin functions get \
+ --tenant public \
+ --namespace default \
+ --name (the name of Pulsar Functions)
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v3/functions/getFunctionInfo)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.functions().getFunction(tenant, namespace, functionName);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+## Get status of a function
+
+You can [get the status of an instance of a function](#get-status-of-an-instance-of-a-function) or [get the status of all instances of a function](#get-status-of-all-instances-of-a-function).
+
+### Get status of an instance of a function
+
+You can get the current status of a Pulsar function instance with `instance-id` using Admin CLI, REST API or Java Admin API.
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="Admin CLI"
+ values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="Admin CLI">
+
+Use the [`status`](/reference/#/@pulsar:version_reference@/pulsar-admin/functions?id=status) subcommand.
+
+**Example**
+
+```shell
+pulsar-admin functions status \
+ --tenant public \
+ --namespace default \
+ --name (the name of Pulsar Functions) \
+ --instance-id 1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v3/functions/getFunctionInstanceStatus)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.functions().getFunctionStatus(tenant, namespace, functionName, Integer.parseInt(instanceId));
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Get status of all instances of a function
+
+You can get the current status of a Pulsar function instance using Admin CLI, REST API or Java Admin API.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="Admin CLI"
+ values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="Admin CLI">
+
+Use the [`status`](/reference/#/@pulsar:version_reference@/pulsar-admin/functions?id=status) subcommand.
+
+**Example**
+
+```shell
+pulsar-admin functions status \
+ --tenant public \
+ --namespace default \
+ --name (the name of Pulsar Functions)
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v3/functions/getFunctionStatus)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.functions().getFunctionStatus(tenant, namespace, functionName);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+## Get stats of a function
+
+You can [get stats of an instance of a function](#get-stats-of-an-instance-of-a-function) or [get stats of all instances of a function](#get-stats-of-all-instances-of-a-function).
+### Get stats of an instance of a function
+
+You can get the current stats of a Pulsar Function instance with `instance-id` using Admin CLI, REST API or Java admin API.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="Admin CLI"
+ values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="Admin CLI">
+
+Use the [`stats`](/reference/#/@pulsar:version_reference@/pulsar-admin/functions?id=stats) subcommand.
+
+**Example**
+
+```shell
+pulsar-admin functions stats \
+ --tenant public \
+ --namespace default \
+ --name (the name of Pulsar Functions) \
+ --instance-id 1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v3/functions/getFunctionInstanceStats)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.functions().getFunctionStats(tenant, namespace, functionName, Integer.parseInt(instanceId));
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Get stats of all instances of a function
+
+You can get the current stats of a Pulsar function using Admin CLI, REST API or Java admin API.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="Admin CLI"
+ values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="Admin CLI">
+
+Use the [`stats`](/reference/#/@pulsar:version_reference@/pulsar-admin/functions?id=stats) subcommand.
+
+**Example**
+
+```shell
+pulsar-admin functions stats \
+ --tenant public \
+ --namespace default \
+ --name (the name of Pulsar Functions)
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v3/functions/getFunctionStats)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.functions().getFunctionStats(tenant, namespace, functionName);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+## Trigger a function
+
+You can trigger a specified Pulsar function with a supplied value using Admin CLI, REST API or Java admin API.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="Admin CLI"
+ values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="Admin CLI">
+
+Use the [`trigger`](/reference/#/@pulsar:version_reference@/pulsar-admin/functions?id=trigger) subcommand.
+
+**Example**
+
+```shell
+pulsar-admin functions trigger \
+ --tenant public \
+ --namespace default \
+ --name (the name of Pulsar Functions) \
+ --topic (the name of input topic) \
+ --trigger-value \"hello pulsar\"
+ # or --trigger-file (the path of trigger file)
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v3/functions/triggerFunction)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.functions().triggerFunction(tenant, namespace, functionName, topic, triggerValue, triggerFile);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+
+
+## Put state associated with a function
+
+You can put the state associated with a Pulsar function using Admin CLI, REST API or Java admin API.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="Admin CLI"
+ values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="Admin CLI">
+
+Use the [`putstate`](/reference/#/@pulsar:version_reference@/pulsar-admin/functions?id=putstate) subcommand.
+
+**Example**
+
+```shell
+pulsar-admin functions putstate \
+ --tenant public \
+ --namespace default \
+ --name (the name of Pulsar Functions) \
+ --state "{\"key\":\"pulsar\", \"stringValue\":\"hello pulsar\"}"
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v3/functions/putFunctionState)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+TypeReference<FunctionState> typeRef = new TypeReference<FunctionState>() {};
+FunctionState stateRepr = ObjectMapperFactory.getThreadLocal().readValue(state, typeRef);
+admin.functions().putFunctionState(tenant, namespace, functionName, stateRepr);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+## Fetch state associated with a function
+
+You can fetch the current state associated with a Pulsar function using Admin CLI, REST API or Java admin API.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="Admin CLI"
+ values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="Admin CLI">
+
+Use the [`querystate`](/reference/#/@pulsar:version_reference@/pulsar-admin/functions?id=querystate) subcommand.
+
+**Example**
+
+```shell
+pulsar-admin functions querystate \
+ --tenant public \
+ --namespace default \
+ --name (the name of Pulsar Functions) \
+ --key (the key of state)
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v3/functions/getFunctionState)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.functions().getFunctionState(tenant, namespace, functionName, key);
+```
+
+</TabItem>
+
+</Tabs>
+````
diff --git a/versioned_docs/version-5.0.x/admin-api-namespaces.md b/versioned_docs/version-5.0.x/admin-api-namespaces.md
new file mode 100644
index 00000000000..45ad1fcdc5b
--- /dev/null
+++ b/versioned_docs/version-5.0.x/admin-api-namespaces.md
@@ -0,0 +1,1251 @@
+---
+id: admin-api-namespaces
+title: Managing Namespaces
+sidebar_label: "Namespaces"
+description: Learn how to manage namespaces using Pulsar CLI and admin APIs.
+---
+
+````mdx-code-block
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+````
+
+
+:::tip
+
+ This page only shows **some frequently used operations**.
+
+ - For the latest and complete information about `Pulsar admin`, including commands, flags, descriptions, and more information, see [Pulsar admin docs](/reference/#/@pulsar:version_reference@/pulsar-admin/).
+
+ - For the latest and complete information about `REST API`, including parameters, responses, samples, and more, see {@inject: rest:REST:/} API doc.
+
+ - For the latest and complete information about `Java admin API`, including classes, methods, descriptions, and more, see [Java admin API doc](@pulsar:javadoc:admin@/).
+
+:::
+
+Pulsar [namespaces](reference-terminology.md#namespace) are logical groupings of [topics](reference-terminology.md#topic).
+
+Namespaces can be managed via:
+
+* The `namespaces` command of the [`pulsar-admin`](/reference/#/@pulsar:version_reference@/pulsar-admin/) tool
+* The `/admin/v2/namespaces` endpoint of the admin {@inject: rest:REST:/} API
+* The `namespaces` method of the `PulsarAdmin` object in the [Java API](/docs/client-libraries/java)
+
+## Namespaces resources
+
+### Create namespaces
+
+You can create new namespaces under a given [tenant](reference-terminology.md#tenant).
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+Use the [`create`](/reference/#/@pulsar:version_reference@/pulsar-admin/namespaces?id=create) subcommand and specify the namespace by name:
+
+```shell
+pulsar-admin namespaces create test-tenant/test-namespace
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/createNamespace)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.namespaces().createNamespace(namespace);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Get policies
+
+You can fetch the current policies associated with a namespace at any time.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+Use the [`policies`](/reference/#/@pulsar:version_reference@/pulsar-admin/namespaces?id=policies) subcommand and specify the namespace:
+
+```shell
+pulsar-admin namespaces policies test-tenant/test-namespace
+```
+
+Example output:
+
+```json
+{
+ "auth_policies": {
+ "namespace_auth": {},
+ "destination_auth": {}
+ },
+ "replication_clusters": [],
+ "bundles_activated": true,
+ "bundles": {
+ "boundaries": [
+ "0x00000000",
+ "0xffffffff"
+ ],
+ "numBundles": 1
+ },
+ "backlog_quota_map": {},
+ "persistence": null,
+ "latency_stats_sample_rate": {},
+ "message_ttl_in_seconds": 0,
+ "retention_policies": null,
+ "deleted": false
+}
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getPolicies)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.namespaces().getPolicies(namespace);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### List namespaces
+
+You can list all namespaces within a given Pulsar [tenant](reference-terminology.md#tenant).
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+Use the [`list`](/reference/#/@pulsar:version_reference@/pulsar-admin/namespaces?id=list) subcommand and specify the tenant:
+
+```shell
+pulsar-admin namespaces list test-tenant
+```
+
+Example output:
+
+```
+test-tenant/namespace1
+test-tenant/namespace2
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getTenantNamespaces)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.namespaces().getNamespaces(tenant);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Delete namespaces
+
+You can delete existing namespaces from a tenant.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+Use the [`delete`](/reference/#/@pulsar:version_reference@/pulsar-admin/namespaces?id=delete) subcommand and specify the namespace:
+
+```shell
+pulsar-admin namespaces delete test-tenant/namespace1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/deleteNamespace)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.namespaces().deleteNamespace(namespace);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Configure replication clusters
+
+#### Set replication cluster
+
+You can set replication clusters for a namespace to enable Pulsar to internally replicate the published messages from one colocation facility to another.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin namespaces set-clusters test-tenant/namespace1 --clusters cl1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/setNamespaceReplicationClusters)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.namespaces().setNamespaceReplicationClusters(namespace, clusters);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+#### Get replication cluster
+
+You can get the list of replication clusters for a given namespace.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin namespaces get-clusters test-tenant/cluster1/namespace1
+```
+
+Example output:
+
+```
+cluster2
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getNamespaceReplicationClusters)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.namespaces().getNamespaceReplicationClusters(namespace)
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Configure backlog quota policies
+
+#### Set backlog quota policies
+
+Backlog quota helps the broker to restrict bandwidth/storage of a namespace once it reaches a certain threshold limit. Admin can set the limit and take the corresponding action after the limit is reached.
+
+ 1. producer_request_hold: the producer holds the message and retries until client configuration `sendTimeoutMs` is exceeded
+
+ 2. producer_exception: the producer throws an exception when trying to send a message
+
+ 3. consumer_backlog_eviction: broker starts discarding backlog messages
+
+Backlog quota restriction can be taken care of by defining the restriction of backlog-quota-type: destination_storage.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin namespaces set-backlog-quota --limit 10G \
+ --limitTime 36000 \
+ --policy producer_request_hold \
+ test-tenant/namespace1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/setBacklogQuota)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.namespaces().setBacklogQuota(namespace, new BacklogQuota(limit, limitTime, policy))
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+#### Get backlog quota policies
+
+You can get a configured backlog quota for a given namespace.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin namespaces get-backlog-quotas test-tenant/namespace1
+```
+
+Example output:
+
+```
+destination_storage BacklogQuotaImpl(limit=10737418240, limitSize=10737418240, limitTime=36000, policy=producer_request_hold)
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getBacklogQuotaMap)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.namespaces().getBacklogQuotaMap(namespace);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+#### Remove backlog quota policies
+
+You can remove backlog quota policies for a given namespace.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin namespaces remove-backlog-quota test-tenant/namespace1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/removeBacklogQuota)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.namespaces().removeBacklogQuota(namespace, backlogQuotaType)
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Configure persistence policies
+
+#### Set persistence policies
+
+Persistence policies allow users to configure persistency-level for all topic messages under a given namespace.
+
+ - Bookkeeper-ack-quorum: Number of acks (guaranteed copies) to wait for each entry, default: 2
+
+ - Bookkeeper-ensemble: Number of bookies to use for a topic, default: 2
+
+ - Bookkeeper-write-quorum: How many writes to make of each entry, default: 2
+
+ - Ml-mark-delete-max-rate: Throttling rate of mark-delete operation (0 means no throttle), default: 0
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin namespaces set-persistence \
+ --bookkeeper-ack-quorum 2 --bookkeeper-ensemble 3 \
+ --bookkeeper-write-quorum 2 --ml-mark-delete-max-rate 0 \
+ test-tenant/namespace1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/setPersistence)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.namespaces().setPersistence(namespace,new PersistencePolicies(bookkeeperEnsemble, bookkeeperWriteQuorum,bookkeeperAckQuorum,managedLedgerMaxMarkDeleteRate))
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+#### Get persistence policies
+
+You can get the configured persistence policies of a given namespace.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin namespaces get-persistence test-tenant/namespace1
+```
+
+Example output:
+
+```json
+{
+ "bookkeeperEnsemble": 3,
+ "bookkeeperWriteQuorum": 2,
+ "bookkeeperAckQuorum": 2,
+ "managedLedgerMaxMarkDeleteRate": 0
+}
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getPersistence)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.namespaces().getPersistence(namespace)
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Configure namespace bundles
+
+#### Unload namespace bundles
+
+A namespace bundle is a virtual group of topics that belong to the same namespace. If the broker gets overloaded with the number of bundles, this command can help unload a bundle from that broker, so it can be served by some other less-loaded brokers. The namespace bundle ID ranges from 0x00000000 to 0xffffffff.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin namespaces unload --bundle 0x00000000_0xffffffff test-tenant/namespace1
+pulsar-admin namespaces unload --bundle 0x00000000_0xffffffff test-tenant/namespace1
+pulsar-admin namespaces unload --bundle 0x00000000_0xffffffff --destinationBroker broker1.use.org.com:8080 test-tenant/namespace1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/unloadNamespaceBundle)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.namespaces().unloadNamespaceBundle(namespace, bundle)
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+#### Split namespace bundles
+
+One namespace bundle can contain multiple topics but can be served by only one broker. If a single bundle is creating an excessive load on a broker, an admin can split the bundle using the command below, permitting one or more of the new bundles to be unloaded, thus balancing the load across the brokers.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin namespaces split-bundle --bundle 0x00000000_0xffffffff test-tenant/namespace1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/splitNamespaceBundle)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.namespaces().splitNamespaceBundle(namespace, bundle, unloadSplitBundles, splitAlgorithmName)
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Configure message TTL
+
+#### Set message-ttl
+
+You can configure the time to live (in seconds) duration for messages. In the example below, the message-ttl is set as 100s.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin namespaces set-message-ttl --messageTTL 100 test-tenant/namespace1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/setNamespaceMessageTTL)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.namespaces().setNamespaceMessageTTL(namespace, messageTTL)
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+#### Get message-ttl
+
+When the message-ttl for a namespace is set, you can use the command below to get the configured value. This example comtinues the example of the command `set message-ttl`, so the returned value is 100(s).
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin namespaces get-message-ttl test-tenant/namespace1
+```
+Example output:
+
+```
+100
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getNamespaceMessageTTL)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.namespaces().getNamespaceMessageTTL(namespace)
+```
+
+```
+100
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+#### Remove message-ttl
+
+Remove a message TTL of the configured namespace.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin namespaces remove-message-ttl test-tenant/namespace1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/removeNamespaceMessageTTL)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.namespaces().removeNamespaceMessageTTL(namespace)
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+
+### Clear backlog
+
+#### Clear namespace backlog
+
+It clears all message backlogs for all the topics that belong to a specific namespace. You can also clear backlogs for a specific subscription as well.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin namespaces clear-backlog --sub my-subscription test-tenant/namespace1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/clearNamespaceBacklogForSubscription)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.namespaces().clearNamespaceBacklogForSubscription(namespace, subscription)
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+#### Clear bundle backlog
+
+It clears all message backlogs for all the topics that belong to a specific NamespaceBundle. You can also clear backlogs for a specific subscription as well.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin namespaces clear-backlog \
+ --bundle 0x00000000_0xffffffff \
+ --sub my-subscription \
+ test-tenant/namespace1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/clearNamespaceBundleBacklogForSubscription)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+
+admin.namespaces().clearNamespaceBundleBacklogForSubscription(namespace, bundle, subscription)
+
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Configure retention
+
+#### Set retention
+
+Each namespace contains multiple topics and the retention size (storage size) of each topic should not exceed a specific threshold or it should be stored for a certain period. This command helps configure the retention size and time of topics in a given namespace.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin namespaces set-retention --size 100M --time 10m test-tenant/namespace1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/setRetention)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.namespaces().setRetention(namespace, new RetentionPolicies(retentionTimeInMin, retentionSizeInMB))
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+#### Get retention
+
+It shows the retention information of a given namespace.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin namespaces get-retention test-tenant/namespace1
+```
+
+```json
+{
+ "retentionTimeInMinutes": 10,
+ "retentionSizeInMB": 100
+}
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getRetention)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.namespaces().getRetention(namespace)
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Configure dispatch throttling for topics
+
+#### Set dispatch throttling for topics
+
+It sets the message dispatch rate for all the topics under a given namespace. The dispatch rate can be restricted by the number of messages per X seconds (`msg-dispatch-rate`) or by the number of message-bytes per X second (`byte-dispatch-rate`). The dispatch rate is in second and it can be configured with `dispatch-rate-period`. The default value of `msg-dispatch-rate` and `byte-dispatch-rate` is -1 which
+disables the throttling.
+
+:::note
+
+- If neither `clusterDispatchRate` nor `topicDispatchRate` is configured, dispatch throttling is disabled.
+- If `topicDispatchRate` is not configured, `clusterDispatchRate` takes effect.
+- If `topicDispatchRate` is configured, `topicDispatchRate` takes effect.
+
+:::
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin namespaces set-dispatch-rate test-tenant/namespace1 \
+ --msg-dispatch-rate 1000 \
+ --byte-dispatch-rate 1048576 \
+ --dispatch-rate-period 1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/setDispatchRate)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.namespaces().setDispatchRate(namespace, new DispatchRate(1000, 1048576, 1))
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+#### Get configured message-rate for topics
+
+It shows the configured message-rate for the namespace (topics under this namespace can dispatch this many messages per second)
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin namespaces get-dispatch-rate test-tenant/namespace1
+```
+
+Example output:
+
+```json
+{
+ "dispatchThrottlingRateInMsg" : 1000,
+ "dispatchThrottlingRateInByte" : 1048576,
+ "relativeToPublishRate" : false,
+ "ratePeriodInSecond" : 1
+}
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getDispatchRate)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.namespaces().getDispatchRate(namespace)
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Configure dispatch throttling for subscription
+
+#### Set dispatch throttling for subscription
+
+It sets the message dispatch rate for all the subscriptions of topics under a given namespace. The dispatch rate can be restricted by the number of messages per X seconds (`msg-dispatch-rate`) or by the number of message-bytes per X second (`byte-dispatch-rate`). The dispatch rate is in second and it can be configured with `dispatch-rate-period`. The default value of `msg-dispatch-rate` and `byte-dispatch-rate` is -1 which
+disables the throttling.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin namespaces set-subscription-dispatch-rate test-tenant/namespace1 \
+ --msg-dispatch-rate 1000 \
+ --byte-dispatch-rate 1048576 \
+ --dispatch-rate-period 1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/setSubscriptionDispatchRate)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.namespaces().setSubscriptionDispatchRate(namespace, new DispatchRate(1000, 1048576, 1))
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+#### Get configured message-rate for subscription
+
+It shows the configured message-rate for the namespace (topics under this namespace can dispatch this many messages per second).
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin namespaces get-subscription-dispatch-rate test-tenant/namespace1
+```
+
+Example output:
+
+```json
+{
+ "dispatchThrottlingRateInMsg" : 1000,
+ "dispatchThrottlingRateInByte" : 1048576,
+ "relativeToPublishRate" : false,
+ "ratePeriodInSecond" : 1
+}
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getSubscriptionDispatchRate)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.namespaces().getSubscriptionDispatchRate(namespace)
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Configure dispatch throttling for replicators
+
+#### Set dispatch throttling for replicators
+
+It sets the message dispatch rate for all the replicators between replication clusters under a given namespace. The dispatch rate can be restricted by the number of messages per X seconds (`msg-dispatch-rate`) or by the number of message-bytes per X second (`byte-dispatch-rate`). The dispatch rate is in second and it can be configured with `dispatch-rate-period`. The default value of `msg-dispatch-rate` and `byte-dispatch-rate` is -1 which disables the throttling.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin namespaces set-replicator-dispatch-rate test-tenant/namespace1 \
+ --msg-dispatch-rate 1000 \
+ --byte-dispatch-rate 1048576 \
+ --dispatch-rate-period 1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/setDispatchRate)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.namespaces().setReplicatorDispatchRate(namespace, new DispatchRate(1000, 1048576, 1))
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+#### Get configured message-rate for replicators
+
+It shows the configured message-rate for the namespace (topics under this namespace can dispatch this many messages per second)
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin namespaces get-replicator-dispatch-rate test-tenant/namespace1
+```
+
+```json
+{
+ "dispatchThrottlingRatePerTopicInMsg" : 1000,
+ "dispatchThrottlingRatePerTopicInByte" : 1048576,
+ "ratePeriodInSecond" : 1
+}
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getDispatchRate)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.namespaces().getReplicatorDispatchRate(namespace)
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Configure deduplication snapshot interval
+
+#### Get deduplication snapshot interval
+
+It shows the configured `deduplicationSnapshotInterval` for a namespace (Each topic under the namespace will take a deduplication snapshot according to this interval)
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin namespaces get-deduplication-snapshot-interval test-tenant/namespace1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getDeduplicationSnapshotInterval)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.namespaces().getDeduplicationSnapshotInterval(namespace)
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+#### Set deduplication snapshot interval
+
+Set the configured `deduplicationSnapshotInterval` for a namespace. Each topic under the namespace will take a deduplication snapshot according to this interval. `brokerDeduplicationEnabled` must be set to `true` for this property to take effect.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin namespaces set-deduplication-snapshot-interval test-tenant/namespace1 --interval 1000
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/setDeduplicationSnapshotInterval)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.namespaces().setDeduplicationSnapshotInterval(namespace, 1000)
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+#### Remove deduplication snapshot interval
+
+Remove configured `deduplicationSnapshotInterval` of a namespace (Each topic under the namespace will take a deduplication snapshot according to this interval).
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin namespaces remove-deduplication-snapshot-interval test-tenant/namespace1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/setDeduplicationSnapshotInterval)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.namespaces().removeDeduplicationSnapshotInterval(namespace)
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Namespace isolation
+
+You can use the [Pulsar isolation policy](administration-isolation.md) to allocate resources (broker and bookie) for a namespace.
+
+### Unload namespaces from a broker
+
+You can unload a namespace, or a [namespace bundle](reference-terminology.md#namespace-bundle), from the Pulsar [broker](reference-terminology.md#broker) that is currently responsible for it.
+
+#### pulsar-admin
+
+Use the [`unload`](/reference/#/@pulsar:version_reference@/pulsar-admin/namespaces?id=unload) subcommand of the [`namespaces`](/reference/#/@pulsar:version_reference@/pulsar-admin/namespaces) command.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin namespaces unload my-tenant/my-ns
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/unloadNamespace)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.namespaces().unload(namespace)
+```
+
+</TabItem>
+
+</Tabs>
+````
+### Configure entry filters policy
+
+#### Set entry filters policy
+
+Entry filter helps with filtering message on server side.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```
+pulsar-admin namespaces set-entry-filters \
+ --desc "The description of the entry filter to be used for user help." \
+ --entry-filters-name "The class name for the entry filter." \
+ --entry-filters-dir "The directory for all the entry filter implementations." \
+ test-tenant/namespace1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/setEntryFiltersPerTopic)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.namespaces().setEntryFilters(namespace, new EntryFilters("desc", "classes name", "class files localtion"))
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+#### Get entry filters policies
+
+You can get a configured entry filter for a given namespace.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin namespaces get-entry-filters test-tenant/namespace1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getEntryFiltersPerTopic)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.namespaces().getEntryFilters(namespace);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+#### Remove entry filters policies
+
+You can remove entry filters policies for a given namespace.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin namespaces remove-entry-filters test-tenant/namespace1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/removeNamespaceEntryFilters)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.namespaces().removeEntryFilters(namespace)
+```
+
+</TabItem>
+
+</Tabs>
+````
diff --git a/versioned_docs/version-5.0.x/admin-api-non-partitioned-topics.md b/versioned_docs/version-5.0.x/admin-api-non-partitioned-topics.md
new file mode 100644
index 00000000000..b6fedac2422
--- /dev/null
+++ b/versioned_docs/version-5.0.x/admin-api-non-partitioned-topics.md
@@ -0,0 +1,7 @@
+---
+id: admin-api-non-partitioned-topics
+title: Managing non-partitioned topics
+sidebar_label: "Non-partitioned topics"
+---
+
+For details of the content, refer to [manage topics](admin-api-topics.md).
\ No newline at end of file
diff --git a/versioned_docs/version-5.0.x/admin-api-non-persistent-topics.md b/versioned_docs/version-5.0.x/admin-api-non-persistent-topics.md
new file mode 100644
index 00000000000..2c645e507ca
--- /dev/null
+++ b/versioned_docs/version-5.0.x/admin-api-non-persistent-topics.md
@@ -0,0 +1,7 @@
+---
+id: admin-api-non-persistent-topics
+title: Managing non-persistent topics
+sidebar_label: "Non-Persistent topics"
+---
+
+For details of the content, refer to [manage topics](admin-api-topics.md).
\ No newline at end of file
diff --git a/versioned_docs/version-5.0.x/admin-api-overview.md b/versioned_docs/version-5.0.x/admin-api-overview.md
new file mode 100644
index 00000000000..51f04077235
--- /dev/null
+++ b/versioned_docs/version-5.0.x/admin-api-overview.md
@@ -0,0 +1,31 @@
+---
+id: admin-api-overview
+title: Pulsar admin interfaces
+sidebar_label: "Overview"
+description: Get a comprehensive understanding of usage of Pulsar admin APIs.
+---
+
+````mdx-code-block
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+````
+
+Pulsar admin APIs enable you to administer clusters programmatically. For example, you can create, update, delete, and manage all the entities within Pulsar instances (such as clusters, namespaces, tenants, topics, schemas, connectors, functions, and so on), and set various policies for data, resources, and security.
+
+
+
+### Related topics
+
+- To learn usage scenarios, see [Pulsar admin API - Use cases](admin-api-use-cases.md).
+
+- To learn common administrative tasks, see [Pulsar admin API - Features](admin-api-features.md).
+
+- To perform administrative operations, see [Pulsar admin API - Tools](admin-api-tools.md).
+
+- To get up quickly, see [Pulsar admin API - Get started](admin-get-started.md).
+
+- To check the detailed usage, see the API references below.
+
+ - [Java admin API](@pulsar:javadoc:admin@/)
+
+ - [REST API](reference-rest-api-overview.md)
diff --git a/versioned_docs/version-5.0.x/admin-api-packages.md b/versioned_docs/version-5.0.x/admin-api-packages.md
new file mode 100644
index 00000000000..9c301bbe410
--- /dev/null
+++ b/versioned_docs/version-5.0.x/admin-api-packages.md
@@ -0,0 +1,363 @@
+---
+id: admin-api-packages
+title: Manage packages
+sidebar_label: "Packages"
+description: Learn how to manage packages using Pulsar CLI and admin APIs.
+---
+
+````mdx-code-block
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+````
+
+
+:::tip
+
+ This page only shows **some frequently used operations**.
+
+ - For the latest and complete information about `Pulsar admin`, including commands, flags, descriptions, and more, see [Pulsar admin doc](/reference/#/@pulsar:version_reference@/pulsar-admin/).
+
+ - For the latest and complete information about `REST API`, including parameters, responses, samples, and more, see {@inject: rest:REST:/} API doc.
+
+ - For the latest and complete information about `Java admin API`, including classes, methods, descriptions, and more, see [Java admin API doc](@pulsar:javadoc:admin@/).
+
+:::
+
+Package managers or package-management systems automatically manage packages in a consistent manner. These tools simplify the installation tasks, upgrade process, and deletion operations for users. A package is a minimal unit that a package manager deals with. In Pulsar, packages are organized at the tenant-level and namespace-level to manage Pulsar Functions and Pulsar IO connectors (i.e., source and sink).
+
+## What is a package?
+
+A package is a set of elements that the user would like to reuse in later operations. In Pulsar, a package can be a group of functions, sources, and sinks. You can define a package according to your needs.
+
+The package management system in Pulsar stores the data and metadata of each package (as shown in the table below) and tracks the package versions.
+
+|Metadata|Description|
+|--|--|
+|description|The description of the package.|
+|contact|The contact information of a package. For example, an email address of the developer team.|
+|create_time|The time when the package is created.|
+|modification_time|The time when the package is lastly modified.|
+|properties|A user-defined key/value map to store other information.|
+
+## How to use a package
+
+Packages can efficiently use the same set of functions and IO connectors. For example, you can use the same function, source, and sink in multiple namespaces. The main steps are:
+
+1. Create a package in the package manager by providing the following information: type, tenant, namespace, package name, and version.
+
+ |Component|Description|
+ |-|-|
+ |type|Specify one of the supported package types: function, sink and source.|
+ |tenant|Specify the tenant where you want to create the package.|
+ |namespace|Specify the namespace where you want to create the package.|
+ |name|Specify the complete name of the package, using the format `<tenant>/<namespace>/<package name>`.|
+ |version|Specify the version of the package using the format `MajorVerion.MinorVersion` in numerals.|
+
+ The information you provide creates a URL for a package, in the format `<type>://<tenant>/<namespace>/<package name>/<version>`.
+
+2. Upload the elements to the package, i.e., the functions, sources, and sinks that you want to use across namespaces.
+
+3. Apply permissions to this package from various namespaces.
+
+Now, you can use the elements you defined in the package by calling this package from within the package manager. The package manager locates it by the URL. For example,
+
+```
+sink://public/default/mysql-sink@1.0
+function://my-tenant/my-ns/my-function@0.1
+source://my-tenant/my-ns/mysql-cdc-source@2.3
+```
+
+## Package management in Pulsar
+
+You can use the command line tools, REST API, or the Java client to manage your package resources in Pulsar. More specifically, you can use these tools to [upload](#upload-a-package), [download](#download-a-package), and [delete](#delete-a-package) a package, [get the metadata](#get-the-metadata-of-a-package) and [update the metadata](#update-the-metadata-of-a-package) of a package, [get the versions](#list-all-versions-of-a-package) of a package, and [get all packages of a specific type [...]
+
+To use package management service, ensure that the package management service has been enabled in your cluster by setting the following properties in `broker.conf`.
+
+:::note
+
+Package management service is not enabled by default.
+
+:::
+
+```properties
+enablePackagesManagement=true
+packagesManagementStorageProvider=org.apache.pulsar.packages.management.storage.bookkeeper.BookKeeperPackagesStorageProvider
+packagesReplicas=1
+packagesManagementLedgerRootPath=/ledgers
+```
+
+### Upload a package
+
+You can use the following commands to upload a package.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+bin/pulsar-admin packages upload function://public/default/example@v0.1 --path package-file --description package-description
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v3/packages/upload)
+
+</TabItem>
+<TabItem value="Java">
+
+Upload a package to the package management service synchronously.
+
+```java
+void upload(PackageMetadata metadata, String packageName, String path) throws PulsarAdminException;
+```
+
+Upload a package to the package management service asynchronously.
+
+```java
+CompletableFuture<Void> uploadAsync(PackageMetadata metadata, String packageName, String path);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Download a package
+
+You can use the following commands to download a package.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+bin/pulsar-admin packages download function://public/default/example@v0.1 --path package-file
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v3/packages/download)
+
+</TabItem>
+<TabItem value="Java">
+
+Download a package from the package management service synchronously.
+
+```java
+void download(String packageName, String path) throws PulsarAdminException;
+```
+
+Download a package from the package management service asynchronously.
+
+```java
+CompletableFuture<Void> downloadAsync(String packageName, String path);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Delete a package
+
+You can use the following commands to delete a package.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+The following command deletes a package of version 0.1.
+
+```shell
+bin/pulsar-admin packages delete functions://public/default/example@v0.1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v3/packages/delete)
+
+</TabItem>
+<TabItem value="Java">
+
+Delete a specified package synchronously.
+
+```java
+void delete(String packageName) throws PulsarAdminException;
+```
+
+Delete a specified package asynchronously.
+
+```java
+CompletableFuture<Void> deleteAsync(String packageName);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Get the metadata of a package
+
+You can use the following commands to get the metadata of a package.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+bin/pulsar-admin packages get-metadata function://public/default/test@v1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v3/packages/getMeta)
+
+</TabItem>
+<TabItem value="Java">
+
+Get the metadata of a package synchronously.
+
+```java
+PackageMetadata getMetadata(String packageName) throws PulsarAdminException;
+```
+
+Get the metadata of a package asynchronously.
+
+```java
+CompletableFuture<PackageMetadata> getMetadataAsync(String packageName);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Update the metadata of a package
+
+You can use the following commands to update the metadata of a package.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+bin/pulsar-admin packages update-metadata function://public/default/example@v0.1 --description update-description
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v3/packages/updateMeta)
+
+</TabItem>
+<TabItem value="Java">
+
+Update the metadata of a package synchronously.
+
+```java
+void updateMetadata(String packageName, PackageMetadata metadata) throws PulsarAdminException;
+```
+
+Update the metadata of a package asynchronously.
+
+```java
+CompletableFuture<Void> updateMetadataAsync(String packageName, PackageMetadata metadata);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### List all versions of a package
+
+You can use the following commands to list all versions of a package.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+bin/pulsar-admin packages list-versions type://tenant/namespace/packageName
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v3/packages/listPackageVersion)
+
+</TabItem>
+<TabItem value="Java">
+
+List all versions of a package synchronously.
+
+```java
+List<String> listPackageVersions(String packageName) throws PulsarAdminException;
+```
+
+List all versions of a package asynchronously.
+
+```java
+CompletableFuture<List<String>> listPackageVersionsAsync(String packageName);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### List all packages of a specific type under a namespace
+
+You can use the following commands to list all packages of a specific type under a namespace.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+
+<TabItem value="pulsar-admin">
+
+```shell
+bin/pulsar-admin packages list --type function public/default
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v3/packages/listPackages)
+
+</TabItem>
+<TabItem value="Java">
+
+List all packages of a specific type under a namespace synchronously.
+
+```java
+List<String> listPackages(String type, String namespace) throws PulsarAdminException;
+```
+
+List all packages of a specific type under a namespace asynchronously.
+
+```java
+CompletableFuture<List<String>> listPackagesAsync(String type, String namespace);
+```
+
+</TabItem>
+
+</Tabs>
+````
diff --git a/versioned_docs/version-5.0.x/admin-api-partitioned-topics.md b/versioned_docs/version-5.0.x/admin-api-partitioned-topics.md
new file mode 100644
index 00000000000..da99c440302
--- /dev/null
+++ b/versioned_docs/version-5.0.x/admin-api-partitioned-topics.md
@@ -0,0 +1,7 @@
+---
+id: admin-api-partitioned-topics
+title: Managing partitioned topics
+sidebar_label: "Partitioned topics"
+---
+
+For details of the content, refer to [manage topics](admin-api-topics.md).
\ No newline at end of file
diff --git a/versioned_docs/version-5.0.x/admin-api-permissions.md b/versioned_docs/version-5.0.x/admin-api-permissions.md
new file mode 100644
index 00000000000..84eb858b95f
--- /dev/null
+++ b/versioned_docs/version-5.0.x/admin-api-permissions.md
@@ -0,0 +1,177 @@
+---
+id: admin-api-permissions
+title: Managing permissions
+sidebar_label: "Permissions"
+description: Learn how to manage permissions using Pulsar CLI and admin APIs.
+---
+
+````mdx-code-block
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+````
+
+
+:::tip
+
+ This page only shows **some frequently used operations**.
+
+ - For the latest and complete information about `Pulsar admin`, including commands, flags, descriptions, and more, see [Pulsar admin docs](/reference/#/@pulsar:version_reference@/pulsar-admin/).
+
+ - For the latest and complete information about `REST API`, including parameters, responses, samples, and more, see {@inject: rest:REST:/} API doc.
+
+ - For the latest and complete information about `Java admin API`, including classes, methods, descriptions, and more, see [Java admin API doc](@pulsar:javadoc:admin@/).
+
+:::
+
+Pulsar allows you to grant namespace-level or topic-level permission to users.
+
+- If you grant namespace-level permission to a user, then the user can access all the topics under the namespace.
+
+- If you grant topic-level permission to a user, then the user can access only the topic.
+
+The chapters below demonstrate how to grant namespace-level permissions to users. For how to grant topic-level permissions to users, see [manage topics](admin-api-topics.md#grant-permission).
+
+## Grant permissions
+
+You can grant permissions to specific roles for lists of operations such as `produce` and `consume`.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+Use the [`grant-permission`](/reference/#/@pulsar:version_reference@/pulsar-admin/namespaces?id=grant-permission) subcommand and specify a namespace, actions using the `--actions` flag, and a role using the `--role` flag:
+
+```shell
+pulsar-admin namespaces grant-permission test-tenant/namespace1 \
+ --actions produce,consume \
+ --role admin10
+```
+
+Wildcard authorization can be performed when `authorizationAllowWildcardsMatching` is set to `true` in `broker.conf`.
+
+**Example**
+
+```shell
+pulsar-admin namespaces grant-permission test-tenant/namespace1 \
+ --actions produce,consume \
+ --role 'my.role.*'
+```
+
+Then, roles `my.role.1`, `my.role.2`, `my.role.foo`, `my.role.bar`, etc. can produce and consume.
+
+```shell
+pulsar-admin namespaces grant-permission test-tenant/namespace1 \
+ --actions produce,consume \
+ --role '*.role.my'
+```
+
+Then, roles `1.role.my`, `2.role.my`, `foo.role.my`, `bar.role.my`, etc. can produce and consume.
+
+:::note
+
+A wildcard matching works at **the beginning or end of the role name only**.
+
+:::
+
+**Example**
+
+```shell
+pulsar-admin namespaces grant-permission test-tenant/namespace1 \
+ --actions produce,consume \
+ --role 'my.*.role'
+```
+
+In this case, only the role `my.*.role` has permissions.
+Roles `my.1.role`, `my.2.role`, `my.foo.role`, `my.bar.role`, etc. **cannot** produce and consume.
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/grantPermissionOnNamespace)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.namespaces().grantPermissionOnNamespace(namespace, role, getAuthActions(actions));
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+## Get permissions
+
+You can see which permissions have been granted to which roles in a namespace.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+Use the [`permissions`](/reference/#/@pulsar:version_reference@/pulsar-admin/namespaces?id=grant-permission) subcommand and specify a namespace:
+
+```shell
+pulsar-admin namespaces permissions test-tenant/namespace1
+```
+
+Example output:
+
+```
+my.role.* [produce, consume]
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getPermissions)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.namespaces().getPermissions(namespace);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+## Revoke permissions
+
+You can revoke permissions from specific roles, which means that those roles will no longer have access to the specified namespace.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+Use the [`revoke-permission`](/reference/#/@pulsar:version_reference@/pulsar-admin/namespaces?id=revoke-permission) subcommand and specify a namespace and a role using the `--role` flag:
+
+```shell
+pulsar-admin namespaces revoke-permission test-tenant/namespace1 \
+ --role admin10
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/revokePermissionsOnNamespace)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.namespaces().revokePermissionsOnNamespace(namespace, role);
+```
+
+</TabItem>
+
+</Tabs>
+````
diff --git a/versioned_docs/version-5.0.x/admin-api-persistent-topics.md b/versioned_docs/version-5.0.x/admin-api-persistent-topics.md
new file mode 100644
index 00000000000..206304005da
--- /dev/null
+++ b/versioned_docs/version-5.0.x/admin-api-persistent-topics.md
@@ -0,0 +1,7 @@
+---
+id: admin-api-persistent-topics
+title: Managing persistent topics
+sidebar_label: "Persistent topics"
+---
+
+For details of the content, refer to [manage topics](admin-api-topics.md).
\ No newline at end of file
diff --git a/versioned_docs/version-5.0.x/admin-api-scalable-topics.md b/versioned_docs/version-5.0.x/admin-api-scalable-topics.md
new file mode 100644
index 00000000000..c1cf58a0434
--- /dev/null
+++ b/versioned_docs/version-5.0.x/admin-api-scalable-topics.md
@@ -0,0 +1,210 @@
+---
+id: admin-api-scalable-topics
+title: Manage scalable topics
+sidebar_label: "Administration"
+description: Create, inspect, migrate, and manage scalable topics with pulsar-admin, the REST API, or the Java admin client.
+---
+
+:::note
+
+For the concepts behind this feature, see [Scalable topics](concepts-scalable-topics.md).
+
+:::
+
+This page covers administering scalable topics. To **produce and consume**, use a client with [V5 API support](concepts-scalable-topics.md#requirements); this page is about creating and operating the topics themselves.
+
+Every operation is available three ways: the `pulsar-admin scalable-topics` CLI, the REST API under `/admin/v2/scalable`, and the Java admin client (`PulsarAdmin.scalableTopics()`). The examples below lead with the CLI; the [REST API reference](#rest-api-reference) lists every endpoint.
+
+In the commands below, a topic is identified by its `tenant/namespace/topic` name (without a URL scheme).
+
+## Create a scalable topic
+
+A scalable topic is created with an initial number of segments. Start small -- one segment is the default -- and let [auto split/merge](concepts-scalable-topics.md#how-it-works) grow it to fit the load.
+
+```shell
+bin/pulsar-admin scalable-topics create my-tenant/my-namespace/my-topic --segments 1
+```
+
+| Option | Description | Default |
+|--------|-------------|---------|
+| `-s`, `--segments` | Number of initial segments | `1` |
+| `-p`, `--property` | A `key=value` property; repeat for multiple | -- |
+
+Java admin client:
+
+```java
+admin.scalableTopics().createScalableTopic("my-tenant/my-namespace/my-topic", 1);
+```
+
+## List scalable topics
+
+List every scalable topic in a namespace:
+
+```shell
+bin/pulsar-admin scalable-topics list my-tenant/my-namespace
+```
+
+Filter to topics carrying specific properties (repeat `-p` to AND multiple filters):
+
+```shell
+bin/pulsar-admin scalable-topics list my-tenant/my-namespace -p team=ingest -p tier=gold
+```
+
+## Inspect a scalable topic
+
+Get the topic metadata -- the segment DAG, including each segment's hash range and state:
+
+```shell
+bin/pulsar-admin scalable-topics get-metadata my-tenant/my-namespace/my-topic
+```
+
+Get aggregated runtime stats:
+
+```shell
+bin/pulsar-admin scalable-topics stats my-tenant/my-namespace/my-topic
+```
+
+## Manage subscriptions
+
+Scalable-topic subscriptions span every segment in the DAG. The admin commands operate on the subscription as a whole.
+
+Reset a subscription to a point in the past (the offset is relative to now -- accepts units such as `30m`, `1h`, `5d`):
+
+```shell
+bin/pulsar-admin scalable-topics seek my-tenant/my-namespace/my-topic \
+ --subscription my-sub --time 1h
+```
+
+Skip all undelivered messages on a subscription, across every segment:
+
+```shell
+bin/pulsar-admin scalable-topics clear-backlog my-tenant/my-namespace/my-topic \
+ --subscription my-sub
+```
+
+## Split and merge segments
+
+Splitting a hot segment and merging cold adjacent segments normally happens **automatically** (see [auto split/merge](concepts-scalable-topics.md#how-it-works)). The commands below let you trigger them manually -- for testing, or to pre-scale ahead of a known traffic event.
+
+Split one segment into two halves of its hash range:
+
+```shell
+bin/pulsar-admin scalable-topics split-segment my-tenant/my-namespace/my-topic --segment-id 3
+```
+
+Merge two adjacent segments back into one:
+
+```shell
+bin/pulsar-admin scalable-topics merge-segments my-tenant/my-namespace/my-topic \
+ --segment-id-1 3 --segment-id-2 4
+```
+
+Segment IDs come from `get-metadata`. Merging requires the two segments to own adjacent hash ranges.
+
+## Configure auto split/merge
+
+Auto split/merge is **on by default**: each topic's controller splits any segment whose load crosses the split thresholds and merges adjacent segments that stay cold below the merge thresholds. It is configured at three levels, and the most specific value wins **per setting**:
+
+1. **Broker defaults** in `broker.conf` (cluster-wide).
+2. **Per-namespace override**.
+3. **Per-topic override**.
+
+An override only sets the fields it changes; unset fields inherit from the level above.
+
+### Broker defaults (`broker.conf`)
+
+| Setting | Description | Default |
+|---------|-------------|---------|
+| `scalableTopicAutoScaleEnabled` | Master switch for auto split/merge. When `false`, segments change only via manual `split-segment` / `merge-segments`. | `true` |
+| `scalableTopicMaxSegments` | Hard ceiling on active segments; splits stop once reached. | `64` |
+| `scalableTopicMinSegments` | Hard floor on active segments; merges stop once reached. | `1` |
+| `scalableTopicMaxDagDepth` | Maximum merges in a segment's lineage; bounds split/merge flip-flopping (limits merges only -- splits are unaffected). | `10` |
+| `scalableTopicSplitCooldownSeconds` | Minimum time between automatic splits on a topic (short -- only coalesces a burst of near-simultaneous triggers). | `60` |
+| `scalableTopicMergeCooldownSeconds` | Minimum time between automatic merges on a topic. | `300` |
+| `scalableTopicMergeWindowSeconds` | How long a segment must stay continuously below every merge threshold before it becomes merge-eligible. | `300` |
+| `scalableTopicSplitMsgRateInThreshold` | Inbound messages/second above which a segment is split. | `10000` |
+| `scalableTopicSplitBytesRateInThreshold` | Inbound bytes/second above which a segment is split. | `50000000` (50 MB/s) |
+| `scalableTopicSplitMsgRateOutThreshold` | Outbound (dispatched) messages/second above which a segment is split. | `50000` |
+| `scalableTopicSplitBytesRateOutThreshold` | Outbound bytes/second above which a segment is split. | `250000000` (250 MB/s) |
+| `scalableTopicMergeMsgRateInThreshold` | Inbound messages/second below which a segment counts as cold for merging. | `1000` |
+| `scalableTopicMergeBytesRateInThreshold` | Inbound bytes/second below which a segment counts as cold. | `5000000` (5 MB/s) |
+| `scalableTopicMergeMsgRateOutThreshold` | Outbound messages/second below which a segment counts as cold. | `5000` |
+| `scalableTopicMergeBytesRateOutThreshold` | Outbound bytes/second below which a segment counts as cold. | `25000000` (25 MB/s) |
+| `scalableTopicAutoScaleIntervalSeconds` | Cadence of the controller's periodic traffic-driven evaluation. Consumer-count changes are handled immediately, independent of this interval. | `60` |
+| `scalableTopicLoadReportIntervalSeconds` | How often a segment-owning broker samples segment load for auto-scaling. | `10` |
+| `scalableTopicLoadReportRateChangeThreshold` | Minimum relative change in a segment's rate (`0.25` = 25%) since the last report that triggers a new load record; bounds metadata write volume. | `0.25` |
+
+:::tip
+
+Split thresholds sit well above the corresponding merge thresholds on purpose -- the gap between them is the hysteresis that stops a just-split segment from immediately re-merging. Preserve that ordering when you tune them.
+
+Most of these settings are dynamic: apply them at runtime with `pulsar-admin brokers update-dynamic-config` without restarting. The two read only at broker startup are `scalableTopicAutoScaleIntervalSeconds` and `scalableTopicLoadReportIntervalSeconds`.
+
+:::
+
+### Per-namespace and per-topic overrides
+
+Both override levels use the same fields as the broker settings (each optional; unset means inherit): `enabled`, `maxSegments`, `minSegments`, `maxDagDepth`, `splitCooldownSeconds`, `mergeCooldownSeconds`, `mergeWindowSeconds`, and the eight `split*`/`merge*` rate thresholds.
+
+Overrides are set through the Java admin client or REST -- there is no `pulsar-admin` subcommand for them yet:
+
+```java
+AutoScalePolicyOverride override = AutoScalePolicyOverride.builder()
+ .maxSegments(128)
+ .splitMsgRateInThreshold(20_000.0)
+ .build();
+
+// Namespace level -- applies to every scalable topic in the namespace
+admin.namespaces().setScalableTopicAutoScalePolicy("my-tenant/my-namespace", override);
+
+// Topic level -- narrowest scope, wins over namespace and broker
+admin.scalableTopics().setAutoScalePolicy("my-tenant/my-namespace/my-topic", override);
+```
+
+Read or clear an override with the matching `getScalableTopicAutoScalePolicy` / `removeScalableTopicAutoScalePolicy` (namespace) and `getAutoScalePolicy` / `removeAutoScalePolicy` (topic) methods.
+
+### Disable auto-scaling
+
+To run a topic with manual split/merge only, set `scalableTopicAutoScaleEnabled=false` cluster-wide, or apply an override with `enabled=false` at the namespace or topic level. The controller then leaves the layout untouched and you drive it with `split-segment` / `merge-segments`.
+
+## Migrate a regular topic
+
+An existing partitioned or non-partitioned topic can be migrated in place to a scalable topic, with no data copy:
+
+```shell
+bin/pulsar-admin scalable-topics migrate my-tenant/my-namespace/my-topic
+```
+
+The migration is rejected if legacy (non-V5) clients are still connected, unless you pass `--force`. Migration is **one-way** -- a scalable topic cannot be converted back. A full walkthrough, including the recommended sequence for upgrading clients first, is covered in the migration guide.
+
+## Delete a scalable topic
+
+```shell
+bin/pulsar-admin scalable-topics delete my-tenant/my-namespace/my-topic
+```
+
+Pass `--force` to delete even when the topic has active subscriptions.
+
+## REST API reference
+
+[OpenAPI documentation](pathname:///admin-rest-api/?version=@pulsar:rest_api_version@#tag/scalable-topic)
+
+All endpoints are under `/admin/v2/scalable` and take `tenant`, `namespace`, and (except for list) `topic` as path parameters.
+
+| Method & path | Operation |
+|---------------|-----------|
+| `GET /{tenant}/{namespace}` | List scalable topics in a namespace |
+| `PUT /{tenant}/{namespace}/{topic}` | Create a scalable topic |
+| `GET /{tenant}/{namespace}/{topic}` | Get topic metadata (segment DAG) |
+| `GET /{tenant}/{namespace}/{topic}/stats` | Get aggregated stats |
+| `DELETE /{tenant}/{namespace}/{topic}` | Delete a scalable topic |
+| `POST /{tenant}/{namespace}/{topic}/migrate` | Migrate a regular topic to scalable |
+| `POST /{tenant}/{namespace}/{topic}/split/{segmentId}` | Split a segment |
+| `POST /{tenant}/{namespace}/{topic}/merge/{segmentId1}/{segmentId2}` | Merge two adjacent segments |
+| `GET /{tenant}/{namespace}/{topic}/autoScalePolicy` | Get the topic's auto split/merge override |
+| `POST /{tenant}/{namespace}/{topic}/autoScalePolicy` | Set the topic's auto split/merge override |
+| `DELETE /{tenant}/{namespace}/{topic}/autoScalePolicy` | Remove the topic's auto split/merge override |
+| `PUT /{tenant}/{namespace}/{topic}/subscriptions/{subscription}` | Create a subscription |
+| `DELETE /{tenant}/{namespace}/{topic}/subscriptions/{subscription}` | Delete a subscription |
+| `POST /{tenant}/{namespace}/{topic}/subscriptions/{subscription}/seek` | Seek a subscription to a timestamp |
+| `POST /{tenant}/{namespace}/{topic}/subscriptions/{subscription}/skip-all` | Clear a subscription's backlog |
diff --git a/versioned_docs/version-5.0.x/admin-api-schemas.md b/versioned_docs/version-5.0.x/admin-api-schemas.md
new file mode 100644
index 00000000000..228ad086daa
--- /dev/null
+++ b/versioned_docs/version-5.0.x/admin-api-schemas.md
@@ -0,0 +1,678 @@
+---
+id: admin-api-schemas
+title: Manage Schemas
+sidebar_label: "Schemas"
+description: Learn how to manage schemas using Pulsar CLI and admin APIs.
+---
+
+
+````mdx-code-block
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+````
+
+:::tip
+
+This page only shows **some frequently used operations**.
+
+- For the latest and complete information about `Pulsar admin`, including commands, flags, descriptions, and more, see [Pulsar admin docs](/reference/#/@pulsar:version_reference@/pulsar-admin/).
+
+- For the latest and complete information about `REST API`, including parameters, responses, samples, and more, see {@inject: rest:REST:/} API doc.
+
+- For the latest and complete information about `Java admin API`, including classes, methods, descriptions, and more, see [Java admin API doc](@pulsar:javadoc:admin@/).
+
+:::
+
+## Manage schema
+
+### Upload a schema
+
+To upload (register) a new schema for a topic, you can use one of the following methods.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="Admin CLI"
+ values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+
+<TabItem value="Admin CLI">
+
+Use the `upload` subcommand.
+
+```bash
+pulsar-admin schemas upload --filename <schema-definition-file> <topic-name>
+```
+
+The `schema-definition-file` is in JSON format.
+
+```json
+{
+ "type": "<schema-type>",
+ "schema": "<an-utf8-encoded-string-of-schema-definition-data>",
+ "properties": {} // the properties associated with the schema
+}
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+Send a `POST` request to the endpoint documented here: [](swagger:/admin/v2/postSchema)
+
+Below is an example with CURL with a payload stored on the `schema.json` file, Pulsar broker running on `localhost` and the topic `my-tenant/my-ns/my-topic`:
+
+```bash
+curl -X POST -H 'Content-Type: application/json' -d @schema.json http://localhost:8080/admin/v2/schemas/my-tenant/my-ns/my-topic/schema
+```
+
+The post payload is in JSON format.
+
+```json
+{
+ "type": "<schema-type>",
+ "schema": "<an-utf8-encoded-string-of-schema-definition-data>",
+ "properties": {} // the properties associated with the schema
+}
+```
+
+</TabItem>
+<TabItem value="Java">
+
+The method on `PulsarAdmin` client is:
+```java
+void createSchema(String topic, PostSchemaPayload schemaPayload)
+```
+
+Here is an example of `PostSchemaPayload`:
+
+```java
+PulsarAdmin admin = …;
+
+PostSchemaPayload payload = new PostSchemaPayload();
+payload.setType("INT8");
+payload.setSchema("");
+
+admin.createSchema("my-tenant/my-ns/my-topic", payload);
+```
+
+If the schema is a **primitive** schema, the `schema` field must be blank.
+If the schema is a **struct** schema, this field must be a JSON string of the Avro schema definition.
+
+</TabItem>
+</Tabs>
+````
+
+The payload includes the following fields:
+
+| Field | Description |
+|--------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `type` | <li>Allowed values for primitive-type schemas are listed on the following page: [Primitive types](schema-understand.md#primitive-type)</li><li>Allowed values for struct-type schemas are **AVRO**, **PROTOBUF**, **PROTOBUF_NATIVE** and **JSON**.</li> |
+| `schema` | The schema definition data, which is encoded in UTF 8 charset. <li>If the schema type is **AVRO**, **PROTOBUF** or **JSON** schema, this field should be an <a href="https://avro.apache.org/docs/1.11.1/specification/" target="blank">Avro schema definition</a> in JSON format.</li><li>If the schema type is **PROTOBUF_NATIVE** schema, this field should contain a Protobuf descriptor. </li><li>Otherwise, this field should be blank.</li> |
+| `properties` | The additional properties associated with the schema. |
+
+The following is an example for a JSON schema.
+
+**Example**
+
+```json
+{
+ "type": "JSON",
+ "schema": "{\"type\":\"record\",\"name\":\"User\",\"namespace\":\"com.foo\",\"fields\":[{\"name\":\"file1\",\"type\":[\"null\",\"string\"],\"default\":null},{\"name\":\"file2\",\"type\":[\"null\",\"string\"],\"default\":null},{\"name\":\"file3\",\"type\":[\"string\",\"null\"],\"default\":\"dfdf\"}]}",
+ "properties": {}
+}
+```
+
+### Get the latest schema
+
+To get the latest schema for a topic, you can use one of the following methods.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="Admin CLI"
+ values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+
+<TabItem value="Admin CLI">
+
+Use the `get` subcommand.
+
+```bash
+pulsar-admin schemas get <topic-name>
+```
+
+Example output:
+
+```json
+{
+ "version": 0,
+ "type": "String",
+ "timestamp": 0,
+ "data": "string",
+ "properties": {
+ "property1": "string",
+ "property2": "string"
+ }
+}
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+Send a `GET` request to this endpoint: [](swagger:/admin/v2/getSchema)
+
+Here is an example of a response, which is returned in JSON format.
+
+```json
+{
+ "version": "<the-version-number-of-the-schema>",
+ "type": "<the-schema-type>",
+ "timestamp": "<the-creation-timestamp-of-the-version-of-the-schema>",
+ "data": "<an-utf8-encoded-string-of-schema-definition-data>",
+ "properties": {} // the properties associated with the schema
+}
+```
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+SchemaInfo createSchema(String topic)
+```
+
+Here is an example of `SchemaInfo`:
+
+```java
+PulsarAdmin admin = …;
+
+SchemaInfo si = admin.getSchema("my-tenant/my-ns/my-topic");
+```
+
+</TabItem>
+</Tabs>
+````
+
+### Get a specific schema
+
+To get a specific version of a schema, you can use one of the following methods.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="Admin CLI"
+ values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+
+<TabItem value="Admin CLI">
+
+Use the `get` subcommand.
+
+```bash
+pulsar-admin schemas get <topic-name> --version <version>
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+Send a `GET` request to a schema endpoint: [](swagger:/admin/v2/getSchema_1)
+
+Here is an example of a response, which is returned in JSON format.
+
+```json
+{
+ "version": "<the-version-number-of-the-schema>",
+ "type": "<the-schema-type>",
+ "timestamp": "<the-creation-timestamp-of-the-version-of-the-schema>",
+ "data": "<an-utf8-encoded-string-of-schema-definition-data>",
+ "properties": {} // the properties associated with the schema
+}
+```
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+SchemaInfo createSchema(String topic, long version)
+```
+
+Here is an example of `SchemaInfo`:
+
+```java
+PulsarAdmin admin = …;
+
+SchemaInfo si = admin.getSchema("my-tenant/my-ns/my-topic", 1L);
+```
+
+</TabItem>
+</Tabs>
+````
+
+### Extract a schema
+
+To extract (provide) a schema via a topic, use the following method.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="Admin CLI"
+ values={[{"label":"Admin CLI","value":"Admin CLI"}]}>
+
+<TabItem value="Admin CLI">
+
+Use the `extract` subcommand.
+
+```bash
+pulsar-admin schemas extract --classname <class-name> --jar <absolute-jar-path> --type <type-name>
+```
+
+</TabItem>
+</Tabs>
+````
+
+### Delete a schema
+
+:::note
+
+In any case, the `delete` action deletes **all versions** of a schema registered for a topic.
+
+:::
+
+To delete a schema for a topic, you can use one of the following methods.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="Admin CLI"
+ values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+
+<TabItem value="Admin CLI">
+
+Use the `delete` subcommand.
+
+```bash
+pulsar-admin schemas delete <topic-name>
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+Send a `DELETE` request to a schema endpoint: [](swagger:/admin/v2/deleteSchema)
+
+Here is an example of a response returned in JSON format.
+
+```json
+{
+ "version": "<the-latest-version-number-of-the-schema>",
+}
+```
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+void deleteSchema(String topic)
+```
+
+Here is an example of deleting a schema.
+
+```java
+PulsarAdmin admin = …;
+
+admin.deleteSchema("my-tenant/my-ns/my-topic");
+```
+
+</TabItem>
+</Tabs>
+````
+
+## Manage schema AutoUpdate
+
+### Enable schema AutoUpdate
+
+To enable/enforce schema auto-update at the namespace level, you can use one of the following methods.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="Admin CLI"
+ values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+
+<TabItem value="Admin CLI">
+
+Use the `set-is-allow-auto-update-schema` subcommand.
+
+```bash
+bin/pulsar-admin namespaces set-is-allow-auto-update-schema --enable tenant/namespace
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+Send a `POST` request to a namespace endpoint: [](swagger:/admin/v2/setIsAllowAutoUpdateSchema)
+
+The post payload is in JSON format.
+
+```json
+{
+"isAllowAutoUpdateSchema": "true"
+}
+```
+
+</TabItem>
+<TabItem value="Java">
+
+Here is an example to enable schema auto-update for a tenant/namespace.
+
+```java
+admin.namespaces().setIsAllowAutoUpdateSchema("my-namspace", true);
+```
+
+</TabItem>
+</Tabs>
+````
+
+### Disable schema AutoUpdate
+
+:::note
+
+When schema auto-update is disabled, you can only [register a new schema](#upload-a-schema).
+
+:::
+
+To disable schema auto-update at the **namespace** level, you can use one of the following commands.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="Admin CLI"
+ values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+
+<TabItem value="Admin CLI">
+
+Use the `set-is-allow-auto-update-schema` subcommand.
+
+```bash
+bin/pulsar-admin namespaces set-is-allow-auto-update-schema --disable tenant/namespace
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+Send a `POST` request to a namespace endpoint: [](swagger:/admin/v2/setIsAllowAutoUpdateSchema)
+
+The post payload is in JSON format.
+
+```json
+{
+"isAllowAutoUpdateSchema": "false"
+}
+```
+
+</TabItem>
+<TabItem value="Java">
+
+Here is an example to enable schema auto-unpdate of a tenant/namespace.
+
+```java
+admin.namespaces().setIsAllowAutoUpdateSchema("my-namspace", false);
+```
+
+</TabItem>
+</Tabs>
+````
+
+## Manage schema validation enforcement
+
+### Enable schema validation enforcement
+
+To enforce schema validation enforcement at the **cluster** level, you can configure `isSchemaValidationEnforced` to `true` in the `conf/broker.conf` file.
+
+To enable schema validation enforcement at the **namespace** level, you can use one of the following commands.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="Admin CLI"
+ values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+
+<TabItem value="Admin CLI">
+
+Use the `set-schema-validation-enforce` subcommand.
+
+```bash
+bin/pulsar-admin namespaces set-schema-validation-enforce --enable tenant/namespace
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+Send a `POST` request to a namespace endpoint: [](swagger:/admin/v2/setSchemaValidationEnforced)
+
+The post payload is in JSON format.
+
+```json
+{
+"schemaValidationEnforced": "true"
+}
+```
+
+</TabItem>
+<TabItem value="Java">
+
+Here is an example to enable schema validation enforcement for a tenant/namespace.
+
+```java
+admin.namespaces().setSchemaValidationEnforced("my-namspace", true);
+```
+
+</TabItem>
+</Tabs>
+````
+
+### Disable schema validation enforcement
+
+To disable schema validation enforcement at the **namespace** level, you can use one of the following commands.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="Admin CLI"
+ values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+
+<TabItem value="Admin CLI">
+
+Use the `set-schema-validation-enforce` subcommand.
+
+```bash
+bin/pulsar-admin namespaces set-schema-validation-enforce --disable tenant/namespace
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+Send a `POST` request to a namespace endpoint: [](swagger:/admin/v2/setSchemaValidationEnforced)
+
+The post payload is in JSON format.
+
+```json
+{
+"schemaValidationEnforced": "false"
+}
+```
+
+</TabItem>
+<TabItem value="Java">
+
+Here is an example to enable schema validation enforcement for a tenant/namespace.
+
+```java
+admin.namespaces().setSchemaValidationEnforced("my-namspace", false);
+```
+
+</TabItem>
+</Tabs>
+````
+
+## Manage schema compatibility strategy
+
+The [schema compatibility check strategy](schema-understand.md#schema-compatibility-check-strategy) configured at different levels has priority: topic level > namespace level > cluster level. In other words:
+ * If you set the strategy at both topic and namespace levels, the topic-level strategy is used.
+ * If you set the strategy at both namespace and cluster levels, the namespace-level strategy is used.
+
+### Set schema compatibility strategy
+
+#### Set topic-level schema compatibility strategy
+
+To set a schema compatibility check strategy at the topic level, you can use one of the following methods.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="Admin CLI"
+ values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+
+<TabItem value="Admin CLI">
+
+Use the [`pulsar-admin topicPolicies set-schema-compatibility-strategy`](/reference/#/@pulsar:version_reference@/pulsar-admin/topicPolicies?id=set-schema-compatibility-strategy) command.
+
+```shell
+pulsar-admin topicPolicies set-schema-compatibility-strategy <strategy> <topicName>
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+Send a `PUT` request to this endpoint: [](swagger:/admin/v2/setSchemaCompatibilityStrategy_1)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+void setSchemaCompatibilityStrategy(String topic, SchemaCompatibilityStrategy strategy)
+```
+
+Here is an example of setting a schema compatibility check strategy at the topic level.
+
+```java
+PulsarAdmin admin = …;
+
+admin.topicPolicies().setSchemaCompatibilityStrategy("my-tenant/my-ns/my-topic", SchemaCompatibilityStrategy.ALWAYS_INCOMPATIBLE);
+```
+
+</TabItem>
+</Tabs>
+````
+
+#### Set namespace-level schema compatibility strategy
+
+To set schema compatibility check strategy at the namespace level, you can use one of the following methods.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="Admin CLI"
+ values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+
+<TabItem value="Admin CLI">
+
+Use the [`pulsar-admin namespaces set-schema-compatibility-strategy`](/reference/#/@pulsar:version_reference@/pulsar-admin/namespaces?id=set-schema-compatibility-strategy) command.
+
+```shell
+pulsar-admin namespaces set-schema-compatibility-strategy options
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+Send a `PUT` request to this endpoint: [](swagger:/admin/v2/setSchemaCompatibilityStrategy)
+
+</TabItem>
+<TabItem value="Java">
+
+Use the [`setSchemaCompatibilityStrategy`](@pulsar:javadoc:admin@/) method.
+
+```java
+admin.namespaces().setSchemaCompatibilityStrategy("test", SchemaCompatibilityStrategy.FULL);
+```
+
+</TabItem>
+</Tabs>
+````
+
+#### Set cluster-level schema compatibility strategy
+
+To set schema compatibility check strategy at the **cluster** level, set `schemaCompatibilityStrategy` in the `conf/broker.conf` file.
+
+The following is an example:
+
+```conf
+schemaCompatibilityStrategy=ALWAYS_INCOMPATIBLE
+```
+
+### Get schema compatibility strategy
+
+#### Get topic-level schema compatibility strategy
+
+To get the topic-level schema compatibility check strategy, you can use one of the following methods.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="Admin CLI"
+ values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+
+<TabItem value="Admin CLI">
+
+Use the [`pulsar-admin topicPolicies get-schema-compatibility-strategy`](/reference/#/@pulsar:version_reference@/pulsar-admin/topicPolicies?id=get-schema-compatibility-strategy) command.
+
+```shell
+pulsar-admin topicPolicies get-schema-compatibility-strategy <topicName>
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+Send a `GET` request to this endpoint: [](swagger:/admin/v2/getSchemaCompatibilityStrategy_1)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+SchemaCompatibilityStrategy getSchemaCompatibilityStrategy(String topic, boolean applied)
+```
+
+Here is an example of getting the topic-level schema compatibility check strategy.
+
+```java
+PulsarAdmin admin = …;
+
+// get the current applied schema compatibility strategy
+admin.topicPolicies().getSchemaCompatibilityStrategy("my-tenant/my-ns/my-topic", true);
+
+// only get the schema compatibility strategy from topic policies
+admin.topicPolicies().getSchemaCompatibilityStrategy("my-tenant/my-ns/my-topic", false);
+```
+
+</TabItem>
+</Tabs>
+````
+
+#### Get namespace-level schema compatibility strategy
+
+You can get schema compatibility check strategy at namespace level using one of the following methods.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="Admin CLI"
+ values={[{"label":"Admin CLI","value":"Admin CLI"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+
+<TabItem value="Admin CLI">
+
+Use the [`pulsar-admin namespaces get-schema-compatibility-strategy`](/reference/#/@pulsar:version_reference@/pulsar-admin/namespaces?id=get-schema-compatibility-strategy) command.
+
+```shell
+pulsar-admin namespaces get-schema-compatibility-strategy options
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+Send a `GET` request to this endpoint: [](swagger:/admin/v2/getSchemaCompatibilityStrategy)
+
+</TabItem>
+<TabItem value="Java">
+
+Use the [`getSchemaCompatibilityStrategy`](@pulsar:javadoc:admin@/) method.
+
+```java
+admin.namespaces().getSchemaCompatibilityStrategy("test", SchemaCompatibilityStrategy.FULL);
+```
+
+</TabItem>
+</Tabs>
+````
diff --git a/versioned_docs/version-5.0.x/admin-api-tenants.md b/versioned_docs/version-5.0.x/admin-api-tenants.md
new file mode 100644
index 00000000000..7be6811223d
--- /dev/null
+++ b/versioned_docs/version-5.0.x/admin-api-tenants.md
@@ -0,0 +1,234 @@
+---
+id: admin-api-tenants
+title: Managing Tenants
+sidebar_label: "Tenants"
+description: Learn how to manage tenants using Pulsar CLI and admin APIs.
+---
+
+````mdx-code-block
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+````
+
+
+:::tip
+
+ This page only shows **some frequently used operations**.
+
+ - For the latest and complete information about `Pulsar admin`, including commands, flags, descriptions, and more, see [Pulsar admin docs](/reference/#/@pulsar:version_reference@/pulsar-admin/).
+
+ - For the latest and complete information about `REST API`, including parameters, responses, samples, and more, see {@inject: rest:REST:/} API doc.
+
+ - For the latest and complete information about `Java admin API`, including classes, methods, descriptions, and more, see [Java admin API doc](@pulsar:javadoc:admin@/).
+
+:::
+
+Tenants, like namespaces, can be managed using the [admin API](admin-api-overview.md). There are currently two configurable aspects of tenants:
+
+* Admin roles
+* Allowed clusters
+
+## Tenant resources
+
+### List
+
+You can list all of the tenants associated with an [instance](reference-terminology.md#instance).
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+Use the [`list`](/reference/#/@pulsar:version_reference@/pulsar-admin/tenants?id=list) subcommand.
+
+```shell
+pulsar-admin tenants list
+```
+
+Output:
+
+```
+my-tenant-1
+my-tenant-2
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getTenants)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.tenants().getTenants();
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Create
+
+You can create a new tenant.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+Use the [`create`](/reference/#/@pulsar:version_reference@/pulsar-admin/tenants?id=create) subcommand:
+
+```shell
+pulsar-admin tenants create my-tenant
+```
+
+When creating a tenant, you can optionally assign admin roles using the `-r`/`--admin-roles`
+flag, and clusters using the `-c`/`--allowed-clusters` flag. You can specify multiple values
+as a comma-separated list. Here are some examples:
+
+```shell
+pulsar-admin tenants create my-tenant \
+ --admin-roles role1,role2,role3 \
+ --allowed-clusters cluster1
+```
+
+```shell
+pulsar-admin tenants create my-tenant \
+ -r role1 \
+ -c cluster1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/createTenant)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.tenants().createTenant(tenantName, tenantInfo);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Get configuration
+
+You can fetch the [configuration](reference-configuration.md) for an existing tenant at any time.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+Use the [`get`](/reference/#/@pulsar:version_reference@/pulsar-admin/tenants?id=get) subcommand and specify the name of the tenant. Here's an example:
+
+```shell
+pulsar-admin tenants get my-tenant
+```
+
+```json
+{
+ "adminRoles": [
+ "admin1",
+ "admin2"
+ ],
+ "allowedClusters": [
+ "cl1",
+ "cl2"
+ ]
+}
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getTenantAdmin)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.tenants().getTenantInfo(tenantName);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Delete
+
+Tenants can be deleted from a Pulsar [instance](reference-terminology.md#instance).
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+Use the [`delete`](/reference/#/@pulsar:version_reference@/pulsar-admin/tenants?id=delete) subcommand and specify the name of the tenant.
+
+```shell
+pulsar-admin tenants delete my-tenant
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/deleteTenant)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.Tenants().deleteTenant(tenantName);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Update
+
+You can update a tenant's configuration.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+Use the [`update`](/reference/#/@pulsar:version_reference@/pulsar-admin/tenants?id=update) subcommand.
+
+```shell
+pulsar-admin tenants update my-tenant \
+ --admin-roles role1,role2 \
+ --allowed-clusters cluster1,cluster2
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/updateTenant)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.tenants().updateTenant(tenantName, tenantInfo);
+```
+
+</TabItem>
+
+</Tabs>
+````
diff --git a/versioned_docs/version-5.0.x/admin-api-tools.md b/versioned_docs/version-5.0.x/admin-api-tools.md
new file mode 100644
index 00000000000..de8eec6fab1
--- /dev/null
+++ b/versioned_docs/version-5.0.x/admin-api-tools.md
@@ -0,0 +1,49 @@
+---
+id: admin-api-tools
+title: Pulsar admin interfaces - Tools
+sidebar_label: "Tools"
+description: Get a comprehensive understanding of concepts and difference of Pulsar admin CLI and Pulsar admin APIs.
+---
+
+````mdx-code-block
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+````
+
+You can manage Pulsar entities through the Pulsar admin layer via one of the following tools:
+
+- Pulsar admin APIs
+
+ - [Java admin API](@pulsar:javadoc:admin@/): It’s a programmable interface written in Java.
+
+ - Go admin API (coming soon)
+
+ - [REST API](pathname:///admin-rest-api/?version=@pulsar:rest_api_version@): HTTP calls, which are made against the admin APIs provided by brokers. In addition, both the Java admin API and pulsar-admin CLI use the REST API.
+
+- [pulsar-admin CLI](/reference/#/@pulsar:version_reference@/pulsar-admin/): It’s a command-line tool and is available in the bin folder of your Pulsar installation.
+
+
+
+Here are the explanations and comparisons of these tools.
+
+Category|Tools|When to use|Considerations
+|---|---|---|---
+Pulsar admin APIs|[Java admin API](@pulsar:javadoc:admin@/)| - If you want to implement your own admin interface client using Java and manage clusters. <br/><br/> - If you want to manage resources programmatically rather than relying on external tools inside of unit tests.<br/><br/> - If you want to use admin APIs in Java applications.| <br/><br/> - This method is only available in Java. <br/><br/> - It needs more development work if you want to use it to build applications.
+Pulsar admin APIs | [REST API](pathname:///admin-rest-api/?version=@pulsar:rest_api_version@)|- If you want to implement your own admin interface client using other languages and manage clusters using scripts.| - This method is the most complicated. <br/><br/> - It needs more development work if you want to use it to build applications.
+Pulsar admin CLI| [pulsar-admin CLI](/reference/#/@pulsar:version_reference@/pulsar-admin/) | - If you want to get started with Pulsar admin APIs with minimal effort (e.g., no need to prepare an extra environment). <br/><br/> - If you want to perform common administrative tasks.| - This method is the most easy-to-use. <br/><br/> - It’s challenging to use this method to build applications.<br/><br/> - It takes a little more time because JVM starts slowly.
+
+### Related topics
+
+- To understand the basics, see [Pulsar admin API - Overview](admin-api-overview.md)
+
+- To learn usage scenarios, see [Pulsar admin API - Use cases](admin-api-use-cases.md).
+
+- To learn common administrative tasks, see [Pulsar admin API - Features](admin-api-features.md).
+
+- To get up quickly, see [Pulsar admin API - Get started](admin-get-started.md).
+
+- To check the detailed usage, see the API references below.
+
+ - [Java admin API](@pulsar:javadoc:admin@/)
+
+ - [REST API](reference-rest-api-overview.md)
diff --git a/versioned_docs/version-5.0.x/admin-api-topics.md b/versioned_docs/version-5.0.x/admin-api-topics.md
new file mode 100644
index 00000000000..3f7786129e1
--- /dev/null
+++ b/versioned_docs/version-5.0.x/admin-api-topics.md
@@ -0,0 +1,2096 @@
+---
+id: admin-api-topics
+title: Manage topics
+sidebar_label: "Topics"
+description: Learn how to manage topics using Pulsar CLI and admin APIs.
+---
+
+````mdx-code-block
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+````
+
+
+:::tip
+
+This page only shows **some frequently used operations**.
+
+- For the latest and complete information about `Pulsar admin`, including commands, flags, descriptions, and more, see [Pulsar admin docs](/reference/#/@pulsar:version_reference@/pulsar-admin/).
+
+- For the latest and complete information about `REST API`, including parameters, responses, samples, and more, see {@inject: rest:REST:/} API doc.
+
+- For the latest and complete information about `Java admin API`, including classes, methods, descriptions, and more, see [Java admin API doc](@pulsar:javadoc:admin@/).
+
+:::
+
+Pulsar has persistent and non-persistent topics. A persistent topic is a logical endpoint for publishing and consuming messages. The topic name structure for persistent topics is:
+
+```shell
+persistent://tenant/namespace/topic
+```
+
+Non-persistent topics are used in applications that only consume real-time published messages and do not need persistent guarantees. In this way, it reduces message-publish latency by removing overhead of persisting messages. The topic name structure for non-persistent topics is:
+
+```shell
+non-persistent://tenant/namespace/topic
+```
+
+:::note
+
+Topic naming: due to backward compatibility, some special characters, e.g., "/," are allowed as a part of the topic name. But it's recommended not to use special characters as a part of the topic name.
+
+:::
+
+## Manage topic resources
+Whether it is a persistent or non-persistent topic, you can obtain the topic resources through `pulsar-admin` tool, REST API and Java.
+
+:::note
+
+In REST API, `:schema` stands for persistent or non-persistent. `:tenant`, `:namespace`, `:x` are variables, replace them with the real tenant, namespace, and `x` names when using them.
+Take [](swagger:/admin/v2/getList) as an example, to get the list of persistent topics in REST API, use `https://pulsar.apache.org/admin/v2/persistent/my-tenant/my-namespace`. To get the list of non-persistent topics in REST API, use `https://pulsar.apache.org/admin/v2/non-persistent/my-tenant/my-namespace`.
+
+:::
+
+### List of topics
+
+You can get the list of topics under a given namespace in the following ways.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics list my-tenant/my-namespace
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getList_1)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+String namespace = "my-tenant/my-namespace";
+admin.topics().getList(namespace);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Grant permission
+
+You can grant permissions on a client role to perform specific actions on a given topic in the following ways.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics grant-permission \
+ --actions produce,consume \
+ --role application1 \
+ persistent://test-tenant/ns1/tp1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/grantPermissionsOnTopic)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+String topic = "persistent://my-tenant/my-namespace/my-topic";
+String role = "test-role";
+Set<AuthAction> actions = Sets.newHashSet(AuthAction.produce, AuthAction.consume);
+admin.topics().grantPermission(topic, role, actions);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Get permission
+
+You can fetch permission in the following ways.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics permissions persistent://test-tenant/ns1/tp1
+```
+
+Example output:
+
+```
+application1 [consume, produce]
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getPermissionsOnTopic)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+String topic = "persistent://my-tenant/my-namespace/my-topic";
+admin.topics().getPermissions(topic);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Revoke permission
+
+You can revoke permissions granted on a client role in the following ways.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics revoke-permission \
+ --role application1 \
+ persistent://test-tenant/ns1/tp1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/revokePermissionsOnTopic)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+String topic = "persistent://my-tenant/my-namespace/my-topic";
+String role = "test-role";
+admin.topics().revokePermissions(topic, role);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Delete topic
+
+You can delete a topic in the following ways. You cannot delete a topic if any active subscription or producer is connected to the topic.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics delete persistent://test-tenant/ns1/tp1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/deleteTopic)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+String topic = "persistent://my-tenant/my-namespace/my-topic";
+admin.topics().delete(topic);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Unload topic
+
+You can unload a topic in the following ways.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics unload persistent://test-tenant/ns1/tp1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/unloadTopic_1)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+String topic = "persistent://my-tenant/my-namespace/my-topic";
+admin.topics().unload(topic);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Truncate topic
+
+You can truncate a topic in the following ways. The truncate operation moves all cursors to the end of the topic and deletes all inactive ledgers, freeing the storage used by messages that have already been consumed.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics truncate persistent://test-tenant/ns1/tp1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/truncateTopic)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+String topic = "persistent://my-tenant/my-namespace/my-topic";
+admin.topics().truncate(topic);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Get stats
+
+For the detailed statistics of a topic, see [Pulsar statistics](administration-stats.md#topic-stats).
+
+The following is an example of a topic status.
+
+```json
+{
+ "msgRateIn" : 0.0,
+ "msgThroughputIn" : 0.0,
+ "msgRateOut" : 0.0,
+ "msgThroughputOut" : 0.0,
+ "bytesInCounter" : 504,
+ "msgInCounter" : 9,
+ "bytesOutCounter" : 2296,
+ "msgOutCounter" : 41,
+ "averageMsgSize" : 0.0,
+ "msgChunkPublished" : false,
+ "storageSize" : 504,
+ "backlogSize" : 0,
+ "filteredEntriesCount" : 100,
+ "earliestMsgPublishTimeInBacklogs": 0,
+ "offloadedStorageSize" : 0,
+ "publishers" : [ {
+ "accessMode" : "Shared",
+ "msgRateIn" : 0.0,
+ "msgThroughputIn" : 0.0,
+ "averageMsgSize" : 0.0,
+ "chunkedMessageRate" : 0.0,
+ "producerId" : 0,
+ "metadata" : { },
+ "address" : "/127.0.0.1:65402",
+ "connectedSince" : "2021-06-09T17:22:55.913+08:00",
+ "clientVersion" : "2.9.0-SNAPSHOT",
+ "producerName" : "standalone-1-0"
+ } ],
+ "waitingPublishers" : 0,
+ "subscriptions" : {
+ "sub-demo" : {
+ "msgRateOut" : 0.0,
+ "msgThroughputOut" : 0.0,
+ "bytesOutCounter" : 2296,
+ "msgOutCounter" : 41,
+ "msgRateRedeliver" : 0.0,
+ "chunkedMessageRate" : 0,
+ "msgBacklog" : 0,
+ "backlogSize" : 0,
+ "earliestMsgPublishTimeInBacklog": 0,
+ "msgBacklogNoDelayed" : 0,
+ "blockedSubscriptionOnUnackedMsgs" : false,
+ "msgDelayed" : 0,
+ "unackedMessages" : 0,
+ "type" : "Exclusive",
+ "activeConsumerName" : "20b81",
+ "msgRateExpired" : 0.0,
+ "totalMsgExpired" : 0,
+ "lastExpireTimestamp" : 0,
+ "lastConsumedFlowTimestamp" : 1623230565356,
+ "lastConsumedTimestamp" : 1623230583946,
+ "lastAckedTimestamp" : 1623230584033,
+ "lastMarkDeleteAdvancedTimestamp" : 1623230584033,
+ "filterProcessedMsgCount": 100,
+ "filterAcceptedMsgCount": 100,
+ "filterRejectedMsgCount": 0,
+ "filterRescheduledMsgCount": 0,
+ "consumers" : [ {
+ "msgRateOut" : 0.0,
+ "msgThroughputOut" : 0.0,
+ "bytesOutCounter" : 2296,
+ "msgOutCounter" : 41,
+ "msgRateRedeliver" : 0.0,
+ "chunkedMessageRate" : 0.0,
+ "consumerName" : "20b81",
+ "availablePermits" : 959,
+ "unackedMessages" : 0,
+ "avgMessagesPerEntry" : 314,
+ "blockedConsumerOnUnackedMsgs" : false,
+ "lastAckedTimestamp" : 1623230584033,
+ "lastConsumedTimestamp" : 1623230583946,
+ "metadata" : { },
+ "address" : "/127.0.0.1:65172",
+ "connectedSince" : "2021-06-09T17:22:45.353+08:00",
+ "clientVersion" : "2.9.0-SNAPSHOT"
+ } ],
+ "allowOutOfOrderDelivery": false,
+ "consumersAfterMarkDeletePosition" : { },
+ "nonContiguousDeletedMessagesRanges" : 0,
+ "nonContiguousDeletedMessagesRangesSerializedSize" : 0,
+ "durable" : true,
+ "replicated" : false
+ }
+ },
+ "replication" : { },
+ "deduplicationStatus" : "Disabled",
+ "nonContiguousDeletedMessagesRanges" : 0,
+ "nonContiguousDeletedMessagesRangesSerializedSize" : 0,
+ "ownerBroker" : "localhost:8080"
+}
+```
+
+To get the status of a topic, you can use the following ways.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics stats persistent://test-tenant/ns1/tp1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getStats)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+String topic = "persistent://my-tenant/my-namespace/my-topic";
+admin.topics().getStats(topic);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Get internal stats
+
+For the detailed internal statistics inside a topic, see [Pulsar statistics](administration-stats.md#topic-internal-stats).
+
+The following is an example of the internal statistics of a topic.
+
+```json
+{
+ "entriesAddedCounter":0,
+ "numberOfEntries":0,
+ "totalSize":0,
+ "currentLedgerEntries":0,
+ "currentLedgerSize":0,
+ "lastLedgerCreatedTimestamp":"2021-01-22T21:12:14.868+08:00",
+ "lastLedgerCreationFailureTimestamp":null,
+ "waitingCursorsCount":0,
+ "pendingAddEntriesCount":0,
+ "lastConfirmedEntry":"3:-1",
+ "state":"LedgerOpened",
+ "ledgers":[
+ {
+ "ledgerId":3,
+ "entries":0,
+ "size":0,
+ "offloaded":false,
+ "metadata":null
+ }
+ ],
+ "cursors":{
+ "test":{
+ "markDeletePosition":"3:-1",
+ "readPosition":"3:-1",
+ "waitingReadOp":false,
+ "pendingReadOps":0,
+ "messagesConsumedCounter":0,
+ "cursorLedger":4,
+ "cursorLedgerLastEntry":1,
+ "individuallyDeletedMessages":"[]",
+ "lastLedgerSwitchTimestamp":"2021-01-22T21:12:14.966+08:00",
+ "state":"Open",
+ "numberOfEntriesSinceFirstNotAckedMessage":0,
+ "totalNonContiguousDeletedMessagesRange":0,
+ "properties":{
+
+ }
+ }
+ },
+ "schemaLedgers":[
+ {
+ "ledgerId":1,
+ "entries":11,
+ "size":10,
+ "offloaded":false,
+ "metadata":null
+ }
+ ],
+ "compactedLedger":{
+ "ledgerId":-1,
+ "entries":-1,
+ "size":-1,
+ "offloaded":false,
+ "metadata":null
+ }
+}
+```
+
+To get the internal status of a topic, you can use the following ways.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics stats-internal persistent://test-tenant/ns1/tp1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getInternalStats_1)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+String topic = "persistent://my-tenant/my-namespace/my-topic";
+admin.topics().getInternalStats(topic);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Peek messages
+
+You can peek a number of messages for a specific subscription of a given topic in the following ways.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics peek-messages \
+ --count 10 --subscription my-subscription \
+ persistent://test-tenant/ns1/tp1
+```
+
+Example output:
+
+```
+Message ID: 77:2
+Publish time: 1668674963028
+Event time: 0
+ +-------------------------------------------------+
+ | 0 1 2 3 4 5 6 7 8 9 a b c d e f |
++--------+-------------------------------------------------+----------------+
+|00000000| 68 65 6c 6c 6f 2d 31 |hello-1 |
++--------+-------------------------------------------------+----------------+
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/peekNthMessage)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+String topic = "persistent://my-tenant/my-namespace/my-topic";
+String subName = "my-subscription";
+int numMessages = 1;
+admin.topics().peekMessages(topic, subName, numMessages);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Get message by ID
+
+You can fetch the message with the given ledger ID and entry ID in the following ways.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics get-message-by-id \
+ -l 10 -e 0 persistent://public/default/my-topic
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getMessageById)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+String topic = "persistent://my-tenant/my-namespace/my-topic";
+long ledgerId = 10;
+long entryId = 10;
+admin.topics().getMessageById(topic, ledgerId, entryId);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Examine messages
+
+You can examine a specific message on a topic by position relative to the earliest or the latest message.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics examine-messages \
+ -i latest -m 1 persistent://public/default/my-topic
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/examineMessage)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+String topic = "persistent://my-tenant/my-namespace/my-topic";
+admin.topics().examineMessage(topic, "latest", 1);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Get message ID
+
+You can get message ID published at or just after the given datetime.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics get-message-id \
+ persistent://public/default/my-topic \
+ -d 2021-06-28T19:01:17Z
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getMessageIdByTimestamp)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+String topic = "persistent://my-tenant/my-namespace/my-topic";
+long timestamp = System.currentTimeMillis()
+admin.topics().getMessageIdByTimestamp(topic, timestamp);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+
+### Skip messages
+
+You can skip a number of messages for a specific subscription of a given topic in the following ways.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics skip \
+ --count 10 --subscription my-subscription \
+ persistent://test-tenant/ns1/tp1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/skipMessages)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+String topic = "persistent://my-tenant/my-namespace/my-topic";
+String subName = "my-subscription";
+int numMessages = 1;
+admin.topics().skipMessages(topic, subName, numMessages);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Skip all messages
+
+You can skip all the old messages for a specific subscription of a given topic.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics clear-backlog \
+ --subscription my-subscription \
+ persistent://test-tenant/ns1/tp1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/skipAllMessages)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+String topic = "persistent://my-tenant/my-namespace/my-topic";
+String subName = "my-subscription";
+admin.topics().skipAllMessages(topic, subName);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Reset cursor
+
+You can reset a subscription cursor position back to the position which is recorded X seconds (or with other time units, e.g 100m, 3h, 2d, 5w) before. It essentially calculates the time and position of the cursor at X seconds before and resets it at that position. You can reset the cursor in the following ways.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics reset-cursor \
+ --subscription my-subscription --time 10 \
+ persistent://test-tenant/ns1/tp1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/resetCursor)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+
+String topic = "persistent://my-tenant/my-namespace/my-topic";
+String subName = "my-subscription";
+long timestamp = 2342343L;
+admin.topics().resetCursor(topic, subName, timestamp);
+
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Look up topic's owner broker
+
+You can locate the owner broker of the given topic in the following ways.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics lookup persistent://test-tenant/ns1/tp1
+```
+
+Example output:
+
+```
+"pulsar://broker1.org.com:4480"
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/lookup/lookupTopicAsync)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+String topic = "persistent://my-tenant/my-namespace/my-topic";
+admin.lookups().lookupDestination(topic);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Look up partitioned topic's owner broker
+
+You can locate the owner broker of the given partitioned topic in the following ways.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics partitioned-lookup persistent://test-tenant/ns1/my-topic
+```
+
+Example output:
+
+```
+"persistent://test-tenant/ns1/my-topic-partition-0 pulsar://localhost:6650"
+"persistent://test-tenant/ns1/my-topic-partition-1 pulsar://localhost:6650"
+"persistent://test-tenant/ns1/my-topic-partition-2 pulsar://localhost:6650"
+"persistent://test-tenant/ns1/my-topic-partition-3 pulsar://localhost:6650"
+```
+
+Lookup the partitioned topics sorted by broker URL
+
+```shell
+pulsar-admin topics partitioned-lookup \
+ persistent://test-tenant/ns1/my-topic --sort-by-broker
+```
+
+Example output:
+
+```
+pulsar://localhost:6650 [persistent://test-tenant/ns1/my-topic-partition-0, persistent://test-tenant/ns1/my-topic-partition-1, persistent://test-tenant/ns1/my-topic-partition-2, persistent://test-tenant/ns1/my-topic-partition-3]
+```
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+String topic = "persistent://my-tenant/my-namespace/my-topic";
+admin.lookups().lookupPartitionedTopic(topic);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Get bundle
+
+You can get the range of the bundle that the given topic belongs to in the following ways.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics bundle-range persistent://test-tenant/ns1/tp1
+```
+
+Example output:
+
+```
+"0x00000000_0xffffffff"
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/lookup/getNamespaceBundle)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+String topic = "persistent://my-tenant/my-namespace/my-topic";
+admin.lookups().getBundleRange(topic);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Get subscriptions
+
+You can check all subscription names for a given topic in the following ways.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics subscriptions persistent://test-tenant/ns1/tp1
+```
+
+Example output:
+
+```
+my-subscription
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getSubscriptions)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+String topic = "persistent://my-tenant/my-namespace/my-topic";
+admin.topics().getSubscriptions(topic);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Last Message Id
+
+You can get the last committed message ID for a persistent topic. It is available since 2.3.0 release.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics last-message-id topic-name
+```
+
+Example output:
+
+```json
+{
+ "ledgerId" : 97,
+ "entryId" : 9,
+ "partitionIndex" : -1
+}
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getLastMessageId)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+String topic = "persistent://my-tenant/my-namespace/my-topic";
+admin.topics().getLastMessage(topic);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Get backlog size
+
+You can get the backlog size of a single partition topic or a non-partitioned topic with a given message ID (in bytes).
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics get-backlog-size \
+ -m 1:1 \
+ persistent://test-tenant/ns1/tp1-partition-0
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getBacklogSizeByMessageId)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+String topic = "persistent://my-tenant/my-namespace/my-topic";
+MessageId messageId = MessageId.earliest;
+admin.topics().getBacklogSizeByMessageId(topic, messageId);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+
+### Configure deduplication snapshot interval
+
+#### Get deduplication snapshot interval
+
+To get the topic-level deduplication snapshot interval, use one of the following methods.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics get-deduplication-snapshot-interval my-topic
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getDeduplicationSnapshotInterval)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.topics().getDeduplicationSnapshotInterval(topic)
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+#### Set deduplication snapshot interval
+
+To set the topic-level deduplication snapshot interval, use one of the following methods.
+
+> **Prerequisite** `brokerDeduplicationEnabled` must be set to `true`.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics set-deduplication-snapshot-interval my-topic -i 1000
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/setDeduplicationSnapshotInterval)
+
+```json
+{
+ "interval": 1000
+}
+```
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.topics().setDeduplicationSnapshotInterval(topic, 1000)
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+#### Remove deduplication snapshot interval
+
+To remove the topic-level deduplication snapshot interval, use one of the following methods.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics remove-deduplication-snapshot-interval my-topic
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/deleteDeduplicationSnapshotInterval)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.topics().removeDeduplicationSnapshotInterval(topic)
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+
+### Configure inactive topic policies
+
+#### Get inactive topic policies
+
+To get the topic-level inactive topic policies, use one of the following methods.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics get-inactive-topic-policies my-topic
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getInactiveTopicPolicies)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.topics().getInactiveTopicPolicies(topic)
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+#### Set inactive topic policies
+
+To set the topic-level inactive topic policies, use one of the following methods.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics set-inactive-topic-policies my-topic
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/setInactiveTopicPolicies)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.topics().setInactiveTopicPolicies(topic, inactiveTopicPolicies)
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+#### Remove inactive topic policies
+
+To remove the topic-level inactive topic policies, use one of the following methods.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics remove-inactive-topic-policies my-topic
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/removeInactiveTopicPolicies)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.topics().removeInactiveTopicPolicies(topic)
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+
+### Configure offload policies
+
+#### Get offload policies
+
+To get the topic-level offload policies, use one of the following methods.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics get-offload-policies my-topic
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getOffloadPolicies)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.topics().getOffloadPolicies(topic)
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+#### Set offload policies
+
+To set the topic-level offload policies, use one of the following methods.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics set-offload-policies my-topic
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/setOffloadPolicies)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.topics().setOffloadPolicies(topic, offloadPolicies)
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+#### Remove offload policies
+
+To remove the topic-level offload policies, use one of the following methods.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics remove-offload-policies my-topic
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/removeOffloadPolicies)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.topics().removeOffloadPolicies(topic)
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+
+## Manage non-partitioned topics
+You can use Pulsar [admin API](admin-api-overview.md) to create, delete and check the status of non-partitioned topics.
+
+### Create
+Non-partitioned topics must be explicitly created. When creating a new non-partitioned topic, you need to provide a name for the topic.
+
+By default, 60 seconds after creation, topics are considered inactive and deleted automatically to avoid generating trash data. To disable this feature, set `brokerDeleteInactiveTopicsEnabled` to `false`. To change the frequency of checking inactive topics, set `brokerDeleteInactiveTopicsFrequencySeconds` to a specific value.
+
+For more information about the two parameters, see [here](reference-configuration.md#broker).
+
+You can create non-partitioned topics in the following ways.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+When you create non-partitioned topics with the [`create`](/reference/#/@pulsar:version_reference@/pulsar-admin/topics?id=create) command, you need to specify the topic name as an argument.
+
+```shell
+pulsar-admin topics create \
+ persistent://my-tenant/my-namespace/my-topic
+```
+
+:::note
+
+When you create a non-partitioned topic with the suffix '-partition-' followed by numeric value like 'xyz-topic-partition-x' for the topic name, if a partitioned topic with same suffix 'xyz-topic-partition-y' exists, then the numeric value(x) for the non-partitioned topic must be larger than the number of partitions(y) of the partitioned topic. Otherwise, you cannot create such a non-partitioned topic.
+
+:::
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/createNonPartitionedTopic)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+String topicName = "persistent://my-tenant/my-namespace/my-topic";
+admin.topics().createNonPartitionedTopic(topicName);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Delete
+
+You can delete non-partitioned topics in the following ways.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics delete \
+ persistent://my-tenant/my-namespace/my-topic
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/deleteTopic)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.topics().delete(topic);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### List
+
+You can get the list of topics under a given namespace in the following ways.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics list tenant/namespace
+```
+
+Example output:
+
+```
+persistent://tenant/namespace/topic1
+persistent://tenant/namespace/topic2
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getList_1)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.topics().getList(namespace);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Stats
+
+
+You can check the current statistics of a given topic and its connected producers and consumers in the following ways.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics stats \
+ persistent://test-tenant/namespace/topic \
+ --get-precise-backlog
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getStats)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.topics().getStats(topic, false /* is precise backlog */);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+The following is an example. For the description of topic stats, see [Pulsar statistics](administration-stats.md#topic-stats).
+
+```json
+{
+ "msgRateIn": 4641.528542257553,
+ "msgThroughputIn": 44663039.74947473,
+ "msgRateOut": 0,
+ "msgThroughputOut": 0,
+ "averageMsgSize": 1232439.816728665,
+ "storageSize": 135532389160,
+ "publishers": [
+ {
+ "msgRateIn": 57.855383881403576,
+ "msgThroughputIn": 558994.7078932219,
+ "averageMsgSize": 613135,
+ "producerId": 0,
+ "producerName": null,
+ "address": null,
+ "connectedSince": null
+ }
+ ],
+ "subscriptions": {
+ "my-topic_subscription": {
+ "msgRateOut": 0,
+ "msgThroughputOut": 0,
+ "msgBacklog": 116632,
+ "type": null,
+ "msgRateExpired": 36.98245516804671,
+ "consumers": []
+ }
+ },
+ "replication": {}
+}
+```
+
+### Internal stats
+
+You can check the detailed statistics of a topic. The following is an example. For the description of each internal topic stats, see [Pulsar statistics](administration-stats.md#topic-internal-stats).
+
+```json
+{
+ "entriesAddedCounter": 20449518,
+ "numberOfEntries": 3233,
+ "totalSize": 331482,
+ "currentLedgerEntries": 3233,
+ "currentLedgerSize": 331482,
+ "lastLedgerCreatedTimestamp": "2016-06-29 03:00:23.825",
+ "lastLedgerCreationFailureTimestamp": null,
+ "waitingCursorsCount": 1,
+ "pendingAddEntriesCount": 0,
+ "lastConfirmedEntry": "324711539:3232",
+ "state": "LedgerOpened",
+ "ledgers": [
+ {
+ "ledgerId": 324711539,
+ "entries": 0,
+ "size": 0
+ }
+ ],
+ "cursors": {
+ "my-subscription": {
+ "markDeletePosition": "324711539:3133",
+ "readPosition": "324711539:3233",
+ "waitingReadOp": true,
+ "pendingReadOps": 0,
+ "messagesConsumedCounter": 20449501,
+ "cursorLedger": 324702104,
+ "cursorLedgerLastEntry": 21,
+ "individuallyDeletedMessages": "[(324711539:3134‥324711539:3136], (324711539:3137‥324711539:3140], ]",
+ "lastLedgerSwitchTimestamp": "2016-06-29 01:30:19.313",
+ "state": "Open"
+ }
+ }
+}
+```
+
+You can get the internal stats for the partitioned topic in the following ways.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics stats-internal \
+ persistent://test-tenant/namespace/topic
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getInternalStats_1)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.topics().getInternalStats(topic);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+## Manage partitioned topics
+You can use Pulsar [admin API](admin-api-overview.md) to create, update, delete and check the status of partitioned topics.
+
+### Create
+
+When creating a new partitioned topic, you need to provide a name and the number of partitions for the topic.
+
+:::note
+
+By default, if there are no messages 60 seconds after creation, topics are considered inactive and deleted automatically to avoid generating trash data. To disable this feature, set `brokerDeleteInactiveTopicsEnabled` to `false`. To change the frequency of checking inactive topics, set `brokerDeleteInactiveTopicsFrequencySeconds` to a specific value.
+
+:::
+
+For more information about the two parameters, see [here](reference-configuration.md#broker).
+
+You can create partitioned topics in the following ways.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+When you create partitioned topics with the [`create-partitioned-topic`](/reference/#/@pulsar:version_reference@/pulsar-admin/topics?id=create-partitioned-topic) command, you need to specify the topic name as an argument and the number of partitions using the `-p` or `--partitions` flag.
+
+```shell
+pulsar-admin topics create-partitioned-topic \
+ persistent://my-tenant/my-namespace/my-topic \
+ --partitions 4
+```
+
+:::note
+
+If a non-partitioned topic with the suffix '-partition-' followed by a numeric value like 'xyz-topic-partition-10', you can not create a partitioned topic with name 'xyz-topic', because the partitions of the partitioned topic could override the existing non-partitioned topic. To create such partitioned topic, you have to delete that non-partitioned topic first.
+
+:::
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/createPartitionedTopic_1)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+String topicName = "persistent://my-tenant/my-namespace/my-topic";
+int numPartitions = 4;
+admin.topics().createPartitionedTopic(topicName, numPartitions);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Create missed partitions
+
+When topic auto-creation is disabled, and you have a partitioned topic without any partitions, you can use the [`create-missed-partitions`](/reference/#/@pulsar:version_reference@/pulsar-admin/topics?id=create-missed-partitions) command to create partitions for the topic.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+You can create missed partitions with the [`create-missed-partitions`](/reference/#/@pulsar:version_reference@/pulsar-admin/topics?id=create-missed-partitions) command and specify the topic name as an argument.
+
+```shell
+pulsar-admin topics create-missed-partitions \
+ persistent://my-tenant/my-namespace/my-topic
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/createMissedPartitions)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+String topicName = "persistent://my-tenant/my-namespace/my-topic";
+admin.topics().createMissedPartitions(topicName);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Get metadata
+
+Partitioned topics are associated with metadata, you can view it as a JSON object. The following metadata field is available.
+
+Field | Description
+:-----|:-------
+`partitions` | The number of partitions into which the topic is divided.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+You can check the number of partitions in a partitioned topic with the [`get-partitioned-topic-metadata`](/reference/#/@pulsar:version_reference@/pulsar-admin/topics?id=get-partitioned-topic-metadata) subcommand.
+
+```shell
+pulsar-admin topics get-partitioned-topic-metadata \
+ persistent://my-tenant/my-namespace/my-topic
+```
+
+Example output:
+
+```json
+{
+ "partitions" : 4,
+ "deleted" : false
+}
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getPartitionedMetadata_1)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+String topicName = "persistent://my-tenant/my-namespace/my-topic";
+admin.topics().getPartitionedTopicMetadata(topicName);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Update
+
+You can update the number of partitions for an existing partitioned topic. However, you can only increase the number of partitions. Decrementing the number of partitions would delete the topic, which is not supported in Pulsar.
+
+Producers and consumers can find the newly created partitions automatically.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+You can update partitioned topics with the [`update-partitioned-topic`](/reference/#/@pulsar:version_reference@/pulsar-admin/topics?id=update-partitioned-topic) command.
+
+```shell
+pulsar-admin topics update-partitioned-topic \
+ persistent://my-tenant/my-namespace/my-topic \
+ --partitions 8
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/updatePartitionedTopic)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.topics().updatePartitionedTopic(topic, numPartitions);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Delete
+You can delete partitioned topics with the [`delete-partitioned-topic`](/reference/#/@pulsar:version_reference@/pulsar-admin/topics?id=delete-partitioned-topic) command, REST API and Java.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics delete-partitioned-topic \
+ persistent://my-tenant/my-namespace/my-topic
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/deletePartitionedTopic)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.topics().deletePartitionedTopic(topic);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### List
+
+You can get the list of partitioned topics under a given namespace in the following ways.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics list-partitioned-topics tenant/namespace
+```
+
+Example output:
+
+```
+persistent://tenant/namespace/topic1
+persistent://tenant/namespace/topic2
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getPartitionedTopicList)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.topics().getPartitionedTopicList(namespace);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Stats
+
+You can check the current statistics of a given partitioned topic and its connected producers and consumers in the following ways.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics partitioned-stats \
+ persistent://test-tenant/namespace/topic \
+ --per-partition
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getPartitionedStats_1)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.topics().getPartitionedStats(topic, true /* per partition */, false /* is precise backlog */);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+The following is an example. For the description of each topic stats, see [Pulsar statistics](administration-stats.md#topic-stats).
+
+Note that in the subscription JSON object, `chuckedMessageRate` is deprecated. Please use `chunkedMessageRate`. Both will be sent in the JSON for now.
+
+```json
+{
+ "msgRateIn" : 999.992947159793,
+ "msgThroughputIn" : 1070918.4635439808,
+ "msgRateOut" : 0.0,
+ "msgThroughputOut" : 0.0,
+ "bytesInCounter" : 270318763,
+ "msgInCounter" : 252489,
+ "bytesOutCounter" : 0,
+ "msgOutCounter" : 0,
+ "averageMsgSize" : 1070.926056966454,
+ "msgChunkPublished" : false,
+ "storageSize" : 270316646,
+ "backlogSize" : 200921133,
+ "publishers" : [ {
+ "msgRateIn" : 999.992947159793,
+ "msgThroughputIn" : 1070918.4635439808,
+ "averageMsgSize" : 1070.3333333333333,
+ "chunkedMessageRate" : 0.0,
+ "producerId" : 0
+ } ],
+ "subscriptions" : {
+ "test" : {
+ "msgRateOut" : 0.0,
+ "msgThroughputOut" : 0.0,
+ "bytesOutCounter" : 0,
+ "msgOutCounter" : 0,
+ "msgRateRedeliver" : 0.0,
+ "chuckedMessageRate" : 0,
+ "chunkedMessageRate" : 0,
+ "msgBacklog" : 144318,
+ "msgBacklogNoDelayed" : 144318,
+ "blockedSubscriptionOnUnackedMsgs" : false,
+ "msgDelayed" : 0,
+ "unackedMessages" : 0,
+ "msgRateExpired" : 0.0,
+ "lastExpireTimestamp" : 0,
+ "lastConsumedFlowTimestamp" : 0,
+ "lastConsumedTimestamp" : 0,
+ "lastAckedTimestamp" : 0,
+ "consumers" : [ ],
+ "isDurable" : true,
+ "isReplicated" : false
+ }
+ },
+ "replication" : { },
+ "metadata" : {
+ "partitions" : 3
+ },
+ "partitions" : { }
+}
+```
+
+### Internal stats
+
+You can check the detailed statistics of a partitioned topic. The following is an example. For the description of each internal topic stats, see [Pulsar statistics](administration-stats.md#topic-internal-stats).
+
+```json
+{
+ "entriesAddedCounter": 20449518,
+ "numberOfEntries": 3233,
+ "totalSize": 331482,
+ "currentLedgerEntries": 3233,
+ "currentLedgerSize": 331482,
+ "lastLedgerCreatedTimestamp": "2016-06-29 03:00:23.825",
+ "lastLedgerCreationFailureTimestamp": null,
+ "waitingCursorsCount": 1,
+ "pendingAddEntriesCount": 0,
+ "lastConfirmedEntry": "324711539:3232",
+ "state": "LedgerOpened",
+ "ledgers": [
+ {
+ "ledgerId": 324711539,
+ "entries": 0,
+ "size": 0
+ }
+ ],
+ "cursors": {
+ "my-subscription": {
+ "markDeletePosition": "324711539:3133",
+ "readPosition": "324711539:3233",
+ "waitingReadOp": true,
+ "pendingReadOps": 0,
+ "messagesConsumedCounter": 20449501,
+ "cursorLedger": 324702104,
+ "cursorLedgerLastEntry": 21,
+ "individuallyDeletedMessages": "[(324711539:3134‥324711539:3136], (324711539:3137‥324711539:3140], ]",
+ "lastLedgerSwitchTimestamp": "2016-06-29 01:30:19.313",
+ "state": "Open"
+ }
+ }
+}
+```
+
+You can get the internal stats for the partitioned topic in the following ways.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics partitioned-stats-internal \
+ persistent://test-tenant/namespace/topic
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getPartitionedStatsInternal)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.topics().getPartitionedInternalStats(topic);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+
+## Manage subscriptions
+
+You can use [Pulsar admin API](admin-api-overview.md) to create, check, and delete subscriptions.
+
+### Create subscription
+
+You can create a subscription for a topic using one of the following methods.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics create-subscription \
+ --subscription my-subscription \
+ persistent://test-tenant/ns1/tp1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/createSubscription)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+String topic = "persistent://my-tenant/my-namespace/my-topic";
+String subscriptionName = "my-subscription";
+admin.topics().createSubscription(topic, subscriptionName, MessageId.latest);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Get subscription
+
+You can check all subscription names for a given topic using one of the following methods.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics subscriptions persistent://test-tenant/ns1/tp1
+```
+
+Example output:
+
+```
+my-subscription
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getSubscriptions)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+String topic = "persistent://my-tenant/my-namespace/my-topic";
+admin.topics().getSubscriptions(topic);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+### Unsubscribe subscription
+
+When a subscription does not process messages anymore, you can unsubscribe it using one of the following methods.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin topics unsubscribe \
+ --subscription my-subscription \
+ persistent://test-tenant/ns1/tp1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/deleteSubscription)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+String topic = "persistent://my-tenant/my-namespace/my-topic";
+String subscriptionName = "my-subscription";
+admin.topics().deleteSubscription(topic, subscriptionName);
+```
+
+</TabItem>
+
+</Tabs>
+````
diff --git a/versioned_docs/version-5.0.x/admin-api-transactions.md b/versioned_docs/version-5.0.x/admin-api-transactions.md
new file mode 100644
index 00000000000..d5e9a57a4d2
--- /dev/null
+++ b/versioned_docs/version-5.0.x/admin-api-transactions.md
@@ -0,0 +1,725 @@
+---
+id: admin-api-transactions
+title: Manage transactions
+sidebar_label: "Transactions"
+description: Learn how to manage transactions using Pulsar CLI and admin APIs.
+---
+
+````mdx-code-block
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+````
+
+
+:::tip
+
+This page only shows **some frequently used operations**.
+
+- For the latest and complete information about `Pulsar admin`, including commands, flags, descriptions, and more, see [Pulsar admin docs](/reference/#/@pulsar:version_reference@/pulsar-admin/).
+
+- For the latest and complete information about `REST API`, including parameters, responses, samples, and more, see {@inject: rest:REST:/} API doc.
+
+- For the latest and complete information about `Java admin API`, including classes, methods, descriptions, and more, see [Java admin API doc](@pulsar:javadoc:admin@/).
+
+:::
+
+## Transaction resources
+
+### GetSlowTransactions
+
+In the production environment, there may be some long-lasting transactions that have never been completed. You can get these slow transactions that have survived over a certain time under a coordinator or all coordinators in the following ways.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin transactions slow-transactions -c 1 -t 1s
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v3/transactions/getSlowTransactions)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.transactions().getSlowTransactionsByCoordinatorId(coordinatorId, timeout, timeUnit)
+//Or get slow transactions from all coordinators
+admin.transactions().getSlowTransactions(timeout, timeUnit)
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+The following is an example of the returned values.
+
+```json
+{
+ "(0,3)": {
+ "txnId": "(0,3)",
+ "status": "OPEN",
+ "openTimestamp": 1658120122474,
+ "timeoutAt": 300000,
+ "producedPartitions": {},
+ "ackedPartitions": {}
+ },
+ "(0,2)": {
+ "txnId": "(0,2)",
+ "status": "OPEN",
+ "openTimestamp": 1658120122471,
+ "timeoutAt": 300000,
+ "producedPartitions": {},
+ "ackedPartitions": {}
+ },
+ "(0,5)": {
+ "txnId": "(0,5)",
+ "status": "OPEN",
+ "openTimestamp": 1658120122478,
+ "timeoutAt": 300000,
+ "producedPartitions": {},
+ "ackedPartitions": {}
+ },
+ "(0,4)": {
+ "txnId": "(0,4)",
+ "status": "OPEN",
+ "openTimestamp": 1658120122476,
+ "timeoutAt": 300000,
+ "producedPartitions": {},
+ "ackedPartitions": {}
+ },
+ "(0,7)": {
+ "txnId": "(0,7)",
+ "status": "OPEN",
+ "openTimestamp": 1658120122482,
+ "timeoutAt": 300000,
+ "producedPartitions": {},
+ "ackedPartitions": {}
+ },
+ "(0,10)": {
+ "txnId": "(0,10)",
+ "status": "OPEN",
+ "openTimestamp": 1658120122488,
+ "timeoutAt": 300000,
+ "producedPartitions": {},
+ "ackedPartitions": {}
+ },
+ "(0,6)": {
+ "txnId": "(0,6)",
+ "status": "OPEN",
+ "openTimestamp": 1658120122480,
+ "timeoutAt": 300000,
+ "producedPartitions": {},
+ "ackedPartitions": {}
+ },
+ "(0,9)": {
+ "txnId": "(0,9)",
+ "status": "OPEN",
+ "openTimestamp": 1658120122486,
+ "timeoutAt": 300000,
+ "producedPartitions": {},
+ "ackedPartitions": {}
+ },
+ "(0,8)": {
+ "txnId": "(0,8)",
+ "status": "OPEN",
+ "openTimestamp": 1658120122484,
+ "timeoutAt": 300000,
+ "producedPartitions": {},
+ "ackedPartitions": {}
+ },
+ "(0,11)": {
+ "txnId": "(0,11)",
+ "status": "OPEN",
+ "openTimestamp": 1658120122490,
+ "timeoutAt": 300000,
+ "producedPartitions": {},
+ "ackedPartitions": {}
+ }
+}
+```
+
+### ScaleTransactionCoordinators
+
+When the performance of transactions reaches a bottleneck due to the insufficient number of transaction coordinators, you can scale the number of the transaction coordinators in the following ways.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin transactions scale-transactionCoordinators -r 17
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v3/transactions/scaleTransactionCoordinators)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.transactions().scaleTransactionCoordinators(replicas);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+## Transaction stats
+
+### Get transaction metadata
+
+The transaction metadata that can be retrieved include:
+* **txnId:** The ID of this transaction.
+* **status:** The status of this transaction.
+* **openTimestamp:** The open time of this transaction.
+* **timeoutAt:** The timeout of this transaction.
+* **producedPartitions:** The partitions or topics that messages have been sent to with this transaction.
+* **ackedPartitions:** The partitions or topics where messages have been acknowledged with this transaction.
+
+Use one of the following ways to get your transaction metadata.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin transactions transaction-metadata -m 1 -l 1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v3/transactions/getTransactionMetadata)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.transactions().getTransactionMetadata(txnID);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+The following is an example of the returned values.
+
+```json
+{
+ "txnId" : "(1,18)",
+ "status" : "ABORTING",
+ "openTimestamp" : 1656592983374,
+ "timeoutAt" : 5000,
+ "producedPartitions" : {
+ "my-topic" : {
+ "startPosition" : "127:4959",
+ "aborted" : true
+ }
+ },
+ "ackedPartitions" : {
+ "my-topic" : {
+ "mysubName" : {
+ "cumulativeAckPosition" : null
+ }
+ }
+ }
+}
+```
+
+### Get transaction stats in transaction pending ack
+
+The transaction stats in transaction pending ack that can be retrieved include:
+* **cumulativeAckPosition:** The position that this transaction cumulatively acknowledges in this subscription.
+
+Use one of the following ways to get transaction stats in pending ack:
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin transactions transaction-in-pending-ack-stats -m 1 -l 1 -t my-topic -s mysubname
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v3/transactions/getTransactionInPendingAckStats)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.transactions().getTransactionInPendingAckStats(txnID, topic, subname);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+The following is an example of the returned value.
+
+```json
+{
+ "cumulativeAckPosition" : "137:49959"
+ }
+```
+
+### Get transaction stats in transaction buffer
+
+The transaction stats in the transaction buffer that can be retrieved include:
+* **startPosition:** The start position of this transaction in the transaction buffer.
+* **aborted:** The flag of whether this transaction has been aborted.
+
+Use one of the following ways to get transaction stats in transaction buffer:
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin transactions transaction-in-buffer-stats -m 1 -l 1 -t my-topic
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v3/transactions/getTransactionInBufferStats)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.transactions().getTransactionInBufferStatsAsync(txnID, topic);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+The following is an example of the returned values.
+
+```json
+{
+ "startPosition" : "137:49759",
+ "aborted" : false
+}
+```
+
+## Transaction coordinator stats
+
+The transaction coordinator (TC) is a module inside a Pulsar broker. It maintains the entire life cycle of transactions and handles transaction timeout.
+
+### Get coordinator stats
+The transaction coordinator stats that can be retrieved include:
+* **state:** The state of this transaction coordinator.
+* **leastSigBit:s** The sequence ID of this transaction coordinator.
+* **lowWaterMark:** The low watermark of this transaction coordinator.
+* **ongoingTxnSize:** The total number of ongoing transactions in this transaction coordinator.
+* **recoverStartTime:** The start timestamp of transaction coordinator recovery. `0L` means no startup.
+* **recoverEndTime:** The end timestamp of transaction coordinator recovery. `0L` means no startup.
+
+Use one of the following ways to get transaction coordinator stats:
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin transactions coordinator-stats -c 1
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v3/transactions/getCoordinatorStats)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.transactions().getCoordinatorStatsById(coordinatorId);
+//Or get all coordinator stats.
+admin.transactions().getCoordinatorStats();
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+The following is an example of the returned values.
+
+```json
+{
+ "state" : "Ready",
+ "leastSigBits" : 1,
+ "lowWaterMark" : 0,
+ "ongoingTxnSize" : 0,
+ "recoverStartTime" : 1657021892377,
+ "recoverEndTime" : 1657021892378
+}
+```
+
+### Get coordinator internal stats
+
+The coordinator's internal stats that can be retrieved include:
+* **transactionLogStats:** The stats of the transaction coordinator log.
+* **managedLedgerName:** The name of the managed ledger where the transaction coordinator log is stored.
+* **managedLedgerInternalStats:** The internal stats of the managed ledger where the transaction coordinator log is stored. See `[managedLedgerInternalStats](admin-api-topics.md#get-internal-stats)` for more details.
+
+Use one of the following ways to get coordinator's internal stats:
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin transactions coordinator-internal-stats -c 1 -m
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v3/transactions/getCoordinatorInternalStats)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.transactions().getCoordinatorInternalStats(coordinatorId, metadata);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+The following is an example of the returned values.
+
+```json
+{
+ "transactionLogStats" : {
+ "managedLedgerName" : "pulsar/system/persistent/__transaction_log_1",
+ "managedLedgerInternalStats" : {
+ "entriesAddedCounter" : 3,
+ "numberOfEntries" : 3,
+ "totalSize" : 63,
+ "currentLedgerEntries" : 3,
+ "currentLedgerSize" : 63,
+ "lastLedgerCreatedTimestamp" : "2022-06-30T18:18:05.88+08:00",
+ "waitingCursorsCount" : 0,
+ "pendingAddEntriesCount" : 0,
+ "lastConfirmedEntry" : "13:2",
+ "state" : "LedgerOpened",
+ "ledgers" : [ {
+ "ledgerId" : 13,
+ "entries" : 0,
+ "size" : 0,
+ "offloaded" : false,
+ "metadata" : "LedgerMetadata{formatVersion=3, ensembleSize=1, writeQuorumSize=1, ackQuorumSize=1, state=CLOSED, length=63, lastEntryId=2, digestType=CRC32C, password=OMITTED, ensembles={0=[10.20.240.119:3181]}, customMetadata={component=base64:bWFuYWdlZC1sZWRnZXI=, pulsar/managed-ledger=base64:cHVsc2FyL3N5c3RlbS9wZXJzaXN0ZW50L19fdHJhbnNhY3Rpb25fbG9nXzE=, application=base64:cHVsc2Fy}}",
+ "underReplicated" : false
+ } ],
+ "cursors" : {
+ "transaction.subscription" : {
+ "markDeletePosition" : "13:2",
+ "readPosition" : "13:3",
+ "waitingReadOp" : false,
+ "pendingReadOps" : 0,
+ "messagesConsumedCounter" : 3,
+ "cursorLedger" : 22,
+ "cursorLedgerLastEntry" : 1,
+ "individuallyDeletedMessages" : "[]",
+ "lastLedgerSwitchTimestamp" : "2022-06-30T18:18:05.932+08:00",
+ "state" : "Open",
+ "numberOfEntriesSinceFirstNotAckedMessage" : 1,
+ "totalNonContiguousDeletedMessagesRange" : 0,
+ "subscriptionHavePendingRead" : false,
+ "subscriptionHavePendingReplayRead" : false,
+ "properties" : { }
+ }
+ }
+ }
+ }
+}
+```
+
+## Transaction pending ack stats
+
+Pending ack maintains message acknowledgments within a transaction before a transaction completes. If a message is in the pending acknowledge state, the message cannot be acknowledged by other transactions until the message is removed from the pending acknowledge state.
+
+### Get transaction pending ack stats
+
+The transaction pending ack state stats that can be retrieved include:
+* **state:** The state of this transaction coordinator.
+* **lowWaterMark:** The low watermark of this transaction coordinator.
+* **ongoingTxnSize:** The total number of ongoing transactions in this transaction coordinator.
+* **recoverStartTime:** The start timestamp of transaction pendingAck recovery. `0L` means no startup.
+* **recoverEndTime:** The end timestamp of transaction pendingAck recovery. `0L` means no startup.
+
+Use one of the following ways to get transaction pending ack stats:
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin.transactions()s pending-ack-stats -t my-topic -s mysubName -l
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v3/transactions/getPendingAckStats)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.transactions().getPendingAckStats(topic, subName, lowWaterMarks)
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+The following is an example of the returned values.
+
+```json
+{
+ "state" : "Ready",
+ "lowWaterMarks" : {
+ "1" : 0
+ },
+ "ongoingTxnSize" : 1,
+ "recoverStartTime" : 1657021899202,
+ "recoverEndTime" : 1657021899203
+}
+```
+
+### Get transaction pending ack internal stats
+
+The transaction pending ack internal stats that can be retrieved include:
+* **transactionLogStats:** The stats of the transaction pending ack log.
+* **managedLedgerName:** The name of the managed ledger where the transaction pending ack log is stored.
+* **managedLedgerInternalStats:** The internal stats of the managed ledger where the transaction coordinator log is stored. See `[managedLedgerInternalStats](admin-api-topics.md#get-internal-stats)` for more details.
+
+Use one of the following ways to get transaction pending ack internal stats:
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin transactions pending-ack-internal-stats -t my-topic -s mysubName -m
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v3/transactions/getPendingAckInternalStats)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.transactions().getPendingAckInternalStats(topic, subName, boolean metadata);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+The following is an example of the returned values.
+
+```json
+{
+ "pendingAckLogStats" : {
+ "managedLedgerName" : "public/default/persistent/my-topic-mysubName__transaction_pending_ack",
+ "managedLedgerInternalStats" : {
+ "entriesAddedCounter" : 2247,
+ "numberOfEntries" : 2247,
+ "totalSize" : 37212,
+ "currentLedgerEntries" : 104,
+ "currentLedgerSize" : 1732,
+ "lastLedgerCreatedTimestamp" : "2022-06-30T19:02:09.746+08:00",
+ "waitingCursorsCount" : 0,
+ "pendingAddEntriesCount" : 52,
+ "lastConfirmedEntry" : "64:51",
+ "state" : "LedgerOpened",
+ "ledgers" : [ {
+ "ledgerId" : 56,
+ "entries" : 2195,
+ "size" : 36346,
+ "offloaded" : false,
+ "metadata" : "LedgerMetadata{formatVersion=3, ensembleSize=1, writeQuorumSize=1, ackQuorumSize=1, state=CLOSED, length=36346, lastEntryId=2194, digestType=CRC32C, password=OMITTED, ensembles={0=[10.20.240.119:3181]}, customMetadata={component=base64:bWFuYWdlZC1sZWRnZXI=, pulsar/managed-ledger=base64:cHVibGljL2RlZmF1bHQvcGVyc2lzdGVudC9teS10b3BpYy1teXN1Yk5hbWVfX3RyYW5zYWN0aW9uX3BlbmRpbmdfYWNr, application=base64:cHVsc2Fy}}",
+ "underReplicated" : false
+ }, {
+ "ledgerId" : 64,
+ "entries" : 0,
+ "size" : 0,
+ "offloaded" : false,
+ "metadata" : "LedgerMetadata{formatVersion=3, ensembleSize=1, writeQuorumSize=1, ackQuorumSize=1, state=CLOSED, length=866, lastEntryId=51, digestType=CRC32C, password=OMITTED, ensembles={0=[10.20.240.119:3181]}, customMetadata={component=base64:bWFuYWdlZC1sZWRnZXI=, pulsar/managed-ledger=base64:cHVibGljL2RlZmF1bHQvcGVyc2lzdGVudC9teS10b3BpYy1teXN1Yk5hbWVfX3RyYW5zYWN0aW9uX3BlbmRpbmdfYWNr, application=base64:cHVsc2Fy}}",
+ "underReplicated" : false
+ } ],
+ "cursors" : {
+ "__pending_ack_state" : {
+ "markDeletePosition" : "56:-1",
+ "readPosition" : "56:0",
+ "waitingReadOp" : false,
+ "pendingReadOps" : 0,
+ "messagesConsumedCounter" : 0,
+ "cursorLedger" : 57,
+ "cursorLedgerLastEntry" : 0,
+ "individuallyDeletedMessages" : "[]",
+ "lastLedgerSwitchTimestamp" : "2022-06-30T18:55:26.842+08:00",
+ "state" : "Open",
+ "numberOfEntriesSinceFirstNotAckedMessage" : 1,
+ "totalNonContiguousDeletedMessagesRange" : 0,
+ "subscriptionHavePendingRead" : false,
+ "subscriptionHavePendingReplayRead" : false,
+ "properties" : { }
+ }
+ }
+ }
+ }
+}
+```
+
+### Get position stats in pending ack
+
+The position stats in pending ack include:
+* **PendingAck** The position is in pending ack stats.
+* **MarkDelete** The position is already acknowledged.
+* **NotInPendingAck** The position is not acknowledged within a transaction.
+* **PendingAckNotReady** The pending ack has not been initialized.
+* **InvalidPosition** The position is invalid, for example, batch index > batch size.
+
+If you want to know whether the position has been acknowledged, you can use one of the following ways to get position stats pending ack:
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin transactions position-stats-in-pending-ack -t my-topic -s mysubName -l 15 -e 6
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v3/transactions/getPositionStatsInPendingAck)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.transactions().getPositionStatsInPendingAckAsync(topic, subName, ledgerId, entryId, lowWaterMarks);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+The following is an example of the returned values.
+
+```json
+{
+ "State" : "MarkDelete"
+}
+```
+
+## Transaction buffer stats
+
+Transaction buffer handles messages produced to a topic partition within a transaction.
+The messages in the transaction buffer are not visible to consumers until the transactions are committed. The messages in the transaction buffer are discarded when the transactions are aborted.
+
+### Get transaction buffer stats
+
+The transaction buffer stats that can be retrieved include:
+* **state:** The state of this transaction buffer.
+* **maxReadPosition:** The maximum read position of this transaction buffer.
+* **lastSnapshotTimestamps:** The last snapshot timestamp of this transaction buffer.
+* **lowWaterMarks (Optional):** The low watermark details of the transaction buffer.
+* **ongoingTxnSize:** The total number of ongoing transactions in this transaction buffer.
+* **recoverStartTime:** The start timestamp of transaction buffer recovery. `0L` means no startup.
+* **recoverEndTime:** The end timestamp of transaction buffer recovery. `0L` means no startup.
+
+Use one of the following ways to get transaction buffer stats:
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+```shell
+pulsar-admin transactions transaction-buffer-stats -t my-topic -l
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v3/transactions/getTransactionBufferStats)
+
+</TabItem>
+<TabItem value="Java">
+
+```java
+admin.transactions().getTransactionBufferStats(topic, lowWaterMarks);
+```
+
+</TabItem>
+
+</Tabs>
+````
+
+The following is an example of the returned values.
+
+```json
+{
+ "state" : "Ready",
+ "maxReadPosition" : "38:101",
+ "lastSnapshotTimestamps" : 1657021903534,
+ "lowWaterMarks" : {
+ "1" : -1,
+ "2" : -1
+ },
+ "ongoingTxnSize" : 0,
+ "recoverStartTime" : 1657021892850,
+ "recoverEndTime" : 1657021893372
+}
+```
diff --git a/versioned_docs/version-5.0.x/admin-api-tutorial.md b/versioned_docs/version-5.0.x/admin-api-tutorial.md
new file mode 100644
index 00000000000..590267911e5
--- /dev/null
+++ b/versioned_docs/version-5.0.x/admin-api-tutorial.md
@@ -0,0 +1,85 @@
+---
+id: admin-api-tutorial
+title: Tutorial
+sidebar_label: "Tutorial"
+description: Learn how to configure Pulsar admin interfaces if authentication is enabled in your Pulsar instance.
+---
+
+````mdx-code-block
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+````
+
+## Admin setup
+
+Each of the three admin interfaces (the `pulsar-admin` CLI tool, the [REST API](reference-rest-api-overview.md), and the [Java admin API](@pulsar:javadoc:admin@/)) requires some special setup if you have enabled authentication in your Pulsar instance.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+If you have enabled authentication, you need to provide an auth configuration to use the `pulsar-admin` tool. By default, the configuration for the `pulsar-admin` tool is in the [`conf/client.conf`](https://github.com/apache/pulsar/blob/master/conf/client.conf) file. The following are the available parameters:
+
+|Name|Description|Default|
+|----|-----------|-------|
+|webServiceUrl|The web URL for the cluster.|http://localhost:8080/|
+|brokerServiceUrl|The Pulsar protocol URL for the cluster.|pulsar://localhost:6650/|
+|authPlugin|The authentication plugin.| |
+|authParams|The authentication parameters for the cluster, as a comma-separated string.| |
+|useTls|Whether or not TLS authentication will be enforced in the cluster.|false|
+|tlsAllowInsecureConnection|Accept untrusted TLS certificate from client.|false|
+|tlsTrustCertsFilePath|Path for the trusted TLS certificate file.| |
+
+</TabItem>
+<TabItem value="REST API">
+
+You can find details for the REST API exposed by Pulsar brokers in the [REST API doc](pathname:///admin-rest-api/?version=@pulsar:rest_api_version@).
+
+If you want to test REST APIs in postman, you can use the REST API JSON files [here](pathname://@pulsar:rest_api_spec_dir@).
+
+</TabItem>
+<TabItem value="Java">
+
+To use the Java admin API, instantiate a [PulsarAdmin](@pulsar:javadoc:admin@/org/apache/pulsar/client/admin/PulsarAdmin) object, and specify a URL for a Pulsar broker and a [PulsarAdminBuilder](@pulsar:javadoc:admin@/org/apache/pulsar/client/admin/PulsarAdminBuilder) object. The following is a minimal example using `localhost`.
+
+```java
+String url = "http://localhost:8080";
+// Pass auth-plugin class fully-qualified name if Pulsar-security enabled
+String authPluginClassName = "com.org.MyAuthPluginClass";
+// Pass auth-param if auth-plugin class requires it
+String authParams = "param1=value1";
+boolean tlsAllowInsecureConnection = false;
+String tlsTrustCertsFilePath = null;
+PulsarAdmin admin = PulsarAdmin.builder()
+ .authentication(authPluginClassName,authParams)
+ .serviceHttpUrl(url)
+ .tlsTrustCertsFilePath(tlsTrustCertsFilePath)
+ .allowTlsInsecureConnection(tlsAllowInsecureConnection)
+ .build();
+```
+
+If you use multiple brokers, you can use multi-host like Pulsar service. For example,
+
+```java
+String url = "http://localhost:8080,localhost:8081,localhost:8082";
+// Below are the same to the line 2 - line 13 in the code snippet above
+// Pass auth-plugin class fully-qualified name if Pulsar-security enabled
+String authPluginClassName = "com.org.MyAuthPluginClass";
+// Pass auth-param if auth-plugin class requires it
+String authParams = "param1=value1";
+boolean tlsAllowInsecureConnection = false;
+String tlsTrustCertsFilePath = null;
+PulsarAdmin admin = PulsarAdmin.builder()
+ .authentication(authPluginClassName,authParams)
+ .serviceHttpUrl(url)
+ .tlsTrustCertsFilePath(tlsTrustCertsFilePath)
+ .allowTlsInsecureConnection(tlsAllowInsecureConnection)
+ .build();
+```
+
+</TabItem>
+
+</Tabs>
+````
diff --git a/versioned_docs/version-5.0.x/admin-api-use-cases.md b/versioned_docs/version-5.0.x/admin-api-use-cases.md
new file mode 100644
index 00000000000..266cb43ce61
--- /dev/null
+++ b/versioned_docs/version-5.0.x/admin-api-use-cases.md
@@ -0,0 +1,37 @@
+---
+id: admin-api-use-cases
+title: Pulsar admin interfaces - Use cases
+sidebar_label: "Use cases"
+description: Get a comprehensive understanding of use cases of Pulsar admin APIs.
+---
+
+````mdx-code-block
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+````
+
+Pulsar admin APIs are one of the best productivity tools. You can perform various tasks with them, for example:
+
+- Administering Pulsar instances easily by creating, updating, or deleting objects with a single line of command, which increases management efficiency.
+
+- Monitoring Pulsar or troubleshooting issues by getting the status and information about Pulsar clusters, which reduces maintenance costs.
+
+- Facilitating the workflow of application development by implementing admin interface clients using your preferred languages (e.g., Go, Python, C++) based on REST APIs, which enhances developer experiences.
+
+
+
+### Related topics
+
+- To understand basics, see [Pulsar admin API - Overview](admin-api-overview.md)
+
+- To learn common administrative tasks, see [Pulsar admin API - Features](admin-api-features.md).
+
+- To perform administrative operations, see [Pulsar admin API - Tools](admin-api-tools.md).
+
+- To get up quickly, see [Pulsar admin API - Get started](admin-get-started.md).
+
+- To check the detailed usage, see the API references below.
+
+ - [Java admin API](@pulsar:javadoc:admin@/)
+
+ - [REST API](reference-rest-api-overview.md)
diff --git a/versioned_docs/version-5.0.x/admin-get-started.md b/versioned_docs/version-5.0.x/admin-get-started.md
new file mode 100644
index 00000000000..25a2449d4b5
--- /dev/null
+++ b/versioned_docs/version-5.0.x/admin-get-started.md
@@ -0,0 +1,530 @@
+---
+id: admin-api-get-started
+title: Get started
+sidebar_label: "Get started"
+description: Learn how to manage topics in Pulsar using the Pulsar admin CLI or Pulsar admin APIs.
+---
+
+````mdx-code-block
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+````
+
+This guide walks you through the quickest way to get started with the following methods to manage topics.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+[pulsar-admin CLI](/reference/#/@pulsar:version_reference@/pulsar-admin/) is a command-line tool and is available in the bin folder of your Pulsar installation.
+
+</TabItem>
+<TabItem value="REST API">
+
+[REST API](pathname:///admin-rest-api/?version=@pulsar:rest_api_version@) belongs to HTTP calls, which are made against the admin APIs provided by brokers. In addition, both the Java admin API and pulsar-admin CLI use the REST API.
+
+</TabItem>
+<TabItem value="Java">
+
+[Java admin API](@pulsar:javadoc:admin@/) is a programmable interface written in Java.
+
+</TabItem>
+
+</Tabs>
+````
+
+Check the detailed steps below.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"},{"label":"Java","value":"Java"}]}>
+<TabItem value="pulsar-admin">
+
+To manage topics using pulsar-admin CLI, complte the following steps.
+
+1. Set the service URL.
+
+2. Create a partitioned topic.
+
+3. Update the number of a partition.
+
+4. Produce messages to the topic.
+
+5. Check the stats of the topic.
+
+6. Delete the topic.
+
+**Prerequisites**
+
+- Install and start Pulsar standalone. This tutorial runs Pulsar 2.11 as an example.
+
+**Steps**
+
+**Step 1:** Set the service URLs to point to the broker service in [client.conf](https://github.com/apache/pulsar/blob/master/conf/client.conf).
+
+ ```bash
+ webServiceUrl=http://localhost:8080/
+ brokerServiceUrl=pulsar://localhost:6650/
+ ```
+
+**Step 2:** Create a persistent topic named _test-topic-1_ with 6 partitions.
+
+ **Input**
+
+ ```bash
+ bin/pulsar-admin topics create-partitioned-topic \
+ persistent://public/default/test-topic-1 \
+ --partitions 6
+ ```
+
+ **Output**
+
+ There is no output. You can check the status of the topic in Step 5.
+
+**Step 3:** Update the number of the partition to 8.
+
+ **Input**
+
+ ```bash
+ bin/pulsar-admin topics update-partitioned-topic \
+ persistent://public/default/test-topic-1 \
+ --partitions 8
+ ```
+
+ **Output**
+
+ There is no output. You can check the number of partitions in Step 5.
+
+**Step 4:** Produce some messages to the partitioned topic _test-topic-1_.
+
+ **Input**
+
+ ```bash
+ bin/pulsar-perf produce -u pulsar://localhost:6650 -r 1000 -i 1000 persistent://public/default/test-topic-1
+ ```
+
+ **Output**
+
+ ```bash
+ 2023-03-07T15:33:56,832+0800 [main] INFO org.apache.pulsar.testclient.PerformanceProducer - Starting Pulsar perf producer with config: {
+ "confFile" : "/Users/yu/apache-pulsar-2.11.0/conf/client.conf",
+ "serviceURL" : "pulsar://localhost:6650",
+ "authPluginClassName" : "",
+ "authParams" : "",
+ "tlsTrustCertsFilePath" : "",
+ "tlsAllowInsecureConnection" : false,
+ "tlsHostnameVerificationEnable" : false,
+ "maxConnections" : 1,
+ "statsIntervalSeconds" : 1000,
+ "ioThreads" : 1,
+ "enableBusyWait" : false,
+ "listenerName" : null,
+ "listenerThreads" : 1,
+ "maxLookupRequest" : 50000,
+ "topics" : [ "persistent://public/default/test-topic-1" ],
+ "numTestThreads" : 1,
+ "msgRate" : 1000,
+ "msgSize" : 1024,
+ "numTopics" : 1,
+ "numProducers" : 1,
+ "separator" : "-",
+ "sendTimeout" : 0,
+ "producerName" : null,
+ "adminURL" : "http://localhost:8080/",
+
+ ...
+
+ 2023-03-07T15:35:03,769+0800 [Thread-0] INFO org.apache.pulsar.testclient.PerformanceProducer - Aggregated latency stats --- Latency: mean: 8.931 ms - med: 3.775 - 95pct: 32.144 - 99pct: 98.432 - 99.9pct: 216.088 - 99.99pct: 304.807 - 99.999pct: 349.391 - Max: 351.235
+ ```
+
+**Step 5:** Check the internal stats of the partitioned topic _test-topic-1_.
+
+ **Input**
+
+ ```bash
+ bin/pulsar-admin topics partitioned-stats-internal \
+ persistent://public/default/test-topic-1
+ ```
+
+ **Output**
+
+ Below is a part of the output. For detailed explanations of topic stats, see Pulsar statistics.
+
+ ```bash
+ {
+ "metadata" : {
+ "partitions" : 8
+ },
+ "partitions" : {
+ "persistent://public/default/test-topic-1-partition-1" : {
+ "entriesAddedCounter" : 4213,
+ "numberOfEntries" : 4213,
+ "totalSize" : 8817693,
+ "currentLedgerEntries" : 4212,
+ "currentLedgerSize" : 8806289,
+ "lastLedgerCreatedTimestamp" : "2023-03-07T15:33:59.367+08:00",
+ "waitingCursorsCount" : 0,
+ "pendingAddEntriesCount" : 0,
+ "lastConfirmedEntry" : "65:4211",
+ "state" : "LedgerOpened",
+ "ledgers" : [ {
+ "ledgerId" : 49,
+ "entries" : 1,
+ "size" : 11404,
+ "offloaded" : false,
+ "underReplicated" : false
+ }, {
+ "ledgerId" : 65,
+ "entries" : 0,
+ "size" : 0,
+ "offloaded" : false,
+ "underReplicated" : false
+ } ],
+ "cursors" : {
+ "test-subscriptio-1" : {
+ "markDeletePosition" : "49:-1",
+ "readPosition" : "49:0",
+ "waitingReadOp" : false,
+ "pendingReadOps" : 0,
+ "messagesConsumedCounter" : 0,
+ "cursorLedger" : -1,
+ "cursorLedgerLastEntry" : -1,
+ "individuallyDeletedMessages" : "[]",
+ "lastLedgerSwitchTimestamp" : "2023-03-06T16:41:32.801+08:00",
+ "state" : "NoLedger",
+ "numberOfEntriesSinceFirstNotAckedMessage" : 1,
+ "totalNonContiguousDeletedMessagesRange" : 0,
+ "subscriptionHavePendingRead" : false,
+ "subscriptionHavePendingReplayRead" : false,
+ "properties" : { }
+ },
+ "test-subscription-1" : {
+ "markDeletePosition" : "49:-1",
+ "readPosition" : "49:0",
+ "waitingReadOp" : false,
+ "pendingReadOps" : 0,
+ "messagesConsumedCounter" : 0,
+ "cursorLedger" : -1,
+ "cursorLedgerLastEntry" : -1,
+ "individuallyDeletedMessages" : "[]",
+ "lastLedgerSwitchTimestamp" : "2023-03-06T16:41:32.801+08:00",
+ "state" : "NoLedger",
+ "numberOfEntriesSinceFirstNotAckedMessage" : 1,
+ "totalNonContiguousDeletedMessagesRange" : 0,
+ "subscriptionHavePendingRead" : false,
+ "subscriptionHavePendingReplayRead" : false,
+ "properties" : { }
+ }
+ },
+ "schemaLedgers" : [ ],
+ "compactedLedger" : {
+ "ledgerId" : -1,
+ "entries" : -1,
+ "size" : -1,
+ "offloaded" : false,
+ "underReplicated" : false
+ }
+ },
+ ...
+ ```
+
+**Step 6:** Delete the topic _test-topic-1_.
+
+ **Input**
+
+ ```bash
+ bin/pulsar-admin topics delete-partitioned-topic persistent://public/default/test-topic-1
+ ```
+
+ **Output**
+
+ There is no output. You can verify whether the _test-topic-1_ exists or not using the following command.
+
+ **Input**
+
+ List topics in `public/default` namespace.
+
+ ```bash
+ bin/pulsar-admin topics list public/default
+ ```
+
+</TabItem>
+<TabItem value="REST API">
+
+To manage topics using REST API, complete the following steps.
+
+1. Create a partitioned topic
+
+2. Update the number of a partition.
+
+3. Produce messages to the topic.
+
+4. Check the stats of the topic.
+
+5. Delete the topic.
+
+**Prerequisites**
+
+- Install and start Pulsar standalone. This tutorial runs Pulsar 2.11 as an example.
+
+**Steps**
+
+**Step 1:** Create a persistent topic named _test-topic-2_ with 4 partitions.
+
+ **Input**
+
+ ```bash
+ curl -X PUT http://localhost:8080/admin/v2/persistent/public/default/test-topic-2/partitions -H 'Content-Type: application/json' -d "4"
+ ```
+
+ **Output**
+
+ There is no output. You can check the topic in Step 4.
+
+**Step 2:** Update the number of the partition to 5.
+
+ **Input**
+
+ ```bash
+ curl -X POST http://localhost:8080/admin/v2/persistent/public/default/test-topic-2/partitions -H 'Content-Type: application/json' -d "5"
+ ```
+
+ **Output**
+
+ There is no output. You can check the status of the topic in Step 4.
+
+**Step 3:** Produce some messages to the partitioned topic _test-topic-2_.
+
+ **Input**
+
+ ```bash
+ bin/pulsar-perf produce -u pulsar://localhost:6650 -r 1000 -i 1000 persistent://public/default/test-topic-2
+ ```
+
+ **Output**
+
+ ```bash
+ 2023-03-08T15:47:06,268+0800 [main] INFO org.apache.pulsar.testclient.PerformanceProducer - Starting Pulsar perf producer with config: {
+ "confFile" : "/Users/yu/apache-pulsar-2.11.0/conf/client.conf",
+ "serviceURL" : "pulsar://localhost:6650",
+ "authPluginClassName" : "",
+ "authParams" : "",
+ "tlsTrustCertsFilePath" : "",
+ "tlsAllowInsecureConnection" : false,
+ "tlsHostnameVerificationEnable" : false,
+ "maxConnections" : 1,
+ "statsIntervalSeconds" : 1000,
+ "ioThreads" : 1,
+ "enableBusyWait" : false,
+ "listenerName" : null,
+ "listenerThreads" : 1,
+ "maxLookupRequest" : 50000,
+ "topics" : [ "persistent://public/default/test-topic-2" ],
+ "numTestThreads" : 1,
+ "msgRate" : 1000,
+ "msgSize" : 1024,
+ "numTopics" : 1,
+ "numProducers" : 1,
+ "separator" : "-",
+ "sendTimeout" : 0,
+ "producerName" : null,
+ "adminURL" : "http://localhost:8080/",
+ "deprecatedAuthPluginClassName" : null,
+ "maxOutstanding" : 0,
+ "maxPendingMessagesAcrossPartitions" : 0,
+ "partitions" : null,
+ "numMessages" : 0,
+ "compression" : "NONE",
+ "payloadFilename" : null,
+ "payloadDelimiter" : "\\n",
+ "batchTimeMillis" : 1.0,
+ "batchMaxMessages" : 1000,
+ "batchMaxBytes" : 4194304,
+ "testTime" : 0,
+ "warmupTimeSeconds" : 1.0,
+ "encKeyName" : null,
+ "encKeyFile" : null,
+ "delay" : 0,
+ "exitOnFailure" : false,
+ "messageKeyGenerationMode" : null,
+ "producerAccessMode" : "Shared",
+ "formatPayload" : false,
+ "formatterClass" : "org.apache.pulsar.testclient.DefaultMessageFormatter",
+ "transactionTimeout" : 10,
+ "numMessagesPerTransaction" : 50,
+ "isEnableTransaction" : false,
+
+ "isAbortTransaction" : false,
+ "histogramFile" : null
+ }
+
+ ...
+
+ 2023-03-08T15:53:28,178+0800 [Thread-0] INFO org.apache.pulsar.testclient.PerformanceProducer - Aggregated latency stats --- Latency: mean: 4.481 ms - med: 2.918 - 95pct: 10.710 - 99pct: 38.928 - 99.9pct: 112.689 - 99.99pct: 154.241 - 99.999pct: 193.249 - Max: 241.717
+ ```
+
+**Step 4:** Check the internal stats of the topic _test-topic-2_.
+
+ **Input**
+
+ ```bash
+ curl -X GET http://localhost:8080/admin/v2/persistent/public/default/test-topic-2/partitioned-internalStats
+ ```
+
+ **Output**
+
+ For detailed explanations of topic stats, see Pulsar statistics.
+
+ ```bash
+ {"metadata":{"partitions":5},"partitions":{"persistent://public/default/test-topic-2-partition-3":{"entriesAddedCounter":47087,"numberOfEntries":47087,"totalSize":80406959,"currentLedgerEntries":47087,"currentLedgerSize":80406959,"lastLedgerCreatedTimestamp":"2023-03-08T15:47:07.273+08:00","waitingCursorsCount":0,"pendingAddEntriesCount":0,"lastConfirmedEntry":"117:47086","state":"LedgerOpened","ledgers":[{"ledgerId":117,"entries":0,"size":0,"offloaded":false,"underReplicated":false} [...]
+ ```
+
+**Step 5:** Delete the topic _test-topic-2_.
+
+ **Input**
+
+ ```
+ curl -X DELETE http://localhost:8080/admin/v2/persistent/public/default/test-topic-2/partitions
+ ```
+
+ **Output**
+
+ There is no output. You can verify whether the _test-topic-2_ exists or not using the following command.
+
+ **Input**
+
+ List topics in `public/default` namespace.
+
+ ```
+ curl -X GET http://localhost:8080/admin/v2/persistent/public/default
+ ```
+
+</TabItem>
+<TabItem value="Java">
+
+To manage topics using Java admin API, complete following steps.
+
+1. Initiate a Pulsar Java client.
+
+2. Create a partitioned topic
+
+3. Update the number of a partition.
+
+4. Produce messages to the topic.
+
+5. Check the stats of the topic.
+
+6. Delete the topic.
+
+**Prerequisites**
+
+- Prepare a Java project and add the following dependency to your POM file.
+
+ ```java
+ <dependency>
+ <groupId>org.apache.pulsar</groupId>
+ <artifactId>pulsar-client-admin</artifactId>
+ <version>@pulsar:version@</version>
+ </dependency>
+ ```
+
+**Steps**
+
+**Step 1:** Initiate a Pulsar Java client in your Java project.
+
+ **Input**
+
+ ```java
+ String url = "http://localhost:8080";
+ PulsarAdmin admin = PulsarAdmin.builder()
+ .serviceHttpUrl(url)
+ .build();
+ ```
+
+**Step 2:** Create a partitioned topic _test-topic-1_ with 4 partitions.
+
+ **Input**
+
+ ```java
+ admin.topics().createPartitionedTopic("persistent://public/default/test-topic-1", 4);
+ ```
+
+**Step 3:** Update the number of the partition to 5.
+
+ **Input**
+
+ ```java
+ admin.topics().updatePartitionedTopic("test-topic-1", 5);
+ ```
+
+**Step 4:** Produce some messages to the topic _test-topic-1_.
+
+ **Input**
+
+ ```java
+ PulsarClient client = PulsarClient.builder()
+ .serviceUrl("pulsar://localhost:6650")
+ .build();
+
+ Producer<String> producer = client.newProducer(Schema.STRING)
+ .topic("test-topic-1")
+ .blockIfQueueFull(true)
+ .create();
+
+ for (int i = 0; i < 100; ++i) {
+ producer.newMessage().value("test").send();
+ }
+ producer.close();
+ client.close();
+ ```
+
+**Step 5:** Check the stats of the topic _test-topic-1_.
+
+ **Input**
+
+ ```java
+ PartitionedTopicStats stats = admin.topics().getPartitionedStats("persistent://public/default/test-topic-1",false);
+ System.out.println(stats.getMsgInCounter());
+ ```
+
+ **Output**
+
+ ```java
+ 100
+ ```
+
+**Step 6:** Delete the topic _test-topic-1_.
+
+ **Input**
+
+ ```java
+ admin.topics().deletePartitionedTopic("test-topic-1");
+ ```
+
+</TabItem>
+
+</Tabs>
+````
+
+## Related topics
+
+- To understand basics, see [Pulsar admin API - Overview](admin-api-overview.md)
+
+- To learn usage scenarios, see [Pulsar admin API - Use cases](admin-api-use-cases.md).
+
+- To learn common administrative tasks, see [Pulsar admin API - Features](admin-api-features.md).
+
+- To perform administrative operations, see [Pulsar admin API - Tools](admin-api-tools.md).
+
+- To check the detailed usage, see the references below.
+
+ - [pulsar-admin CLI](/reference/#/@pulsar:version_reference@/pulsar-admin/)
+
+ - Pulsar admin APIs
+
+ - [REST API](reference-rest-api-overview.md)
+
+ - [Java admin API](@pulsar:javadoc:admin@/)
\ No newline at end of file
diff --git a/versioned_docs/version-5.0.x/administration-anti-affinity-namespaces.md b/versioned_docs/version-5.0.x/administration-anti-affinity-namespaces.md
new file mode 100644
index 00000000000..54fe5f9ebdc
--- /dev/null
+++ b/versioned_docs/version-5.0.x/administration-anti-affinity-namespaces.md
@@ -0,0 +1,59 @@
+---
+id: administration-anti-affinity-namespaces
+title: Anti-affinity namespaces
+sidebar_label: "Anti-affinity namespaces"
+description: Get a comprehensive understanding of anti-affinity namespaces in Pulsar.
+---
+
+## Distribute anti-affinity namespaces across failure domains
+
+When your application has multiple namespaces and you want one of them available all the time to avoid any downtime, you can group these namespaces and distribute them across different [failure domains](reference-terminology.md#failure-domain) and different brokers. Thus, if one of the failure domains is down (due to release rollout or brokers restart), it only disrupts namespaces owned by that specific failure domain and the rest of the namespaces owned by other domains remain available [...]
+
+Such a group of namespaces has anti-affinity to each other, that is, all the namespaces in this group are [anti-affinity namespaces](reference-terminology.md#anti-affinity-namespaces) and are distributed to different failure domains in a load-balanced manner.
+
+As illustrated in the following figure, Pulsar has 2 failure domains (Domain1 and Domain2) and each domain has 2 brokers in it. You can create an anti-affinity namespace group that has 4 namespaces in it, and all the 4 namespaces have anti-affinity to each other. The load manager tries to distribute namespaces evenly across all the brokers in the same domain. Since each domain has 2 brokers, every broker owns one namespace from this anti-affinity namespace group, and you can see each dom [...]
+
+
+
+The load manager follows an even distribution policy across failure domains to assign anti-affinity namespaces. The following table outlines the even-distributed assignment sequence illustrated in the above figure.
+
+| Assignment sequence | Namespace | Failure domain candidates | Broker candidates | Selected broker |
+|:---|:------------|:------------------|:------------------------------------|:-----------------|
+| 1 | Namespace1 | Domain1, Domain2 | Broker1, Broker2, Broker3, Broker4 | Domain1:Broker1 |
+| 2 | Namespace2 | Domain2 | Broker3, Broker4 | Domain2:Broker3 |
+| 3 | Namespace3 | Domain1, Domain2 | Broker2, Broker4 | Domain1:Broker2 |
+| 4 | Namespace4 | Domain2 | Broker4 | Domain2:Broker4 |
+
+:::tip
+
+* Each namespace belongs to only one anti-affinity group. If a namespace with an existing anti-affinity assignment is assigned to another anti-affinity group, the original assignment is dropped.
+
+* If there are more anti-affinity namespaces than failure domains, the load manager distributes namespaces evenly across all the domains, and also every domain distributes namespaces evenly across all the brokers under that domain.
+
+:::
+
+### Create a failure domain and register brokers
+
+:::note
+
+One broker can only be registered to a single failure domain.
+
+:::
+
+To create a domain under a specific cluster and register brokers, run the following command:
+
+```bash
+pulsar-admin clusters create-failure-domain <cluster-name> --domain-name <domain-name> --broker-list <broker-list-comma-separated>
+```
+
+You can also view, update, and delete domains under a specific cluster. For more information, refer to [Pulsar admin docs](/reference/#/@pulsar:version_reference@/pulsar-admin/).
+
+### Create an anti-affinity namespace group
+
+An anti-affinity group is created automatically when the first namespace is assigned to the group. To assign a namespace to an anti-affinity group, run the following command. It sets an anti-affinity group name for a namespace.
+
+```bash
+pulsar-admin namespaces set-anti-affinity-group <namespace> --group <group-name>
+```
+
+For more information about `anti-affinity-group` related commands, refer to [Pulsar admin docs](/reference/#/@pulsar:version_reference@/pulsar-admin/).
diff --git a/versioned_docs/version-5.0.x/administration-dekaf-ui.md b/versioned_docs/version-5.0.x/administration-dekaf-ui.md
new file mode 100644
index 00000000000..c4154f94dcc
--- /dev/null
+++ b/versioned_docs/version-5.0.x/administration-dekaf-ui.md
@@ -0,0 +1,24 @@
+---
+id: administration-dekaf-ui
+title: Dekaf UI
+sidebar_label: "Dekaf UI"
+description: Dekaf is a recommended open-source web UI for managing Apache Pulsar.
+---
+
+Dekaf is a recommended web-based UI for Apache Pulsar, licensed under Apache 2.0.
+
+
+
+- 🏠 [GitHub repo](https://github.com/visortelle/dekaf)
+- 📚 [Quick-start](https://github.com/visortelle/dekaf?tab=readme-ov-file#quick-start)
+- 📚 [Consumer session tutorial](https://github.com/visortelle/dekaf/blob/main/docs/consume/consumer-session-tutorial.md)
+- 📚 [Configuration reference](https://github.com/visortelle/dekaf/blob/main/docs/configuration-reference.md)
+
+## Features
+
+- Browse Pulsar resources like tenants, namespaces, topics, subscriptions, consumers and producers.
+- View stats for each resource.
+- Create topics, edit namespace and topic policies, split bundles, etc.
+- View messages in a topic or multiple topics at once. Filter messages, colorize them. Save and reuse browse sessions.
+
+Please share your feedback as the project maintainers prioritize bugfixes and new features, based on user requests.
diff --git a/versioned_docs/version-5.0.x/administration-geo.md b/versioned_docs/version-5.0.x/administration-geo.md
new file mode 100644
index 00000000000..2460f2655be
--- /dev/null
+++ b/versioned_docs/version-5.0.x/administration-geo.md
@@ -0,0 +1,554 @@
+---
+id: administration-geo
+title: Pulsar geo-replication
+sidebar_label: "Geo-replication"
+description: Get a comprehensive understanding of geo-replication in Pulsar.
+---
+
+````mdx-code-block
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+````
+
+## Enable geo-replication for a namespace
+
+You must enable geo-replication on a [per-tenant basis](#concepts-multi-tenancy) in Pulsar. For example, you can enable geo-replication between two specific clusters only when a tenant has access to both clusters.
+
+Geo-replication is managed at the namespace level, which means you only need to create and configure a namespace to replicate messages between two or more provisioned clusters that a tenant can access.
+
+Complete the following tasks to enable geo-replication for a namespace:
+
+* [Enable a geo-replication namespace](#enable-geo-replication-at-namespace-level)
+* [Configure that namespace to replicate across two or more provisioned clusters](admin-api-namespaces.md#configure-replication-clusters)
+
+### Configuration store and geo-replication setup
+
+Geo-replication setup — including cluster registrations, tenants, namespaces, partitioned topic metadata, and their policies — is stored in the [configuration store](concepts-architecture-overview.md#configuration-store). Individual topic partitions and non-partitioned topics are not part of the configuration store; they are local to each cluster and tracked in the cluster's [metadata store](concepts-architecture-overview.md#metadata-store). A shared configuration store is not required f [...]
+
+There are three approaches for managing the configuration store in a geo-replicated setup:
+
+#### Independent configuration stores (default)
+
+By default, each Pulsar cluster uses its [metadata store](concepts-architecture-overview.md#metadata-store) as the [configuration store](concepts-architecture-overview.md#configuration-store) as well, so each cluster independently manages its own cluster registrations, tenants, namespaces, partitioned topic metadata, and their policies. To set up geo-replication, all participating clusters must be registered in each other and the tenant and namespace must be created with matching replica [...]
+
+#### Shared configuration store
+
+Clusters can share a dedicated [configuration store](concepts-architecture-overview.md#configuration-store) that is separate from each cluster's local metadata store. A shared configuration store is typically deployed across multiple regions or zones for fault tolerance. All clusters that use it share the same cluster registrations, tenants, namespaces, partitioned topic metadata, and their policies, so any change made on one cluster is immediately visible to all others.
+
+#### Configuration synchronization via `configurationMetadataSyncEventTopic`
+
+When independent configuration stores are used on each cluster, configuration store metadata can still be synchronized across clusters using the `configurationMetadataSyncEventTopic` setting. To bootstrap this setup, each participating cluster must be independently configured with its own cluster registration, plus a dedicated tenant and namespace to hold the sync topic. Once geo-replication is active for that namespace, configuration store metadata — including subsequent cluster registr [...]
+
+#### Topic policies
+
+Topic policies are shared via geo-replication when the namespace has geo-replication enabled, regardless of which of the configuration store approaches is used. Both local (single-cluster) and global (all-clusters) policies are supported. Global topic policies apply to all clusters unless it has been overridden with a local topic policy in a specific cluster. Topic policies require `topicLevelPoliciesEnabled=true` in broker configuration (enabled by default).
+
+#### Creation of topics in geo-replication
+
+For **non-partitioned topics**, topic auto-creation must be enabled at the broker level (the default) or in the namespace policy, or the topic must be created explicitly in each cluster.
+
+For **partitioned topics**, note that partitioned topic metadata (the topic name and partition count) is stored in the configuration store, while the individual topic partitions themselves are local to each cluster. When `createTopicToRemoteClusterForReplication=true` (the default), it is sufficient to create the topic in a single cluster — Pulsar automatically creates the matching partitioned topic metadata in remote clusters. Despite its name, this setting applies only to partitioned t [...]
+
+#### Cascading topic deletions
+
+The configuration approach also determines how changes to the replication clusters configuration propagate between clusters. In particular, certain configuration changes can trigger automatic topic deletions on remote clusters. See [Cascading topic deletions when modifying the replication clusters configuration](#cascading-topic-deletions-when-modifying-the-replication-clusters-configuration) for details.
+
+### Replication configuration settings
+
+The target clusters for replication of a message are determined by a hierarchy of settings at the tenant, namespace, topic, and message level:
+
+* **Tenant `allowed-clusters`**: Specifies which clusters the tenant is permitted to use for replication. An empty value means all clusters are allowed. Note that this setting cannot be modified once the tenant has existing namespaces, so it must be configured before creating any namespaces under the tenant.
+
+* **Namespace `clusters`**: Defines the default set of clusters that messages in the namespace are replicated to.
+
+* **Namespace `allowed-clusters`**: Further restricts which clusters are permitted for replication at the namespace level, overriding the tenant-level setting. Introduced in [PIP-321](https://github.com/apache/pulsar/blob/master/pip/pip-321.md).
+
+* **Topic-level policies**: Can override the namespace-level `clusters` setting for a specific topic. Topic policies can be **local** (applying only to the local cluster) or **global** (replicated to all clusters in the geo-replication set, see [PIP-92](https://github.com/apache/pulsar/blob/master/pip/pip-92.md)). Note that `allowed-clusters` has not been implemented at the topic level; [PIP-321](https://github.com/apache/pulsar/blob/master/pip/pip-321.md) mentions that it could be added [...]
+
+* **Message-level replication control**: Producers can override which clusters a specific message is replicated to using the [`replicationClusters`](@pulsar:javadoc:client@/4.1.x/org/apache/pulsar/client/api/TypedMessageBuilder.html#replicationClusters(java.util.List)) method in the client API, or disable replication entirely for a message using [`disableReplication`](@pulsar:javadoc:client@/4.1.x/org/apache/pulsar/client/api/TypedMessageBuilder.html#disableReplication()) (see [Selective [...]
+
+The `clusters` and `allowed-clusters` settings are resolved hierarchically. When the tenant-level `allowed-clusters` is non-empty, all clusters specified in namespace-level `allowed-clusters` must be a subset of it — this is validated when `allowed-clusters` is modified at the namespace level. Namespace-level `allowed-clusters` can further restrict the tenant-level configuration, and topic-level policies can override the namespace-level `clusters` setting for a specific topic.
+
+### 1-way (unidirectional) and 2-way (bidirectional) geo-replication
+
+Geo-replication can be configured as 1-way (unidirectional) or 2-way (bidirectional). The available options depend on whether a shared configuration store is used.
+
+#### Replication direction with a shared configuration store
+
+When a shared configuration store is used, namespace configuration is shared across all clusters, so geo-replication is always 2-way at the namespace level. Individual topics can be made unidirectional by adding a local topic-level `clusters` policy on a specific cluster that includes only the local cluster. This prevents messages produced on that cluster from being replicated to others. However, since topic policies do not include `allowed-clusters`, producers can still override this us [...]
+
+#### Replication direction with separate metadata stores
+
+When each cluster uses its own metadata store, 1-way or 2-way replication is determined by the namespace `clusters` and `allowed-clusters` settings on each cluster:
+
+* **2-way replication**: Both clusters include each other in their namespace `clusters` and `allowed-clusters` settings, so messages flow in both directions.
+
+* **1-way replication**: On the cluster that should not replicate outbound, set both `clusters` and `allowed-clusters` to include only the local cluster. The remote cluster can still replicate inbound to this cluster if it is configured to do so.
+ * **`allowed-clusters`**: Forcefully prevents replication to any cluster not listed. This cannot be overridden by producers using the message-level `replicationClusters` setting.
+ * **`clusters`**: Sets the default replication targets. If only the local cluster is listed, outbound replication is disabled by default, though producers can still override this per-message using `replicationClusters` unless `allowed-clusters` also restricts it.
+
+:::note
+The [replicated subscription](#replicated-subscriptions) feature requires 2-way geo-replication and is not available when geo-replication is configured as 1-way.
+:::
+
+## Local persistence and forwarding
+
+When messages are produced on a Pulsar topic, messages are first persisted in the local cluster, and then forwarded asynchronously to the remote clusters.
+
+In normal cases, when connectivity issues are none, messages are replicated immediately, at the same time as they are dispatched to local consumers. Typically, the network [round-trip time](https://en.wikipedia.org/wiki/Round-trip_delay_time) (RTT) between the remote regions defines end-to-end delivery latency.
+
+Applications can create producers and consumers in any of the clusters, even when the remote clusters are not reachable (like during a network partition).
+
+Producers and consumers can publish messages to and consume messages from any cluster in a Pulsar instance. However, subscriptions cannot only be local to the cluster where the subscriptions are created but also can be transferred between clusters after the replicated subscription is enabled. Once the replicated subscription is enabled, you can keep the subscription state in synchronization. Therefore, a topic can be asynchronously replicated across multiple geographical regions. In case [...]
+
+
+
+In the aforementioned example, the **T1** topic is replicated among three clusters, **Cluster-A**, **Cluster-B**, and **Cluster-C**.
+
+All messages produced in any of the three clusters are delivered to all subscriptions in other clusters. In this case, **C1** and **C2** consumers receive all messages that **P1**, **P2**, and **P3** producers publish. Ordering is still guaranteed on a per-producer basis.
+
+## Configure replication
+
+To configure geo-replicated clusters, complete the following steps.
+
+### Step 1: Connect replication clusters
+
+To replicate data among clusters, you need to configure each cluster to connect to the other. You can use the [`pulsar-admin`](/reference/#/@pulsar:version_reference@/pulsar-admin/) tool to create a connection.
+
+**Example**
+
+Suppose that you have 3 replication clusters: `us-west`, `us-cent`, and `us-east`.
+
+1. Configure the connection from `us-west` to `us-east`.
+
+ Run the following command on `us-west`.
+
+ ```shell
+ bin/pulsar-admin clusters create \
+ --broker-url pulsar://<DNS-OF-US-EAST>:<PORT> \
+ --url http://<DNS-OF-US-EAST>:<PORT> \
+ us-east
+ ```
+
+:::tip
+
+ - If you want to use a secure connection for a cluster, you can use the flags `--broker-url-secure` and `--url-secure`. For more information, see [pulsar-admin clusters create](/reference/#/@pulsar:version_reference@/pulsar-admin/clusters?id=create).
+ - Different clusters may have different authentications. You can use the authentication flag `--auth-plugin` and `--auth-parameters` together to set cluster authentication, which overrides `brokerClientAuthenticationPlugin` and `brokerClientAuthenticationParameters` if `authenticationEnabled` sets to `true` in `broker.conf` and `standalone.conf`. For more information, see [authentication and authorization](concepts-authentication.md).
+
+:::
+
+2. Configure the connection from `us-west` to `us-cent`.
+
+ Run the following command on `us-west`.
+
+ ```shell
+ bin/pulsar-admin clusters create \
+ --broker-url pulsar://<DNS-OF-US-CENT>:<PORT> \
+ --url http://<DNS-OF-US-CENT>:<PORT> \
+ us-cent
+ ```
+
+3. Run similar commands on `us-east` and `us-cent` to create connections among clusters.
+
+### Step 2: Grant permissions to properties
+
+To replicate to a cluster, the tenant needs permission to use that cluster. You can grant permission to the tenant when you create the tenant or grant it later.
+
+Specify all the intended clusters when you create a tenant:
+
+```shell
+bin/pulsar-admin tenants create my-tenant \
+--admin-roles my-admin-role \
+--allowed-clusters us-west,us-east,us-cent
+```
+
+To update permissions of an existing tenant, use `update` instead of `create`.
+
+### Step 3: Enable geo-replication
+
+You can enable geo-replication at **namespace** or **topic** level.
+
+#### Enable geo-replication at namespace level
+
+You can create a namespace with the following command sample.
+
+```shell
+bin/pulsar-admin namespaces create my-tenant/my-namespace
+```
+
+Initially, the namespace is not assigned to any cluster. You can assign the namespace to clusters using the `set-clusters` subcommand:
+
+```shell
+bin/pulsar-admin namespaces set-clusters my-tenant/my-namespace \
+--clusters us-west,us-east,us-cent
+```
+
+#### Enable geo-replication at topic level
+
+You can set geo-replication at topic level using the command `pulsar-admin topics set-replication-clusters`. For the latest and complete information about `Pulsar admin`, including commands, flags, descriptions, and more information, see [Pulsar admin docs](/reference/#/@pulsar:version_reference@/pulsar-admin/).
+
+```shell
+bin/pulsar-admin topics set-replication-clusters --clusters us-west,us-east,us-cent my-tenant/my-namespace/my-topic
+```
+
+:::tip
+
+- You can change the replication clusters for a namespace at any time, without disruption to ongoing traffic. Replication channels are immediately set up or stopped in all clusters as soon as the configuration changes.
+- Once you create a geo-replication namespace, any topics that producers or consumers create within that namespace are replicated across clusters. Typically, each application uses the `serviceUrl` for the local cluster.
+- If you are using Pulsar version `2.10.x`, to enable geo-replication at topic level, you need to change the following configurations in the `conf/broker.conf` or `conf/standalone.conf` file to enable topic policies service.
+
+```conf
+systemTopicEnabled=true
+topicLevelPoliciesEnabled=true
+```
+
+:::
+
+### Step 4: Use topics with geo-replication
+
+#### Selective replication
+
+By default, messages are replicated to all clusters configured for the namespace. You can restrict replication selectively by specifying a replication list for a message, and then that message is replicated only to the subset in the replication list.
+
+The following is an example of the [Java API](/docs/client-libraries/java). Note the use of the `replicationClusters` method when you construct the [Message](@pulsar:javadoc:client@/org/apache/pulsar/client/api/Message) object:
+
+```java
+List<String> restrictReplicationTo = Arrays.asList(
+ "us-west",
+ "us-east"
+);
+
+Producer producer = client.newProducer()
+ .topic("some-topic")
+ .create();
+
+producer.newMessage()
+ .value("my-payload".getBytes())
+ .replicationClusters(restrictReplicationTo)
+ .send();
+```
+
+#### Topic stats
+
+You can check topic-specific statistics for geo-replication topics using one of the following methods.
+
+````mdx-code-block
+<Tabs groupId="api-choice"
+ defaultValue="pulsar-admin"
+ values={[{"label":"pulsar-admin","value":"pulsar-admin"},{"label":"REST API","value":"REST API"}]}>
+<TabItem value="pulsar-admin">
+
+Use the [`pulsar-admin topics stats`](/reference/#/@pulsar:version_reference@/pulsar-admin/topics?id=stats) command.
+
+```shell
+bin/pulsar-admin topics stats persistent://my-tenant/my-namespace/my-topic
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/getStats)
+
+</TabItem>
+
+</Tabs>
+````
+
+Each cluster reports its own local stats, including the incoming and outgoing replication rates and backlogs.
+
+#### Geo-replication topic deletion
+
+**Explicit topic deletion**
+
+The recommended procedure for deleting a geo-replication topic from all clusters is:
+
+1. Ensure there are no active producers or consumers on the topic across all clusters before proceeding. If any are present when the next step is performed, the topic will be forcefully deleted from under them. If auto-topic creation is also enabled, the topic may be immediately recreated.
+2. Set a global topic-level `clusters` policy to include only the local cluster. This triggers the cascading deletion mechanism to remove the topic (including topic partitions in the case of a partitioned topic) and clean up schemas and local topic policies on all excluded clusters. Producers and consumers connected to an excluded cluster will be rejected from reconnecting. See [Cascading topic deletions when modifying the replication clusters configuration](#cascading-topic-deletions-wh [...]
+3. Delete the topic. Geo-replication is now disabled, so the deletion only affects the local cluster.
+4. Run `pulsar-admin topicPolicies delete <topic>` on each cluster to remove the remaining topic-level policy state. If active producers or consumers are still present at this point, the topic may be recreated and geo-replication re-enabled, which is why step 1 is a prerequisite.
+
+Without this procedure, forcefully deleting a topic on one cluster leaves it orphaned — it still exists on peer clusters and geo-replication from those clusters remains active. If auto-topic creation is enabled on the cluster where the topic was deleted, the topic may be recreated through auto-creation or because `createTopicToRemoteClusterForReplication=true` is set on a peer cluster.
+
+When namespace or topic configuration is shared via a shared configuration store or synchronized via `configurationMetadataSyncEventTopic`, forcefully deleting a topic propagates the deletion to all clusters that share or receive the configuration. However, replication delays may cause the topic to be recreated before the deletion takes effect everywhere. For this reason, it is recommended to follow the procedure above.
+
+To remove a topic from a specific cluster only, set a global topic-level `clusters` policy that excludes that cluster. The broker automatically deletes the topic (including topic partitions in the case of a partitioned topic) on the excluded cluster. Do not remove the global topic-level policy afterward, as this would allow the namespace-level `clusters` policy to take effect and potentially re-enable replication. To later delete the topic from all clusters, follow the full procedure above.
+
+To retain the topic in a specific cluster while removing it from all others, follow the procedure above on the cluster where the topic should be retained, but omit steps 3 and 4.
+
+**Deletion by garbage collection**
+
+A geo-replication topic is also automatically deleted by garbage collection when `brokerDeleteInactiveTopicsEnabled=true` and no producers or consumers are connected to it. The additional conditions depend on the `brokerDeleteInactiveTopicsMode` setting:
+
+- `delete_when_no_subscriptions`: the topic is deleted when there are no subscriptions.
+- `delete_when_subscriptions_caught_up`: the topic is deleted when all subscriptions have caught up and there is no backlog.
+
+The `brokerDeleteInactiveTopicsMode` setting can be overridden at the namespace level with the `inactive-topic-policies`.
+
+Each region independently decides when it is safe to delete the topic locally. To trigger garbage collection, close all producers and consumers on the topic and delete all local subscriptions in every replication cluster. When Pulsar determines that no valid subscription remains across the system, it garbage collects the topic.
+
+## Cascading topic deletions when modifying the replication clusters configuration
+
+:::warning
+
+Modifying the `clusters` configuration at the namespace or topic policy level can automatically trigger topic deletions on excluded clusters. Always maintain independent backups if protection against accidental deletions is a requirement.
+
+:::
+
+### Namespace-level deletions
+
+When namespace configuration is shared or synchronized across clusters (via a shared configuration store or `configurationMetadataSyncEventTopic`, see [Configuration store and geo-replication setup](#configuration-store-and-geo-replication-setup)), removing a cluster from the namespace `clusters` configuration automatically deletes all topics in that namespace on the excluded cluster. When namespace configuration is not shared or synchronized, namespace-level policy changes remain local [...]
+
+If the namespace-level `allowed-clusters` is modified to exclude a cluster, topics on that cluster are also deleted regardless of any topic-level `clusters` policy, since `clusters` must be a subset of `allowed-clusters`.
+
+### Topic-level deletions
+
+Since topic policies are always shared via geo-replication when the namespace has geo-replication enabled (see [Topic policies](#topic-policies)), updating a global topic-level `clusters` policy to exclude a cluster deletes that topic and all its partitions on the excluded cluster, regardless of whether namespace configuration is shared or synchronized. Schemas and local topic policies are cleaned up after the last topic partition is deleted. Topic-level policy updates follow the replica [...]
+
+### Retaining specific topics
+
+To prevent a specific topic from being deleted when the namespace `clusters` configuration changes, set a global topic-level `clusters` policy for that topic listing the clusters where it should be retained. This overrides the namespace-level `clusters` policy for that topic. Since it is not currently possible to override the namespace-level `allowed-clusters` in a topic policy, this protection does not apply if `allowed-clusters` is also changed to exclude a cluster.
+
+There is no single configuration that protects all topics in a namespace — the policy must be applied to each topic individually. For additional protection against the global topic-level policy itself being modified to exclude a cluster, a local topic-level `clusters` policy can also be set on that cluster to include only the local cluster.
+
+Geo-replication is designed for high availability and disaster recovery, not as a substitute for backups. A misconfigured `clusters` policy can trigger cascading topic deletions on peer clusters.
+
+## Replicated subscriptions
+
+Pulsar supports replicated subscriptions, so you can keep the subscription state in sync, within a sub-second timeframe, in the context of a topic that is being asynchronously replicated across multiple geographical regions.
+
+In case of failover, a consumer can restart consuming from the failure point in a different cluster.
+
+### Enable replicated subscription
+
+:::note
+
+Replicated subscriptions require [2-way geo-replication](#1-way-and-2-way-geo-replication) to be properly configured between all participating clusters. See [1-way and 2-way geo-replication](#1-way-and-2-way-geo-replication) for configuration requirements.
+
+:::
+
+If you want to use replicated subscriptions in Pulsar:
+
+* Ensure that `enableReplicatedSubscriptions` is `true` in [`broker.conf`](https://github.com/apache/pulsar/blob/v4.1.3/conf/broker.conf#L728-L729). This is enabled by default.
+
+* For consumer side: replicated subscription is disabled by default. You can enable replicated subscriptions when creating a consumer.
+
+ ```java
+ Consumer<String> consumer = client.newConsumer(Schema.STRING)
+ .topic("my-topic")
+ .subscriptionName("my-subscription")
+ .replicateSubscriptionState(true)
+ .subscribe();
+ ```
+
+### Advantages
+
+The advantages of replicated subscription are as follows.
+
+ * It is easy to implement the logic.
+ * You can choose to enable or disable replicated subscription.
+ * When you enable it, the overhead is low, and it is easy to configure.
+ * When you disable it, the overhead is zero.
+
+### Limitations
+
+The limitations of replicated subscription are as follows.
+
+* Replicated subscriptions use periodic snapshots to establish a consistent association between message positions across clusters. Snapshots are taken every `replicatedSubscriptionsSnapshotFrequencyMillis` milliseconds (default: 1000 ms), but the effective granularity of mark-delete position updates on the remote cluster depends on how many messages are produced between snapshots. See [Replicated subscriptions snapshot configuration and tuning](#replicated-subscriptions-snapshot-configur [...]
+* Only the mark-delete position (the baseline cursor position) is replicated — individual acknowledgments are not. Messages acknowledged out of order may be redelivered after a cluster failover.
+* Replicated subscriptions do not provide consistent behavior when consumers are active on multiple clusters simultaneously. Most messages will be processed on both clusters (duplicate processing), and some may be processed on either cluster depending on replication timing. To avoid this, process messages on a single cluster at a time when using replicated subscriptions.
+* Delayed message delivery impairs subscription replication. The mark-delete position does not advance until delayed messages have been delivered and acknowledged, so replication lags behind accordingly.
+
+:::note
+
+* A [snapshot attempt](https://github.com/apache/pulsar/blob/master/pip/pip-33.md#constructing-a-cursor-snapshot) is initiated every `replicatedSubscriptionsSnapshotFrequencyMillis` when new messages have been produced since the last attempt. Each attempt writes several marker messages to the topic — the snapshot request, the response from the remote cluster (replicated back), and the final snapshot marker. These markers increase the backlog for inactive subscriptions on both clusters.
+
+:::
+
+### Replicated subscriptions snapshot configuration and tuning
+
+Replicated subscriptions use a periodic snapshotting mechanism to establish a consistent association between message positions across clusters. The design is described in [PIP-33: Replicated subscriptions](https://github.com/apache/pulsar/blob/master/pip/pip-33.md#constructing-a-cursor-snapshot).
+
+Each snapshot attempt consists of one or two rounds, where each round is a snapshot request sent to all remote clusters followed by their responses. With two clusters, one round is sufficient; with more than two clusters, two rounds are required. Each round takes time because snapshot request and response markers are written into the topic as marker messages, and the replicator on each participating cluster must process all preceding messages in the topic before it can read them. Under h [...]
+
+If any participating cluster is offline, snapshot attempts will not be started and no snapshots will be created. As a result, mark-delete position updates cannot be propagated for any messages accumulated during the offline period, even after connectivity is restored, since those messages have no associated snapshots.
+
+The effective granularity of mark-delete position updates on the remote cluster is determined by how many messages are written between consecutive snapshots, not by `replicatedSubscriptionsSnapshotFrequencyMillis` alone. With bursty or high-rate message production, many messages accumulate per snapshot interval, resulting in much longer mark-delete position update intervals than the snapshot frequency setting suggests. This is particularly problematic when consumption is much slower than [...]
+
+A potential future improvement would be to process snapshot requests and responses at message publish time rather than waiting for the replicator to drain its backlog. This would significantly reduce the snapshot round-trip time and snapshot lag under high-rate message production.
+
+The subscription's mark-delete position can only be propagated to the remote cluster when there is a suitable snapshot in the subscription's snapshot cache. A snapshot is suitable when the mark-delete position has reached or passed the snapshot's local position — the position in the local cluster's topic at which the snapshot was created. Completed snapshots are added to the cache as the subscription's dispatcher reads messages from the topic. The snapshot cache is cleared whenever all c [...]
+
+A known issue fixed in Pulsar 4.0.9 and 4.1.3 by [PR #25044](https://github.com/apache/pulsar/pull/25044) caused subscription state replication to stall in scenarios where the mark-delete position advances slowly. This affects shared or key-shared subscriptions using individual acknowledgments — where all acknowledgment gaps must be filled before the mark-delete position can advance — and topics using delayed message delivery. The original cache expiration policy kept only the `replicate [...]
+
+The improved snapshot cache expiration policy introduced by [PR #25044](https://github.com/apache/pulsar/pull/25044) addresses this by retaining snapshots spread across the full backlog range — from ahead of the current mark-delete position to the latest snapshot — when the cache is full. The first cached snapshot is always retained until the mark-delete position advances past it, guaranteeing that progress is eventually made even with a large backlog. With a larger snapshot cache size ( [...]
+
+[PR #25044](https://github.com/apache/pulsar/pull/25044) also reduced the memory footprint of each snapshot entry to approximately 200 bytes, making it practical to increase `replicatedSubscriptionsSnapshotMaxCachedPerSubscription` well beyond the default of `30` when finer snapshot granularity is needed for large backlogs. The tradeoff is higher heap memory consumption, which should be accounted for when sizing the broker. The current implementation uses a fixed per-subscription limit r [...]
+
+If geo-replication is enabled on a namespace that already contains messages, no snapshot markers will be present in the existing backlog. The mark-delete position cannot be propagated until the replicator has read past the pre-existing messages and new snapshots have been written and processed — regardless of the snapshot cache size. Similarly, neither the improved cache eviction policy nor increasing the cache size addresses the long interval between snapshots under bursty traffic; that [...]
+
+The following broker settings control snapshot behavior:
+
+| Setting | Default | Description |
+| --- | --- | --- |
+| `replicatedSubscriptionsSnapshotFrequencyMillis` | `1000` | How often a snapshot attempt is started. A new attempt is initiated only when new messages have been produced since the last attempt completed. |
+| `replicatedSubscriptionsSnapshotTimeoutSeconds` | `30` | How long a snapshot attempt can remain in progress before it is abandoned. |
+| `replicatedSubscriptionsSnapshotMaxCachedPerSubscription` | `30` (increased from 10 in PR #25044) | Maximum number of snapshots cached per subscription. Each entry consumes approximately 200 bytes of memory. |
+
+Tuning recommendations:
+
+* **More than two clusters:** Increase `replicatedSubscriptionsSnapshotTimeoutSeconds` to `60` to ensure that two-round snapshot attempts complete before timing out.
+* **Large backlogs with slow mark-delete advancement** (shared or key-shared subscriptions with individual acknowledgments, or delayed message delivery): Increase `replicatedSubscriptionsSnapshotMaxCachedPerSubscription` to at least `50` so that cached snapshots are spread more densely and a suitable snapshot is more likely to be close to the mark-delete position when it advances. At a value of `50`, the snapshot cache consumes approximately 10 KB of heap memory per subscription; with th [...]
+
+### Replicated subscriptions sequence diagrams
+
+This sequence diagram illustrates the interactions involved in replicating subscription state across two clusters. It shows how the mark-delete position on one cluster is propagated to the other, and makes the role of the replication snapshot cache visible — including why a subscription update may not be replicated if no suitable snapshot is available. A snapshot is suitable when the mark-delete position has reached or passed the snapshot's local position.
+
+<div style={{overflowX: 'auto', overflowY: 'auto'}}>
+<div style={{width: '300%', height: '1000px'}}>
+```mermaid
+sequenceDiagram
+ actor ProducerC1
+ actor ConsumerC1
+
+ box Broker c1
+ participant PT_C1 as PersistentTopicC1
+ participant RSC_C1 as ReplicatedSubscriptionsControllerC1
+ participant Disp_C1 as DispatcherC1 (for my-sub)
+ participant PS_C1 as PersistentSubscriptionC1 (sub: my-sub)
+ participant RSCache_C1 as ReplicatedSubscriptionSnapshotCacheC1 (for my-sub)
+ participant Repl_C1_to_C2 as Replicator_C1_to_C2
+ end
+
+ box Broker c2
+ participant PT_C2 as PersistentTopicC2
+ participant RSC_C2 as ReplicatedSubscriptionsControllerC2
+ participant PS_C2 as PersistentSubscriptionC2 (sub: my-sub)
+ participant Repl_C2_to_C1 as Replicator_C2_to_C1
+ end
+
+ %% --- Message Production on c1 & Replication to c2 ---
+ ProducerC1 ->> PT_C1: publishMessage(Msg1) (at Pos_M1_c1)
+ PT_C1 -->> Repl_C1_to_C2: Read Msg1
+ Repl_C1_to_C2 ->> PT_C2: Deliver Msg1 (writes to PT_C2 at Pos_M1_c2)
+
+ %% --- Periodic Snapshot Cycle (replicatedSubscriptionsSnapshotFrequencyMillis) ---
+ loop Snapshot Attempt (ID: S1)
+ RSC_C1 ->> RSC_C1: startNewSnapshot()
+ RSC_C1 ->> PT_C1: publishMessage(Marker: SNAPSHOT_REQUEST S1, from:c1)
+ PT_C1 -->> Repl_C1_to_C2: Read SNAPSHOT_REQUEST S1
+ Repl_C1_to_C2 ->> PT_C2: Deliver SNAPSHOT_REQUEST S1 (writes to PT_C2)
+
+ PT_C2 -->> RSC_C2: PT_C2.receivedReplicatedSubscriptionMarker(SNAPSHOT_REQUEST S1)
+ RSC_C2 ->> RSC_C2: receivedSnapshotRequest(S1)
+ RSC_C2 ->> PT_C2: PT_C2.publishMessage(Marker: SNAPSHOT_RESPONSE S1, cluster:c2, msgId:LastMsgID_c2_T0)
+
+ PT_C2 -->> Repl_C2_to_C1: Read SNAPSHOT_RESPONSE S1
+ Repl_C2_to_C1 ->> PT_C1: Deliver SNAPSHOT_RESPONSE S1 (writes to PT_C1)
+
+ PT_C1 -->> RSC_C1: receivedReplicatedSubscriptionMarker(SNAPSHOT_RESPONSE S1, Pos_Marker_c1_T1)
+ RSC_C1 ->> RSC_C1: receivedSnapshotResponse(S1, c2, LastMsgID_c2_T0, Pos_Marker_c1_T1)
+ opt All Responses Received
+ RSC_C1 ->> PT_C1: publishMessage(Marker: REPLICATED_SUBSCRIPTION_SNAPSHOT S1, local_pos:Pos_Marker_c1_T1, c2_remote_pos:LastMsgID_c2_T0)
+ RSC_C1 ->> RSC_C1: snapshotCompleted(S1)
+ end
+ end
+
+ PT_C1 -->> Disp_C1: Read REPLICATED_SUBSCRIPTION_SNAPSHOT S1
+ Disp_C1 ->> Disp_C1: filterEntriesForConsumer / processReplicatedSubscriptionSnapshot(S1)
+ Disp_C1 ->> PS_C1: processReplicatedSubscriptionSnapshot(S1)
+ PS_C1 ->> RSCache_C1: addNewSnapshot(S1)
+
+ %% --- Continued message Production on c1 & Replication to c2 ---
+ ProducerC1 ->> PT_C1: publishMessage(Msg2) (at Pos_M2_c1)
+ PT_C1 -->> Repl_C1_to_C2: Read Msg2
+ Repl_C1_to_C2 ->> PT_C2: Deliver Msg2 (writes to PT_C2 at Pos_M2_c2)
+
+ %% --- Consumption and Acknowledgement on c1 ---
+ PT_C1 -->> Disp_C1: Read Msg1 for dispatch
+ Disp_C1 -->> ConsumerC1: Dispatch Msg1 (Pos_M1_c1)
+ ConsumerC1 ->> PS_C1: acknowledgeMessage(Pos_M1_c1, Individual)
+ Note right of PS_C1: markDeletePosition may not advance yet
+
+ PT_C1 -->> Disp_C1: Read Msg2 for dispatch
+ Disp_C1 -->> ConsumerC1: Dispatch Msg2 (Pos_M2_c1)
+ ConsumerC1 ->> PS_C1: acknowledgeMessage(Pos_M2_c1, Individual)
+ PS_C1 ->> PS_C1: cursor markDeletePosition advances to Pos_MDP_c1
+
+ %% --- Subscription State Replication (triggered by markDeletePosition advance on c1) ---
+ PS_C1 ->> RSCache_C1: advancedMarkDeletePosition(Pos_MDP_c1)
+ RSCache_C1 -->> PS_C1: Return Snapshot S1 (if Pos_MDP_c1 >= S1.local_pos)
+ Note right of PS_C1: Suitable snapshot S1 may not be present in the cache.<br>In that case, the subscription update won't be replicated.
+
+ opt Snapshot S1 is present. This flow won't happen unless a suitable snapshot is present in the cache.
+ PS_C1 ->> RSC_C1: localSubscriptionUpdated("my-sub", S1)
+ RSC_C1 ->> PT_C1: publishMessage(Marker: REPLICATED_SUBSCRIPTION_UPDATE for "my-sub", c2_target_pos: S1.c2_remote_pos)
+ PT_C1 -->> Repl_C1_to_C2: Read SUBSCRIPTION_UPDATE
+ Repl_C1_to_C2 ->> PT_C2: Deliver SUBSCRIPTION_UPDATE (writes to PT_C2)
+
+ PT_C2 -->> RSC_C2: PT_C2.receivedReplicatedSubscriptionMarker(SUBSCRIPTION_UPDATE)
+ RSC_C2 ->> RSC_C2: receiveSubscriptionUpdated("my-sub", S1.c2_remote_pos)
+ RSC_C2 ->> PS_C2: acknowledgeMessage([S1.c2_remote_pos], Cumulative, ...)
+ Note right of PS_C2: markDeletePosition on c2 advances
+ end
+```
+</div>
+</div>
+
+### Observability
+
+Observability for replicated subscriptions is limited. For debugging, debug-level logs are available in `org.apache.pulsar.broker.service.persistent.ReplicatedSubscriptionsController`, though these are not suitable for production operations.
+
+The following broker-level metrics are available for monitoring snapshot health. Note that these metrics are aggregated across all topics on a broker and do not include per-topic labels.
+
+| Metric | OpenTelemetry name | Description |
+| --- | --- | --- |
+| `pulsar_replicated_subscriptions_pending_snapshots` | `pulsar.broker.replication.subscription.snapshot.operation.count` | Number of currently pending snapshots. |
+| `pulsar_replicated_subscriptions_timedout_snapshots` | `pulsar.broker.replication.subscription.snapshot.operation.duration` | Number of snapshots that have timed out. |
+
+Topic stats and internal stats can be used to inspect the state of subscriptions. The cursor's mark-delete position is particularly useful, as subscription state can only be replicated up to that position.
+
+A potential future improvement would be to expose pending snapshot attempt state including snapshot related topic-level counters in topic stats, and snapshot cache state in per-subscription stats. This would improve visibility when investigating replicated subscription issues.
+
+## Migrate data between clusters using geo-replication
+
+Using geo-replication to migrate data between clusters is a special use case of the [active-active replication pattern](concepts-replication.md#active-active-replication) when you don't have a large amount of data.
+
+:::warning
+
+Replicating data to a remote cluster and then removing that cluster from the namespace replication configuration — with the intention of retaining an independent data snapshot — is not a supported use case. Removing the cluster from the configuration triggers cascading deletion of all topics on that cluster in certain cases, risking data loss when the goal is to keep an independent copy of the data. While it is possible to prevent cascading deletions, doing so has caveats. See [Cascading [...]
+
+:::
+
+1. Create your new cluster.
+2. Add the new cluster to your old cluster.
+
+ ```shell
+ bin/pulsar-admin clusters create new-cluster
+ ```
+
+3. Add the new cluster to your tenant.
+
+ ```shell
+ bin/pulsar-admin tenants update my-tenant --cluster old-cluster,new-cluster
+ ```
+
+4. Set the clusters on your namespace.
+
+ ```shell
+ bin/pulsar-admin namespaces set-clusters my-tenant/my-ns --cluster old-cluster,new-cluster
+ ```
+
+5. Update your applications using [replicated subscriptions](#replicated-subscriptions).
+6. Validate subscription replication is active.
+ ```shell
+ bin/pulsar-admin topics stats-internal public/default/t1
+ ```
+
+7. Move your consumers and producers to the new cluster by modifying the values of `serviceURL`.
+
+:::note
+
+* The replication starts from step 4, which means existing messages in your old cluster are not replicated.
+* If you have some older messages to migrate, you can pre-create the replication subscriptions for each topic and set it at the earliest position by using `pulsar-admin topics create-subscription -s pulsar.repl.new-cluster -m earliest <topic>`. Until [PIP-356](https://github.com/apache/pulsar/blob/master/pip/pip-356.md) is merged you will need to unload the topic to start georeplication.
+
+:::
diff --git a/versioned_docs/version-5.0.x/administration-isolation-bookie.md b/versioned_docs/version-5.0.x/administration-isolation-bookie.md
new file mode 100644
index 00000000000..549a6ae216a
--- /dev/null
+++ b/versioned_docs/version-5.0.x/administration-isolation-bookie.md
@@ -0,0 +1,270 @@
+---
+id: administration-isolation-bookie
+title: Isolate bookies
+sidebar_label: "Isolate bookies"
+description: Get a comprehensive understanding of bookie data isolation policy in Pulsar.
+---
+
+````mdx-code-block
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+````
+
+
+Isolating bookies equals isolating message storage, which is a data storage mechanism that provides isolation and safety for specific topics.
+
+Bookie isolation is controlled by BookKeeper clients. For Pulsar, there are two kinds of BookKeeper clients to read and write data.
+* BookKeeper clients on the broker side: Pulsar brokers use these BookKeeper clients to read and write topic messages.
+* BookKeeper clients on the bookie auto-recovery side:
+ * The bookie auditor checks whether ledger replicas fulfill the configured isolation policy;
+ * The bookie replication worker writes ledger replicas to target bookies according to the configured isolation policy.
+
+To isolate bookies, you need to complete the following tasks.
+1. Select a [data isolation policy](#understand-bookie-data-isolation-policy) based on your requirements.
+2. [Enable the policy on BookKeeper clients](#enable-bookie-data-placement-policy).
+3. [Configure the policy on bookie instances](#configure-data-placement-policy-on-bookie-instances).
+
+
+## Understand bookie data isolation policy
+
+Bookie data isolation policy is built on top of the existing BookKeeper rack-aware placement policy. The "rack" concept can be anything, for example, racks, regions, availability zones. It writes the configured isolation policy into the metadata store. Both BookKeeper clients on the broker and bookie auto-recovery side read the configured isolation policy from the metadata store and apply it when choosing bookies to store messages.
+
+BookKeeper provides three kinds of data isolation policies for disaster tolerance.
+* Rack-aware placement policy (default)
+* Region-aware placement policy
+* Zone-aware placement policy
+
+:::tip
+
+* Both [rack-aware placement policy](#rack-aware-placement-policy) and [region-aware placement policy](#region-aware-placement-policy) can be used in all kinds of deployments where racks are a subset of a region. The major difference between the two policies is:
+ * With `RackawareEnsemblePlacementPolicy` configured, the BookKeeper client chooses bookies from different **racks** to reduce the single point of failure. If there is only one rack available, the policy falls back on choosing a random bookie across available ones.
+ * With `RegionAwareEnsemblePlacementPolicy` configured, the BookKeeper client chooses bookies from different **regions**; for the selected region, it chooses bookies from different racks if more than one ensemble falls into the same region.
+
+* Zone-aware placement policy (`ZoneAwareEnsemblePlacementPolicy`) can be used in a public cloud infrastructure where Availability Zones (AZs) are isolated locations within the data center regions that public cloud services originate from and operate in.
+
+:::
+
+### Rack-aware placement policy
+
+Rack-aware placement policy enforces different data replicas to be placed in different racks to guarantee the rack-level disaster tolerance for your production environment. A data center usually has a lot of racks, and each rack has many storage nodes. You can use `RackAwareEnsemblePlacementPolicy` to configure the rack information for each bookie.
+
+#### Qualified rack size of bookies
+
+When the available rack size of bookies can meet the requirements configured on a topic, the rack-aware placement policy can work well and you don't need any extra configurations.
+
+For example, the BookKeeper cluster has 4 racks and 13 bookie instances as shown in the following diagram. When a topic is configured with `EnsembleSize=3, WriteQuorum=3, AckQuorum=2`, the BookKeeper client chooses one bookie instance from three different racks to write data to, such as Bookie2, Bookie8, and Bookie12.
+
+
+
+
+#### Enforced minimum rack size of bookies
+
+When the available rack size of bookies cannot meet the requirements configured on a topic, the strategy that the BookKeeper client chooses bookies to recover old ledgers and create new ledgers depends on whether the enforced minimum rack size of bookies is configured.
+
+In this case, if you want to make the rack-aware placement policy work as usual, you need to configure an enforced minimum rack size of bookies (`MinNumRacksPerWriteQuorum`).
+
+For example, you have the same BookKeeper cluster with the same topic requirements `EnsembleSize=3, WriteQuorum=3, AckQuorum=2` as shown in the above diagram. When all the bookie instances in Rack3 and Rack4 fail, you only have 2 available racks and there are the following three possibilities.
+
+* If you have configured `EnforceMinNumRacksPerWriteQuorum=true` and `MinNumRacksPerWriteQuorum=3`, the BookKeeper client fails to choose bookies, which means new ledgers cannot be created and old ledgers cannot be recovered. Because the requirement of `MinNumRacksPerWriteQuorum=3` cannot be fulfilled.
+
+* If you have configured `EnforceMinNumRacksPerWriteQuorum=true` and `MinNumRacksPerWriteQuorum=2`, the BookKeeper client chooses one bookie from Rack1 and Rack2 to recover old ledgers, such as bookie1 and bookie5, to place 2 replicas for Bookie8 and Bookie12. For new ledger creation, it chooses one bookie from Rack1 and Rack2, such as Bookie4 and Bookie7, and a random bookie from either Rack1 or Rack2 to place the last replica.
+
+
+
+* If you have configured `EnforceMinNumRacksPerWriteQuorum=false`, the BookKeeper client tries its best effort to apply the placement policy depending on the available number of racks and bookies. It may still work as the above diagram or the following diagram.
+
+
+
+### Region-aware placement policy
+
+Region-aware placement policy enforces different data replicas to be placed in different regions and racks to guarantee region-level disaster tolerance. To achieve datacenter level disaster tolerance, you need to write data replicas into different data centers. You can use `RegionAwareEnsemblePlacementPolicy` to configure region and rack information for each bookie node to ensure region-level disaster tolerance.
+
+For example, the BookKeeper cluster has 4 regions, and each region has several racks with their bookie instances, as shown in the following diagram. If a topic is configured with `EnsembleSize=3, WriteQuorum=3, and AckQuorum=2`, the BookKeeper client chooses three different regions, such as Region A, Region C and Region D. For each region, it chooses one bookie on a single rack, such as Bookie5 on Rack2, Bookie17 on Rack6, and Bookie21 on Rack8.
+
+
+
+When two regions fail, such as Region B and Region C, as shown in the following diagram, the BookKeeper client chooses one bookie from Region A or Region D to replace the failed Bookie17 for recovering old ledgers. And it also chooses Region A and Region D to write replicas for creating new ledgers. In Region A, it falls back to rack-aware placement policy and chooses one bookie from Rack1 and Rack2, such as Bookie4 and Bookie7. For Region D, it has to choose one bookie from Rack8, such [...]
+
+
+
+## Enable bookie data placement policy
+
+By default, the rack-aware placement policy is enabled on both broker and bookie sides. If you want to switch to the region-aware placement policy, you need to enable the region-aware placement policy on both broker and bookie sides.
+
+### Enable region-aware placement policy on broker
+
+To enable region-aware placement policy on broker, configure the following field in the `conf/broker.conf` file.
+
+```properties
+bookkeeperClientRegionawarePolicyEnabled=true
+```
+
+To enforce the minimum rack size of bookies, configure the following fields:
+
+```properties
+bookkeeperClientEnforceMinNumRacksPerWriteQuorum=true
+bookkeeperClientMinNumRacksPerWriteQuorum=2
+```
+
+To balance the ledger disk usage of different bookies, you can enable the disk weight placement by configuring the following field:
+
+```properties
+bookkeeperDiskWeightBasedPlacementEnabled=true
+```
+### Enable region-aware placement policy on the auto-recovery instances (pods)
+
+To enable region-aware placement policy on the auto-recovery instances, configure the following fields in the `conf/bookkeeper.conf` file.
+
+```properties
+ensemblePlacementPolicy=org.apache.bookkeeper.client.RegionAwareEnsemblePlacementPolicy
+reppDnsResolverClass=org.apache.pulsar.zookeeper.ZkBookieRackAffinityMapping
+```
+
+To enforce the minimum rack size of bookies, configure the following fields:
+
+```properties
+enforceMinNumRacksPerWriteQuorum=true
+minNumRacksPerWriteQuorum=2
+```
+
+To balance the ledger disk usage of different bookies, you can enable the disk weight placement by configuring the following field:
+
+```properties
+diskWeightBasedPlacementEnabled=true
+```
+
+## Configure data placement policy on bookie instances
+
+To configure a data placement policy on bookie instances, you can use one of the following methods.
+
+````mdx-code-block
+<Tabs
+ defaultValue="Pulsar-admin CLI"
+ values={[{"label":"Pulsar-admin CLI","value":"Pulsar-admin CLI"},{"label":"REST API","value":"REST API"}]}>
+
+<TabItem value="Pulsar-admin CLI">
+
+
+Specify the rack name to represent which region or rack this bookie belongs to.
+
+```bash
+bin/pulsar-admin bookies set-bookie-rack
+The following options are required: [-b | --bookie], [-r | --rack]
+
+Then we need to update the rack placement information for a specific bookie in the cluster. Note that the bookie address format is `address:port`.
+Usage: set-bookie-rack [options]
+ Options:
+ * -b, --bookie
+ Bookie address (format: `address:port`)
+ -g, --group
+ Bookie group name
+ Default: default
+ --hostname
+ Bookie host name
+ * -r, --rack
+ Bookie rack name
+```
+
+:::tip
+
+In addition, you can also group bookies across racks or regions to serve broker-level isolation by specifying a group name for each bookie and assigning the group name to a specific namespace. See [configure bookie affinity groups](#configure-bookie-affinity-groups) for more details.
+
+:::
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/updateBookieRackInfo)
+
+</TabItem>
+
+</Tabs>
+````
+
+
+#### Example of configuring rack-aware placement policy
+
+The following is an example of how to configure bookie instances with their rack properties.
+
+```bash
+bin/pulsar-admin bookies set-bookie-rack --bookie bookie1:3181 --hostname bookie1.pulsar.com:3181 --group group1 --rack rack1
+bin/pulsar-admin bookies set-bookie-rack --bookie bookie2:3181 --hostname bookie2.pulsar.com:3181 --group group1 --rack rack1
+bin/pulsar-admin bookies set-bookie-rack --bookie bookie3:3181 --hostname bookie3.pulsar.com:3181 --group group1 --rack rack1
+bin/pulsar-admin bookies set-bookie-rack --bookie bookie4:3181 --hostname bookie4.pulsar.com:3181 --group group1 --rack rack1
+bin/pulsar-admin bookies set-bookie-rack --bookie bookie5:3181 --hostname bookie5.pulsar.com:3181 --group group1 --rack rack2
+...
+```
+
+#### Example of configuring region-aware placement policy
+
+The following is an example of how to configure bookie instances with their region/rack properties.
+
+```bash
+bin/pulsar-admin bookies set-bookie-rack --bookie bookie1:3181 --hostname bookie1.pulsar.com:3181 --group group1 --rack RegionA/rack1
+bin/pulsar-admin bookies set-bookie-rack --bookie bookie2:3181 --hostname bookie2.pulsar.com:3181 --group group1 --rack RegionA/rack1
+bin/pulsar-admin bookies set-bookie-rack --bookie bookie3:3181 --hostname bookie3.pulsar.com:3181 --group group1 --rack RegionA/rack1
+bin/pulsar-admin bookies set-bookie-rack --bookie bookie4:3181 --hostname bookie4.pulsar.com:3181 --group group1 --rack RegionA/rack1
+bin/pulsar-admin bookies set-bookie-rack --bookie bookie5:3181 --hostname bookie5.pulsar.com:3181 --group group1 --rack RegionA/rack2
+bin/pulsar-admin bookies set-bookie-rack --bookie bookie6:3181 --hostname bookie6.pulsar.com:3181 --group group1 --rack RegionA/rack2
+bin/pulsar-admin bookies set-bookie-rack --bookie bookie7:3181 --hostname bookie7.pulsar.com:3181 --group group1 --rack RegionA/rack2
+bin/pulsar-admin bookies set-bookie-rack --bookie bookie8:3181 --hostname bookie8.pulsar.com:3181 --group group1 --rack RegionB/rack3
+...
+```
+
+## Configure bookie affinity groups
+
+The data of a namespace can be isolated into user-defined groups of bookies, as known as bookie affinity groups, which guarantee all the data that belongs to the namespace is stored in desired bookies.
+
+**Prerequisites:** Before configuring bookie affinity groups, you need to group bookies first. See [configure data placement policy on bookie instances](#configure-data-placement-policy-on-bookie-instances) for more details.
+
+To configure bookie affinity groups, you can use one of the following methods.
+
+````mdx-code-block
+<Tabs
+ defaultValue="Pulsar-admin CLI"
+ values={[{"label":"Pulsar-admin CLI","value":"Pulsar-admin CLI"},{"label":"REST API","value":"REST API"},{"label":"Java admin API","value":"Java admin API"}]}>
+
+<TabItem value="Pulsar-admin CLI">
+
+```shell
+pulsar-admin namespaces set-bookie-affinity-group options
+```
+
+For more information about the command `pulsar-admin namespaces set-bookie-affinity-group options`, see [Pulsar admin docs](/reference/#/@pulsar:version_reference@/pulsar-admin/).
+
+**Example**
+
+```shell
+bin/pulsar-admin bookies set-bookie-rack \
+--bookie 127.0.0.1:3181 \
+--hostname 127.0.0.1:3181 \
+--group group-bookie1 \
+--rack rack1
+
+bin/pulsar-admin namespaces set-bookie-affinity-group public/default \
+--primary-group group-bookie1
+```
+
+:::note
+
+- Do not set a bookie rack name to slash (`/`) or an empty string (`""`) if you use Pulsar earlier than 2.7.5, 2.8.3, and 2.9.2. If you use Pulsar 2.7.5, 2.8.3, 2.9.2 or later versions, it falls back to `/default-rack` or `/default-region/default-rack`.
+- When `RackawareEnsemblePlacementPolicy` is enabled, the rack name is not allowed to contain one slash (`/`) except for the beginning and end of the rack name string. For example, a rack name like `/rack0` is allowed, but `/rack/0` is invalid.
+- When `RegionAwareEnsemblePlacementPolicy` is enabled, the rack name can only contain one slash (`/`) except for the beginning and end of the rack name string. For example, rack name like `/region0/rack0` is allowed, but `/region0rack0` and `/region0/rack/0` are invalid.
+For the bookie rack name restrictions, see [pulsar-admin bookies set-bookie-rack](/reference/#/@pulsar:version_reference@/pulsar-admin/bookies?id=set-bookie-rack).
+
+:::
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/setBookieAffinityGroup)
+
+</TabItem>
+<TabItem value="Java admin API">
+
+For how to set bookie affinity group for a namespace using Java admin API, see [code](https://github.com/apache/pulsar/blob/master/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/NamespacesImpl.java#L1164).
+
+</TabItem>
+
+</Tabs>
+````
diff --git a/versioned_docs/version-5.0.x/administration-isolation-broker.md b/versioned_docs/version-5.0.x/administration-isolation-broker.md
new file mode 100644
index 00000000000..962f8b8eccc
--- /dev/null
+++ b/versioned_docs/version-5.0.x/administration-isolation-broker.md
@@ -0,0 +1,61 @@
+---
+id: administration-isolation-broker
+title: Isolate brokers
+sidebar_label: "Isolate brokers"
+description: Learn to set a namespace isolation policy for a broker cluster in Pulsar.
+---
+
+````mdx-code-block
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+````
+
+
+In Pulsar, when namespaces (more specifically, namespace bundles) are assigned dynamically to brokers, the namespace isolation policy limits the set of brokers that can be used for assignment. Before topics are assigned to brokers, you can set the namespace isolation policy with a primary or a secondary regex to select desired brokers.
+
+To set a namespace isolation policy for a broker cluster, you can use one of the following methods.
+
+````mdx-code-block
+<Tabs
+ defaultValue="Pulsar-admin CLI"
+ values={[{"label":"Pulsar-admin CLI","value":"Pulsar-admin CLI"},{"label":"REST API","value":"REST API"},{"label":"Java admin API","value":"Java admin API"}]}>
+
+<TabItem value="Pulsar-admin CLI">
+
+```shell
+pulsar-admin ns-isolation-policy set options
+```
+
+For more information about the command `pulsar-admin ns-isolation-policy set options`, see [Pulsar admin docs](/reference/#/@pulsar:version_reference@/pulsar-admin/).
+
+**Example**
+
+```shell
+bin/pulsar-admin ns-isolation-policy set \
+--auto-failover-policy-type min_available \
+--auto-failover-policy-params min_limit=1,usage_threshold=80 \
+--namespaces my-tenant/my-namespace \
+--primary 10.193.216.* my-cluster policy-name
+```
+
+</TabItem>
+<TabItem value="REST API">
+
+[](swagger:/admin/v2/createNamespace)
+
+</TabItem>
+<TabItem value="Java admin API">
+
+For how to set namespace isolation policy using Java admin API, see [code](https://github.com/apache/pulsar/blob/master/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/NamespacesImpl.java#L251).
+
+</TabItem>
+
+</Tabs>
+````
+
+
+:::tip
+
+To guarantee all the data that belongs to a namespace is stored in desired bookies, you can isolate the data of the namespace into user-defined groups of bookies. See [configure bookie affinity groups](administration-isolation-bookie.md#configure-bookie-affinity-groups) for more details.
+
+:::
diff --git a/versioned_docs/version-5.0.x/administration-isolation.md b/versioned_docs/version-5.0.x/administration-isolation.md
new file mode 100644
index 00000000000..b86c5c81a6a
--- /dev/null
+++ b/versioned_docs/version-5.0.x/administration-isolation.md
@@ -0,0 +1,74 @@
+---
+id: administration-isolation
+title: Pulsar isolation
+sidebar_label: "Pulsar isolation"
+description: Get a comprehensive understanding of Pulsar isolation.
+---
+
+
+In an organization, a Pulsar instance provides services to multiple teams. When organizing the resources across multiple teams, you want to make a suitable isolation plan to avoid resource competition between different teams and applications and provide high-quality messaging service. In this case, you need to consider resource isolation and weigh your intended actions against expected and unexpected consequences.
+
+The multi-layer and segment-centric architecture and hierarchical resource management of Pulsar provide a solid foundation for isolation, which allows you to isolate resources in your desired manner, prevent resource competition, and attain stability.
+
+
+## Isolation levels
+
+Pulsar supports isolation at either of the following two levels or both.
+* [Broker-level isolation](administration-isolation-broker.md) divides brokers into different groups and assigns broker groups to different namespaces. In this way, you can bind topics in a namespace to a set of brokers that belong to specific groups.
+* [Bookie-level isolation](administration-isolation-bookie.md) divides bookies into different racks/regions and assigns data replicas to bookies based on a specified data placement policy for disaster tolerance.
+
+
+
+:::tip
+
+On top of [broker-level isolation](administration-isolation-broker.md) and [bookie-level isolation](administration-isolation-bookie.md), if you want to guarantee all the data that belongs to a namespace is stored in desired bookies, you can define and configure [bookie affinity groups](administration-isolation-bookie.md#configure-bookie-affinity-groups). See [shared BookKeeper cluster deployment](#shared-bookkeeper-cluster) for more details.
+
+:::
+
+
+## Deployments to achieve isolation within Pulsar
+
+### Separate Pulsar clusters
+
+The following illustration demonstrates the deployment of separate Pulsar clusters to achieve the highest-level isolation.
+
+
+
+Here are some key points for understanding how it works:
+- Separate Pulsar clusters use a shared [configuration store](concepts-architecture-overview.md#configuration-store).
+- Each cluster exposes its service through a DNS entry point and makes sure a client can access the cluster through the DNS entry point. Clients can use one or multiple Pulsar URLs that the Pulsar cluster exposes as the service URL.
+- Each Pulsar cluster has one or multiple brokers and bookies.
+- Each Pulsar cluster has one metadata store, which can be separated into [Pulsar metadata store](concepts-architecture-overview.md#metadata-store) and [BookKeeper metadata store](https://bookkeeper.apache.org/docs/getting-started/concepts/#metadata-storage).
+
+:::note
+
+When using this approach, if you want to achieve namespace isolation, you need to specify a cluster for a namespace. The cluster must be in the allowed cluster list of the tenant. Topics under the namespace are assigned to this cluster.
+
+:::
+
+### Shared BookKeeper cluster
+
+The following illustration demonstrates the deployment of shared BookKeeper clusters to achieve isolation.
+
+
+
+Here are some key points for understanding how it works:
+- Separate Pulsar clusters share a BookKeeper cluster and a [configuration store](concepts-architecture-overview.md#configuration-store).
+- Each cluster exposes its service through a DNS entry point and makes sure a client can access the cluster through the DNS entry point. Clients can use one or multiple Pulsar URLs that the Pulsar cluster exposes as the service URL.
+- Each Pulsar cluster has one or multiple brokers.
+- Each Pulsar cluster has one metadata store.
+
+As illustrated below, all bookie groups use a shared BookKeeper cluster and a metadata store, and each [bookie affinity group](administration-isolation-bookie.md#configure-bookie-affinity-groups) has one or several bookies. You can specify one or multiple primary/secondary groups for a namespace. Topics under the namespace are created on the bookies in the primary group first and then created on the bookies in the secondary group.
+
+
+
+### Single Pulsar cluster
+
+The following illustration demonstrates how to achieve isolation inside a single Pulsar cluster.
+
+
+
+Here are some key points for understanding how it works:
+- Each cluster exposes its service through a DNS entry point and makes sure a client can access the cluster through the DNS entry point. Clients can use one or multiple Pulsar URLs that the Pulsar cluster exposes as the service URL.
+- Broker isolation is achieved by setting a [namespace isolation policy](administration-isolation-broker.md).
+
diff --git a/versioned_docs/version-5.0.x/administration-load-balance.md b/versioned_docs/version-5.0.x/administration-load-balance.md
new file mode 100644
index 00000000000..95c34dca8db
--- /dev/null
+++ b/versioned_docs/version-5.0.x/administration-load-balance.md
@@ -0,0 +1,285 @@
+---
+id: administration-load-balance
+title: Load balance across brokers
+sidebar_label: "Load balance"
+---
+
+
+Pulsar is a horizontally scalable messaging system, so the traffic in a logical cluster must be balanced across all the available Pulsar brokers as evenly as possible, which is a core requirement.
+
+You can use multiple settings and tools to control the traffic distribution which requires a bit of context to understand how the traffic is managed in Pulsar. Though in most cases, the core requirement mentioned above is true out of the box and you should not worry about it.
+
+The following sections introduce how load-balanced assignments work across Pulsar brokers and how you can leverage the framework to adjust.
+
+## Dynamic assignments
+
+Topics are dynamically assigned to brokers based on the load conditions of all brokers in the cluster. The assignment of topics to brokers is not done at the topic level but the **bundle** level (a higher level). Instead of individual topic assignments, each broker takes ownership of a subset of the topics for a namespace. This subset is called a bundle and effectively this subset is a sharding mechanism.
+
+In other words, each namespace is an "administrative" unit and sharded into a list of bundles, with each bundle comprising a portion of the overall hash range of the namespace. Topics are assigned to a particular bundle by taking the hash of the topic name and checking in which bundle the hash falls. Each bundle is independent of the others and thus is independently assigned to different brokers.
+
+The benefit of the assignment granularity is to amortize the amount of information that you need to keep track of. Based on CPU, memory, traffic load, and other indexes, topics are assigned to a particular broker dynamically. For example:
+* When a client starts using new topics that are not assigned to any broker, a process is triggered to choose the best-suited broker to acquire ownership of these topics according to the load conditions.
+* If the broker owning a topic becomes overloaded, the topic is reassigned to a less-loaded broker.
+* If the broker owning a topic crashes, the topic is reassigned to another active broker.
+
+:::tip
+
+For partitioned topics, different partitions are assigned to different brokers. Here "topic" means either a non-partitioned topic or one partition of a topic.
+
+:::
+
+## Create namespaces with assigned bundles
+
+When you create a new namespace, a number of bundles are assigned to the namespace. You can set this number in the `conf/broker.conf` file:
+
+```conf
+# When a namespace is created without specifying the number of bundles, this
+# value will be used as the default
+defaultNumberOfNamespaceBundles=4
+```
+
+Alternatively, you can override the value when you create a new namespace using [Pulsar admin](/reference/#/@pulsar:version_reference@/pulsar-admin/):
+
+```shell
+bin/pulsar-admin namespaces create my-tenant/my-namespace --clusters us-west --bundles 16
+```
+
+With the above command, you create a namespace with 16 initial bundles. Therefore the topics for this namespace can immediately be spread across up to 16 brokers.
+
+In general, if you know the expected traffic and number of topics in advance, you had better start with a reasonable number of bundles instead of waiting for the system to auto-correct the distribution.
+
+On the same note, it is beneficial to start with more bundles than the number of brokers, due to the hashing nature of the distribution of topics into bundles. For example, for a namespace with 1000 topics, using something like 64 bundles achieves a good distribution of traffic across 16 brokers.
+
+
+## Split namespace bundles
+
+Since the load for the topics in a bundle might change over time and predicting the load might be hard, bundle split is designed to resolve these challenges. The broker splits a bundle into two and the new smaller bundles can be reassigned to different brokers.
+
+Pulsar supports the following two bundle split algorithms:
+* `range_equally_divide`: split the bundle into two parts with the same hash range size.
+* `topic_count_equally_divide`: split the bundle into two parts with the same number of topics.
+* `specified_positions_divide`: split the bundle into several parts by the specified positions.
+
+:::tip
+
+* The `specified_positions_divide` algorithms only support use by admin API and do not support set into `defaultNamespaceBundleSplitAlgorithm`.
+
+:::
+
+To enable bundle split, you need to configure the following settings in the `broker.conf` file, and set `defaultNamespaceBundleSplitAlgorithm` based on your needs.
+
+```conf
+loadBalancerAutoBundleSplitEnabled=true
+loadBalancerAutoUnloadSplitBundlesEnabled=true
+defaultNamespaceBundleSplitAlgorithm=range_equally_divide
+```
+
+You can configure more parameters for splitting thresholds. Any existing bundle that exceeds any of the thresholds is a candidate to be split. By default, the newly split bundles are immediately reassigned to other brokers, to facilitate the traffic distribution.
+
+```conf
+# maximum topics in a bundle, otherwise bundle split will be triggered
+loadBalancerNamespaceBundleMaxTopics=1000
+
+# maximum sessions (producers + consumers) in a bundle, otherwise bundle split will be triggered
+loadBalancerNamespaceBundleMaxSessions=1000
+
+# maximum msgRate (in + out) in a bundle, otherwise bundle split will be triggered
+loadBalancerNamespaceBundleMaxMsgRate=30000
+
+# maximum bandwidth (in + out) in a bundle, otherwise bundle split will be triggered
+loadBalancerNamespaceBundleMaxBandwidthMbytes=100
+
+# maximum number of bundles in a namespace (for auto-split)
+loadBalancerNamespaceMaximumBundles=128
+```
+
+## Shed load automatically
+
+The support for automatic load shedding is available in the load manager of Pulsar. This means that whenever the system recognizes a particular broker is overloaded, the system forces some traffic to be reassigned to less-loaded brokers.
+
+When a broker is identified as overloaded, the broker forces to "unload" a subset of the bundles, the ones with higher traffic, that make up for the overload percentage.
+
+For example, the default threshold is 85% and if a broker is over quota at 95% CPU usage, then the broker unloads the percent difference plus a 5% margin: `(95% - 85%) + 5% = 15%`. Given the selection of bundles to unload is based on traffic (as a proxy measure for CPU, network, and memory), the broker unloads bundles for at least 15% of traffic.
+
+:::tip
+
+* The automatic load shedding is enabled by default. To disable it, you can set `loadBalancerSheddingEnabled` to `false`.
+* Besides the automatic load shedding, you can [manually unload bundles](#unload-topics-and-bundles).
+
+:::
+
+Additional settings that apply to shedding:
+
+```conf
+# Load shedding interval. Broker periodically checks whether some traffic should be offload from
+# some over-loaded broker to other under-loaded brokers
+loadBalancerSheddingIntervalMinutes=1
+
+# Prevent the same topics to be shed and moved to other brokers more than once within this timeframe
+loadBalancerSheddingGracePeriodMinutes=30
+```
+
+Pulsar supports the following types of automatic load shedding strategies.
+* [ThresholdShedder](#thresholdshedder)
+* [OverloadShedder](#overloadshedder)
+* [UniformLoadShedder](#uniformloadshedder)
+
+:::note
+
+* From Pulsar 2.10, the **default** shedding strategy is `ThresholdShedder`.
+* You need to restart brokers if the shedding strategy is [dynamically updated](admin-api-brokers.md#dynamic-broker-configuration).
+
+:::
+
+### ThresholdShedder
+
+This strategy sheds bundles from brokers whose resource usage exceeds the average resource usage of brokers in the cluster by a specified threshold.
+
+Current usage for a broker is defined as the maximum usage among CPU, direct memory, throughput in and throughput out values. This value is exponentially smoothed out with historical observations to yield the computed resource usage for broker load balancing purposes.
+
+A broker is considered overloaded if its resource usage exceeds the average resource usage of all brokers in the cluster by at least threshold value `loadBalancerBrokerThresholdShedderPercentage`. Bundles from overloaded brokers are transferred until the expected throughput of the broker is 5% below the cluster average. Furthermore, a broker must have a total current throughput (in + out) sufficiently high in order to be eligible for bundle unloading. If the expected throughput reduction [...]
+
+Note that recently unloaded bundles are not unloaded again.
+
+
+
+For example, assume you have three brokers, the average broker usage of broker1 is 40%, the average broker usage of broker2 and broker3 is 10%, then the cluster average usage is 20% ((40% + 10% + 10%) / 3). If you set `loadBalancerBrokerThresholdShedderPercentage` to `10`, then only broker1's certain bundles get unloaded, because the average usage of broker1 is greater than the sum of the cluster average usage (20%) plus `loadBalancerBrokerThresholdShedderPercentage`(10%).
+
+However, in some special cases, the above default strategy cannot leverage the resources of low-load or idle machines.
+
+For example:
+
+There are 11 brokers, of which 10 are loaded at 80% and 1 is loaded at 0%.
+The average load is 80% * 10 / 11 = 72.73%, and the threshold to unload is 72.73% + 10% = 82.73%.
+Since 80% < 82.73%, unload will not be triggered, and there is one idle Broker with load of 0%.
+
+To leverage the resources of low-load or idle machines, you can configure the `lowerBoundarySheddingEnabled` parameter on top of `ThresholdShedder`.
+When `lowerBoundarySheddingEnabled` is set to `true`, a leader decides the lower boundary of the load.
+If `current usage` is less than `average usage - lower boundary load`, e.g., 0% < (82.73% - 10%), the broker with the highest load will be triggered to unload.
... 42645 lines suppressed ...
(pulsar-site) 09/16: Document pulsar-admin migration and scalable-topics commands
Posted by lh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
lhotari pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/pulsar-site.git
commit 4bfbe8df6e0d5146355e54c972d92a3b4be03798
Author: Lari Hotari <lh...@users.noreply.github.com>
AuthorDate: Tue Jun 23 22:31:46 2026 +0300
Document pulsar-admin migration and scalable-topics commands
The reference doc generator drives pulsar-admin from a hardcoded subcommand
list that had gone stale: migration and scalable-topics (both new in 5.0.0)
were never generated. Add them so the list mirrors all pulsar-admin --help
subcommands (excluding the documents helper), generate the two pages for the
5.0.x and next reference trees, and list them in both _sidebar.md files.
---
static/reference/5.0.x/_sidebar.md | 2 +
static/reference/5.0.x/pulsar-admin/migration.md | 74 ++
.../5.0.x/pulsar-admin/scalable-topics.md | 1090 ++++++++++++++++++++
static/reference/next/_sidebar.md | 2 +
static/reference/next/pulsar-admin/migration.md | 74 ++
.../reference/next/pulsar-admin/scalable-topics.md | 1090 ++++++++++++++++++++
.../lib/execute/pulsar_admin_clidoc_generator.py | 6 +
7 files changed, 2338 insertions(+)
diff --git a/static/reference/5.0.x/_sidebar.md b/static/reference/5.0.x/_sidebar.md
index 3d40539231a..3f4af9b1046 100644
--- a/static/reference/5.0.x/_sidebar.md
+++ b/static/reference/5.0.x/_sidebar.md
@@ -22,10 +22,12 @@
- [clusters](pulsar-admin/clusters.md)
- [functions](pulsar-admin/functions.md)
- [functions-worker](pulsar-admin/functions-worker.md)
+ - [migration](pulsar-admin/migration.md)
- [namespaces](pulsar-admin/namespaces.md)
- [ns-isolation-policy](pulsar-admin/ns-isolation-policy.md)
- [sources](pulsar-admin/sources.md)
- [sinks](pulsar-admin/sinks.md)
+ - [scalable-topics](pulsar-admin/scalable-topics.md)
- [topics](pulsar-admin/topics.md)
- [topicPolicies](pulsar-admin/topicPolicies.md)
- [proxy-stats](pulsar-admin/proxy-stats.md)
diff --git a/static/reference/5.0.x/pulsar-admin/migration.md b/static/reference/5.0.x/pulsar-admin/migration.md
new file mode 100644
index 00000000000..d7217ad42f3
--- /dev/null
+++ b/static/reference/5.0.x/pulsar-admin/migration.md
@@ -0,0 +1,74 @@
+# migration
+
+Operations for metadata store migration
+
+
+```shell
+$ pulsar-admin migration subcommand
+```
+
+
+
+## start
+
+Start metadata store migration to target
+
+**Command:**
+
+```shell
+$ pulsar-admin migration start options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+# migration
+
+Operations for metadata store migration
+
+
+```shell
+$ pulsar-admin migration subcommand
+```
+
+
+
+## start
+
+Start metadata store migration to target
+
+**Command:**
+
+```shell
+$ pulsar-admin migration start options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## status
+
+Check migration status
+
+**Command:**
+
+```shell
+$ pulsar-admin migration status options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
diff --git a/static/reference/5.0.x/pulsar-admin/scalable-topics.md b/static/reference/5.0.x/pulsar-admin/scalable-topics.md
new file mode 100644
index 00000000000..0f9b78d9396
--- /dev/null
+++ b/static/reference/5.0.x/pulsar-admin/scalable-topics.md
@@ -0,0 +1,1090 @@
+# scalable-topics
+
+Operations on scalable topics
+
+
+```shell
+$ pulsar-admin scalable-topics subcommand
+```
+
+
+
+## list
+
+Get the list of scalable topics under a namespace, optionally filtered to those whose properties contain every given key=value pair
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics list options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+# scalable-topics
+
+Operations on scalable topics
+
+
+```shell
+$ pulsar-admin scalable-topics subcommand
+```
+
+
+
+## list
+
+Get the list of scalable topics under a namespace, optionally filtered to those whose properties contain every given key=value pair
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics list options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## create
+
+Create a new scalable topic
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics create options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+# scalable-topics
+
+Operations on scalable topics
+
+
+```shell
+$ pulsar-admin scalable-topics subcommand
+```
+
+
+
+## list
+
+Get the list of scalable topics under a namespace, optionally filtered to those whose properties contain every given key=value pair
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics list options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## create
+
+Create a new scalable topic
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics create options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## migrate
+
+Migrate an existing regular (partitioned or non-partitioned) topic to a scalable topic. Fails if legacy v4 clients are still connected unless --force is set.
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics migrate options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+# scalable-topics
+
+Operations on scalable topics
+
+
+```shell
+$ pulsar-admin scalable-topics subcommand
+```
+
+
+
+## list
+
+Get the list of scalable topics under a namespace, optionally filtered to those whose properties contain every given key=value pair
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics list options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## create
+
+Create a new scalable topic
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics create options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## migrate
+
+Migrate an existing regular (partitioned or non-partitioned) topic to a scalable topic. Fails if legacy v4 clients are still connected unless --force is set.
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics migrate options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## get-metadata
+
+Get scalable topic metadata
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics get-metadata options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+# scalable-topics
+
+Operations on scalable topics
+
+
+```shell
+$ pulsar-admin scalable-topics subcommand
+```
+
+
+
+## list
+
+Get the list of scalable topics under a namespace, optionally filtered to those whose properties contain every given key=value pair
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics list options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## create
+
+Create a new scalable topic
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics create options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## migrate
+
+Migrate an existing regular (partitioned or non-partitioned) topic to a scalable topic. Fails if legacy v4 clients are still connected unless --force is set.
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics migrate options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## get-metadata
+
+Get scalable topic metadata
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics get-metadata options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## stats
+
+Get aggregated stats for a scalable topic
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics stats options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+# scalable-topics
+
+Operations on scalable topics
+
+
+```shell
+$ pulsar-admin scalable-topics subcommand
+```
+
+
+
+## list
+
+Get the list of scalable topics under a namespace, optionally filtered to those whose properties contain every given key=value pair
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics list options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## create
+
+Create a new scalable topic
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics create options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## migrate
+
+Migrate an existing regular (partitioned or non-partitioned) topic to a scalable topic. Fails if legacy v4 clients are still connected unless --force is set.
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics migrate options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## get-metadata
+
+Get scalable topic metadata
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics get-metadata options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## stats
+
+Get aggregated stats for a scalable topic
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics stats options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## delete
+
+Delete a scalable topic and all its segments
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics delete options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+# scalable-topics
+
+Operations on scalable topics
+
+
+```shell
+$ pulsar-admin scalable-topics subcommand
+```
+
+
+
+## list
+
+Get the list of scalable topics under a namespace, optionally filtered to those whose properties contain every given key=value pair
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics list options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## create
+
+Create a new scalable topic
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics create options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## migrate
+
+Migrate an existing regular (partitioned or non-partitioned) topic to a scalable topic. Fails if legacy v4 clients are still connected unless --force is set.
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics migrate options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## get-metadata
+
+Get scalable topic metadata
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics get-metadata options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## stats
+
+Get aggregated stats for a scalable topic
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics stats options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## delete
+
+Delete a scalable topic and all its segments
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics delete options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## split-segment
+
+Split a segment into two halves
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics split-segment options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+# scalable-topics
+
+Operations on scalable topics
+
+
+```shell
+$ pulsar-admin scalable-topics subcommand
+```
+
+
+
+## list
+
+Get the list of scalable topics under a namespace, optionally filtered to those whose properties contain every given key=value pair
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics list options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## create
+
+Create a new scalable topic
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics create options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## migrate
+
+Migrate an existing regular (partitioned or non-partitioned) topic to a scalable topic. Fails if legacy v4 clients are still connected unless --force is set.
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics migrate options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## get-metadata
+
+Get scalable topic metadata
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics get-metadata options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## stats
+
+Get aggregated stats for a scalable topic
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics stats options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## delete
+
+Delete a scalable topic and all its segments
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics delete options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## split-segment
+
+Split a segment into two halves
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics split-segment options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## merge-segments
+
+Merge two adjacent segments into one
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics merge-segments options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+# scalable-topics
+
+Operations on scalable topics
+
+
+```shell
+$ pulsar-admin scalable-topics subcommand
+```
+
+
+
+## list
+
+Get the list of scalable topics under a namespace, optionally filtered to those whose properties contain every given key=value pair
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics list options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## create
+
+Create a new scalable topic
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics create options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## migrate
+
+Migrate an existing regular (partitioned or non-partitioned) topic to a scalable topic. Fails if legacy v4 clients are still connected unless --force is set.
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics migrate options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## get-metadata
+
+Get scalable topic metadata
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics get-metadata options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## stats
+
+Get aggregated stats for a scalable topic
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics stats options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## delete
+
+Delete a scalable topic and all its segments
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics delete options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## split-segment
+
+Split a segment into two halves
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics split-segment options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## merge-segments
+
+Merge two adjacent segments into one
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics merge-segments options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## seek
+
+Reset a subscription's cursor on every segment to a given point in time. Pass --time as a relative offset (e.g. 1h, 5d) — the cursor is reset to (now - offset).
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics seek options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+# scalable-topics
+
+Operations on scalable topics
+
+
+```shell
+$ pulsar-admin scalable-topics subcommand
+```
+
+
+
+## list
+
+Get the list of scalable topics under a namespace, optionally filtered to those whose properties contain every given key=value pair
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics list options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## create
+
+Create a new scalable topic
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics create options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## migrate
+
+Migrate an existing regular (partitioned or non-partitioned) topic to a scalable topic. Fails if legacy v4 clients are still connected unless --force is set.
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics migrate options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## get-metadata
+
+Get scalable topic metadata
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics get-metadata options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## stats
+
+Get aggregated stats for a scalable topic
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics stats options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## delete
+
+Delete a scalable topic and all its segments
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics delete options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## split-segment
+
+Split a segment into two halves
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics split-segment options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## merge-segments
+
+Merge two adjacent segments into one
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics merge-segments options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## seek
+
+Reset a subscription's cursor on every segment to a given point in time. Pass --time as a relative offset (e.g. 1h, 5d) — the cursor is reset to (now - offset).
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics seek options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## clear-backlog
+
+Skip every undelivered message on the subscription, across every segment in the DAG.
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics clear-backlog options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
diff --git a/static/reference/next/_sidebar.md b/static/reference/next/_sidebar.md
index 3d40539231a..3f4af9b1046 100644
--- a/static/reference/next/_sidebar.md
+++ b/static/reference/next/_sidebar.md
@@ -22,10 +22,12 @@
- [clusters](pulsar-admin/clusters.md)
- [functions](pulsar-admin/functions.md)
- [functions-worker](pulsar-admin/functions-worker.md)
+ - [migration](pulsar-admin/migration.md)
- [namespaces](pulsar-admin/namespaces.md)
- [ns-isolation-policy](pulsar-admin/ns-isolation-policy.md)
- [sources](pulsar-admin/sources.md)
- [sinks](pulsar-admin/sinks.md)
+ - [scalable-topics](pulsar-admin/scalable-topics.md)
- [topics](pulsar-admin/topics.md)
- [topicPolicies](pulsar-admin/topicPolicies.md)
- [proxy-stats](pulsar-admin/proxy-stats.md)
diff --git a/static/reference/next/pulsar-admin/migration.md b/static/reference/next/pulsar-admin/migration.md
new file mode 100644
index 00000000000..d7217ad42f3
--- /dev/null
+++ b/static/reference/next/pulsar-admin/migration.md
@@ -0,0 +1,74 @@
+# migration
+
+Operations for metadata store migration
+
+
+```shell
+$ pulsar-admin migration subcommand
+```
+
+
+
+## start
+
+Start metadata store migration to target
+
+**Command:**
+
+```shell
+$ pulsar-admin migration start options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+# migration
+
+Operations for metadata store migration
+
+
+```shell
+$ pulsar-admin migration subcommand
+```
+
+
+
+## start
+
+Start metadata store migration to target
+
+**Command:**
+
+```shell
+$ pulsar-admin migration start options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## status
+
+Check migration status
+
+**Command:**
+
+```shell
+$ pulsar-admin migration status options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
diff --git a/static/reference/next/pulsar-admin/scalable-topics.md b/static/reference/next/pulsar-admin/scalable-topics.md
new file mode 100644
index 00000000000..0f9b78d9396
--- /dev/null
+++ b/static/reference/next/pulsar-admin/scalable-topics.md
@@ -0,0 +1,1090 @@
+# scalable-topics
+
+Operations on scalable topics
+
+
+```shell
+$ pulsar-admin scalable-topics subcommand
+```
+
+
+
+## list
+
+Get the list of scalable topics under a namespace, optionally filtered to those whose properties contain every given key=value pair
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics list options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+# scalable-topics
+
+Operations on scalable topics
+
+
+```shell
+$ pulsar-admin scalable-topics subcommand
+```
+
+
+
+## list
+
+Get the list of scalable topics under a namespace, optionally filtered to those whose properties contain every given key=value pair
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics list options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## create
+
+Create a new scalable topic
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics create options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+# scalable-topics
+
+Operations on scalable topics
+
+
+```shell
+$ pulsar-admin scalable-topics subcommand
+```
+
+
+
+## list
+
+Get the list of scalable topics under a namespace, optionally filtered to those whose properties contain every given key=value pair
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics list options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## create
+
+Create a new scalable topic
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics create options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## migrate
+
+Migrate an existing regular (partitioned or non-partitioned) topic to a scalable topic. Fails if legacy v4 clients are still connected unless --force is set.
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics migrate options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+# scalable-topics
+
+Operations on scalable topics
+
+
+```shell
+$ pulsar-admin scalable-topics subcommand
+```
+
+
+
+## list
+
+Get the list of scalable topics under a namespace, optionally filtered to those whose properties contain every given key=value pair
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics list options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## create
+
+Create a new scalable topic
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics create options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## migrate
+
+Migrate an existing regular (partitioned or non-partitioned) topic to a scalable topic. Fails if legacy v4 clients are still connected unless --force is set.
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics migrate options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## get-metadata
+
+Get scalable topic metadata
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics get-metadata options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+# scalable-topics
+
+Operations on scalable topics
+
+
+```shell
+$ pulsar-admin scalable-topics subcommand
+```
+
+
+
+## list
+
+Get the list of scalable topics under a namespace, optionally filtered to those whose properties contain every given key=value pair
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics list options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## create
+
+Create a new scalable topic
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics create options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## migrate
+
+Migrate an existing regular (partitioned or non-partitioned) topic to a scalable topic. Fails if legacy v4 clients are still connected unless --force is set.
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics migrate options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## get-metadata
+
+Get scalable topic metadata
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics get-metadata options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## stats
+
+Get aggregated stats for a scalable topic
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics stats options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+# scalable-topics
+
+Operations on scalable topics
+
+
+```shell
+$ pulsar-admin scalable-topics subcommand
+```
+
+
+
+## list
+
+Get the list of scalable topics under a namespace, optionally filtered to those whose properties contain every given key=value pair
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics list options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## create
+
+Create a new scalable topic
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics create options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## migrate
+
+Migrate an existing regular (partitioned or non-partitioned) topic to a scalable topic. Fails if legacy v4 clients are still connected unless --force is set.
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics migrate options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## get-metadata
+
+Get scalable topic metadata
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics get-metadata options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## stats
+
+Get aggregated stats for a scalable topic
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics stats options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## delete
+
+Delete a scalable topic and all its segments
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics delete options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+# scalable-topics
+
+Operations on scalable topics
+
+
+```shell
+$ pulsar-admin scalable-topics subcommand
+```
+
+
+
+## list
+
+Get the list of scalable topics under a namespace, optionally filtered to those whose properties contain every given key=value pair
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics list options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## create
+
+Create a new scalable topic
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics create options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## migrate
+
+Migrate an existing regular (partitioned or non-partitioned) topic to a scalable topic. Fails if legacy v4 clients are still connected unless --force is set.
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics migrate options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## get-metadata
+
+Get scalable topic metadata
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics get-metadata options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## stats
+
+Get aggregated stats for a scalable topic
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics stats options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## delete
+
+Delete a scalable topic and all its segments
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics delete options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## split-segment
+
+Split a segment into two halves
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics split-segment options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+# scalable-topics
+
+Operations on scalable topics
+
+
+```shell
+$ pulsar-admin scalable-topics subcommand
+```
+
+
+
+## list
+
+Get the list of scalable topics under a namespace, optionally filtered to those whose properties contain every given key=value pair
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics list options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## create
+
+Create a new scalable topic
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics create options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## migrate
+
+Migrate an existing regular (partitioned or non-partitioned) topic to a scalable topic. Fails if legacy v4 clients are still connected unless --force is set.
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics migrate options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## get-metadata
+
+Get scalable topic metadata
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics get-metadata options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## stats
+
+Get aggregated stats for a scalable topic
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics stats options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## delete
+
+Delete a scalable topic and all its segments
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics delete options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## split-segment
+
+Split a segment into two halves
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics split-segment options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## merge-segments
+
+Merge two adjacent segments into one
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics merge-segments options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+# scalable-topics
+
+Operations on scalable topics
+
+
+```shell
+$ pulsar-admin scalable-topics subcommand
+```
+
+
+
+## list
+
+Get the list of scalable topics under a namespace, optionally filtered to those whose properties contain every given key=value pair
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics list options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## create
+
+Create a new scalable topic
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics create options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## migrate
+
+Migrate an existing regular (partitioned or non-partitioned) topic to a scalable topic. Fails if legacy v4 clients are still connected unless --force is set.
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics migrate options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## get-metadata
+
+Get scalable topic metadata
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics get-metadata options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## stats
+
+Get aggregated stats for a scalable topic
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics stats options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## delete
+
+Delete a scalable topic and all its segments
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics delete options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## split-segment
+
+Split a segment into two halves
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics split-segment options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## merge-segments
+
+Merge two adjacent segments into one
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics merge-segments options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## seek
+
+Reset a subscription's cursor on every segment to a given point in time. Pass --time as a relative offset (e.g. 1h, 5d) — the cursor is reset to (now - offset).
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics seek options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+# scalable-topics
+
+Operations on scalable topics
+
+
+```shell
+$ pulsar-admin scalable-topics subcommand
+```
+
+
+
+## list
+
+Get the list of scalable topics under a namespace, optionally filtered to those whose properties contain every given key=value pair
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics list options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## create
+
+Create a new scalable topic
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics create options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## migrate
+
+Migrate an existing regular (partitioned or non-partitioned) topic to a scalable topic. Fails if legacy v4 clients are still connected unless --force is set.
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics migrate options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## get-metadata
+
+Get scalable topic metadata
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics get-metadata options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## stats
+
+Get aggregated stats for a scalable topic
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics stats options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## delete
+
+Delete a scalable topic and all its segments
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics delete options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## split-segment
+
+Split a segment into two halves
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics split-segment options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## merge-segments
+
+Merge two adjacent segments into one
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics merge-segments options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## seek
+
+Reset a subscription's cursor on every segment to a given point in time. Pass --time as a relative offset (e.g. 1h, 5d) — the cursor is reset to (now - offset).
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics seek options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
+
+## clear-backlog
+
+Skip every undelivered message on the subscription, across every segment in the DAG.
+
+**Command:**
+
+```shell
+$ pulsar-admin scalable-topics clear-backlog options
+```
+
+**Options:**
+
+|Flag|Description|Default|
+|---|---|---|
+| `[-h, --help]` | Show this help message and exit.|null||
+| `[-v, --version]` | Print version information and exit.|null||
+
diff --git a/tools/pytools/lib/execute/pulsar_admin_clidoc_generator.py b/tools/pytools/lib/execute/pulsar_admin_clidoc_generator.py
index 533919e7c53..123a9393ec0 100644
--- a/tools/pytools/lib/execute/pulsar_admin_clidoc_generator.py
+++ b/tools/pytools/lib/execute/pulsar_admin_clidoc_generator.py
@@ -30,6 +30,10 @@ def execute(basedir: Path, version: str):
admin = basedir / 'bin' / 'pulsar-admin'
reference = site_path() / 'static' / 'reference' / version / 'pulsar-admin'
+ # Every `pulsar-admin` subcommand, mirroring `pulsar-admin --help`. Keep this
+ # in sync when subcommands are added or removed; the only command
+ # intentionally omitted is `documents`, which is the doc-generation command
+ # itself.
commands = [
'broker-stats',
'brokers',
@@ -37,10 +41,12 @@ def execute(basedir: Path, version: str):
'clusters',
'functions',
'functions-worker',
+ 'migration',
'namespaces',
'ns-isolation-policy',
'sources',
'sinks',
+ 'scalable-topics',
'topics',
'topicPolicies',
'proxy-stats',
(pulsar-site) 01/16: add rest-apidoc for 5.0.0-M1
Posted by lh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
lhotari pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/pulsar-site.git
commit 58108c679bdb08763911ac132bfb234bc0c61945
Author: Lari Hotari <lh...@users.noreply.github.com>
AuthorDate: Tue Jun 23 17:13:11 2026 +0300
add rest-apidoc for 5.0.0-M1
---
static/openapi/5.0.0-M1/openapi.json | 40219 +++++++++++++++++++
static/openapi/5.0.0-M1/openapifunctions.json | 2033 +
static/openapi/5.0.0-M1/openapilookup.json | 190 +
static/openapi/5.0.0-M1/openapipackages.json | 549 +
static/openapi/5.0.0-M1/openapisink.json | 1386 +
static/openapi/5.0.0-M1/openapisource.json | 1357 +
static/openapi/5.0.0-M1/openapitransactions.json | 1472 +
static/openapi/5.0.0-M1/v2/openapi.json | 40219 +++++++++++++++++++
static/openapi/5.0.0-M1/v2/openapilookup.json | 190 +
static/openapi/5.0.0-M1/v3/openapifunctions.json | 2033 +
static/openapi/5.0.0-M1/v3/openapipackages.json | 549 +
static/openapi/5.0.0-M1/v3/openapisink.json | 1386 +
static/openapi/5.0.0-M1/v3/openapisource.json | 1357 +
.../openapi/5.0.0-M1/v3/openapitransactions.json | 1472 +
static/swagger/restApiVersions.json | 19 +
15 files changed, 94431 insertions(+)
diff --git a/static/openapi/5.0.0-M1/openapi.json b/static/openapi/5.0.0-M1/openapi.json
new file mode 100644
index 00000000000..63c56711950
--- /dev/null
+++ b/static/openapi/5.0.0-M1/openapi.json
@@ -0,0 +1,40219 @@
+{
+ "components": {
+ "schemas": {
+ "AllocatorStats": {
+ "properties": {
+ "directArenas": {
+ "items": {
+ "$ref": "#/components/schemas/PoolArenaStats"
+ },
+ "type": "array"
+ },
+ "heapArenas": {
+ "items": {
+ "$ref": "#/components/schemas/PoolArenaStats"
+ },
+ "type": "array"
+ },
+ "normalCacheSize": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "numDirectArenas": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "numHeapArenas": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "numThreadLocalCaches": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "smallCacheSize": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "usedDirectMemory": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "usedHeapMemory": {
+ "format": "int64",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "AuthPolicies": {
+ "properties": {
+ "namespaceAuthentication": {
+ "additionalProperties": {
+ "items": {
+ "enum": [
+ "produce",
+ "consume",
+ "functions",
+ "sources",
+ "sinks",
+ "packages"
+ ],
+ "type": "string"
+ },
+ "type": "array",
+ "uniqueItems": true
+ },
+ "type": "object"
+ },
+ "subscriptionAuthentication": {
+ "additionalProperties": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array",
+ "uniqueItems": true
+ },
+ "type": "object"
+ },
+ "topicAuthentication": {
+ "additionalProperties": {
+ "additionalProperties": {
+ "items": {
+ "enum": [
+ "produce",
+ "consume",
+ "functions",
+ "sources",
+ "sinks",
+ "packages"
+ ],
+ "type": "string"
+ },
+ "type": "array",
+ "uniqueItems": true
+ },
+ "type": "object"
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "AutoFailoverPolicyData": {
+ "description": "The data of auto-failover policy configuration",
+ "example": {
+ "parameters": {
+ "": ""
+ },
+ "policy_type": "min_available"
+ },
+ "properties": {
+ "parameters": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "policyType": {
+ "enum": [
+ "min_available"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "AutoScalePolicyOverride": {
+ "properties": {
+ "enabled": {
+ "type": "boolean"
+ },
+ "maxDagDepth": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "maxSegments": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "mergeBytesRateInThreshold": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "mergeBytesRateOutThreshold": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "mergeCooldownSeconds": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "mergeMsgRateInThreshold": {
+ "format": "double",
+ "type": "number"
+ },
+ "mergeMsgRateOutThreshold": {
+ "format": "double",
+ "type": "number"
+ },
+ "mergeWindowSeconds": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "minSegments": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "splitBytesRateInThreshold": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "splitBytesRateOutThreshold": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "splitCooldownSeconds": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "splitMsgRateInThreshold": {
+ "format": "double",
+ "type": "number"
+ },
+ "splitMsgRateOutThreshold": {
+ "format": "double",
+ "type": "number"
+ }
+ },
+ "type": "object"
+ },
+ "AutoSubscriptionCreationOverride": {
+ "properties": {
+ "allowAutoSubscriptionCreation": {
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "AutoSubscriptionCreationOverrideImpl": {
+ "properties": {
+ "allowAutoSubscriptionCreation": {
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "AutoTopicCreationOverride": {
+ "properties": {
+ "allowAutoTopicCreation": {
+ "type": "boolean"
+ },
+ "defaultNumPartitions": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "topicType": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "AutoTopicCreationOverrideImpl": {
+ "properties": {
+ "allowAutoTopicCreation": {
+ "type": "boolean"
+ },
+ "defaultNumPartitions": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "topicType": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "BacklogQuota": {
+ "properties": {
+ "limit": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "limitSize": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "limitTime": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "policy": {
+ "enum": [
+ "producer_request_hold",
+ "producer_exception",
+ "consumer_backlog_eviction"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "BacklogQuotaImpl": {
+ "properties": {
+ "limit": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "limitSize": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "limitTime": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "policy": {
+ "enum": [
+ "producer_request_hold",
+ "producer_exception",
+ "consumer_backlog_eviction"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "BookieAffinityGroupData": {
+ "properties": {
+ "bookkeeperAffinityGroupPrimary": {
+ "type": "string"
+ },
+ "bookkeeperAffinityGroupSecondary": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "BookieAffinityGroupDataImpl": {
+ "properties": {
+ "bookkeeperAffinityGroupPrimary": {
+ "type": "string"
+ },
+ "bookkeeperAffinityGroupSecondary": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "BookieInfo": {
+ "properties": {
+ "hostname": {
+ "type": "string"
+ },
+ "rack": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "BookiesClusterInfo": {
+ "properties": {
+ "bookies": {
+ "items": {
+ "$ref": "#/components/schemas/RawBookieInfo"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "BookiesRackConfiguration": {
+ "properties": {
+ "empty": {
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "BrokerInfo": {
+ "properties": {
+ "brokerId": {
+ "type": "string"
+ },
+ "serviceUrl": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "BrokerNamespaceIsolationData": {
+ "description": "The namespace isolation data for a given broker",
+ "properties": {
+ "brokerName": {
+ "description": "The broker name",
+ "example": "broker1:8080",
+ "type": "string"
+ },
+ "namespaceRegex": {
+ "description": "The namespace-isolation policies attached to this broker",
+ "items": {
+ "description": "The namespace-isolation policies attached to this broker",
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "policyName": {
+ "description": "Policy name",
+ "example": "my-policy",
+ "type": "string"
+ },
+ "primary": {
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "BundlesData": {
+ "properties": {
+ "boundaries": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "numBundles": {
+ "format": "int32",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "BundlesDataImpl": {
+ "properties": {
+ "boundaries": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "numBundles": {
+ "format": "int32",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "ClusterData": {
+ "description": "The configuration data for a cluster",
+ "properties": {
+ "authenticationParameters": {
+ "description": "Authentication parameters when client would like to connect to cluster.",
+ "type": "string"
+ },
+ "authenticationPlugin": {
+ "description": "Authentication plugin when client would like to connect to cluster.",
+ "example": "org.apache.pulsar.client.impl.auth.AuthenticationToken",
+ "type": "string"
+ },
+ "brokerClientCertificateFilePath": {
+ "description": "TLS certificate file for internal client, used by the internal client to authenticate with Pulsar brokers",
+ "type": "string"
+ },
+ "brokerClientKeyFilePath": {
+ "description": "TLS private key file for internal client, used by the internal client to authenticate with Pulsar brokers",
+ "type": "string"
+ },
+ "brokerClientSslFactoryPlugin": {
+ "description": "SSL Factory plugin used by internal client to generate the SSL Context and Engine",
+ "type": "string"
+ },
+ "brokerClientSslFactoryPluginParams": {
+ "description": "Parameters used by the internal client's SSL factory plugin to generate the SSL Context and Engine",
+ "type": "string"
+ },
+ "brokerClientTlsEnabled": {
+ "description": "Enable TLS when talking with other brokers in the same cluster (admin operation) or different clusters (replication)",
+ "type": "boolean"
+ },
+ "brokerClientTlsEnabledWithKeyStore": {
+ "description": "Whether the internal client uses KeyStore type to authenticate with other Pulsar brokers",
+ "type": "boolean"
+ },
+ "brokerClientTlsKeyStore": {
+ "description": "TLS KeyStore path for internal client, used by the internal client to authenticate with Pulsar brokers",
+ "type": "string"
+ },
+ "brokerClientTlsKeyStorePassword": {
+ "description": "TLS KeyStore password for internal client, used by the internal client to authenticate with Pulsar brokers",
+ "type": "string"
+ },
+ "brokerClientTlsKeyStoreType": {
+ "description": "TLS KeyStore type configuration for internal client: JKS, PKCS12, used by the internal client to authenticate with Pulsar brokers",
+ "type": "string"
+ },
+ "brokerClientTlsTrustStore": {
+ "description": "TLS TrustStore path for internal client used by the internal client to authenticate with Pulsar brokers",
+ "type": "string"
+ },
+ "brokerClientTlsTrustStorePassword": {
+ "description": "TLS TrustStore password for internal client used by the internal client to authenticate with Pulsar brokers",
+ "type": "string"
+ },
+ "brokerClientTlsTrustStoreType": {
+ "description": "TLS TrustStore type configuration for internal client: JKS, PKCS12 used by the internal client to authenticate with Pulsar brokers",
+ "example": "JKS",
+ "type": "string"
+ },
+ "brokerClientTrustCertsFilePath": {
+ "description": "Path for the trusted TLS certificate file for outgoing connection to a server (broker)",
+ "type": "string"
+ },
+ "brokerServiceUrl": {
+ "description": "The broker service url (for produce and consume operations)",
+ "example": "pulsar://pulsar.example.com:6650",
+ "type": "string"
+ },
+ "brokerServiceUrlTls": {
+ "description": "The secured broker service url (for produce and consume operations)",
+ "example": "pulsar+ssl://pulsar.example.com:6651",
+ "type": "string"
+ },
+ "listenerName": {
+ "description": "listenerName when client would like to connect to cluster",
+ "type": "string"
+ },
+ "peerClusterNames": {
+ "description": "A set of peer cluster names",
+ "items": {
+ "description": "A set of peer cluster names",
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "proxyProtocol": {
+ "description": "Protocol to decide the type of proxy routing, e.g. SNI-routing",
+ "enum": [
+ "SNI"
+ ],
+ "example": "SNI",
+ "type": "string"
+ },
+ "proxyServiceUrl": {
+ "description": "Proxy-service url when client would like to connect to broker via proxy.",
+ "example": "pulsar+ssl://ats-proxy.example.com:4443 or pulsar://ats-proxy.example.com:4080",
+ "type": "string"
+ },
+ "serviceUrl": {
+ "description": "The HTTP rest service URL (for admin operations)",
+ "example": "http://pulsar.example.com:8080",
+ "type": "string"
+ },
+ "serviceUrlTls": {
+ "description": "The HTTPS rest service URL (for admin operations)",
+ "example": "https://pulsar.example.com:8443",
+ "type": "string"
+ },
+ "tlsAllowInsecureConnection": {
+ "description": "Allow TLS connections to servers whose certificate cannot be verified to have been signed by a trusted certificate authority.",
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "ClusterUrl": {
+ "properties": {
+ "brokerServiceUrl": {
+ "type": "string"
+ },
+ "brokerServiceUrlTls": {
+ "type": "string"
+ },
+ "empty": {
+ "type": "boolean"
+ },
+ "serviceUrl": {
+ "type": "string"
+ },
+ "serviceUrlTls": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "CompactionStats": {
+ "properties": {
+ "lastCompactionDurationTimeInMills": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "lastCompactionFailedTimestamp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "lastCompactionRemovedEventCount": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "lastCompactionSucceedTimestamp": {
+ "format": "int64",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "CompactionStatsImpl": {
+ "properties": {
+ "lastCompactionDurationTimeInMills": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "lastCompactionFailedTimestamp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "lastCompactionRemovedEventCount": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "lastCompactionSucceedTimestamp": {
+ "format": "int64",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "ConnectorDefinition": {
+ "properties": {
+ "description": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "sinkClass": {
+ "type": "string"
+ },
+ "sinkConfigClass": {
+ "type": "string"
+ },
+ "sourceClass": {
+ "type": "string"
+ },
+ "sourceConfigClass": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "ConsumerStats": {
+ "properties": {
+ "address": {
+ "type": "string"
+ },
+ "appId": {
+ "type": "string"
+ },
+ "availablePermits": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "avgMessagesPerEntry": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "blockedConsumerOnUnackedMsgs": {
+ "type": "boolean"
+ },
+ "bytesOutCounter": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "chunkedMessageRate": {
+ "format": "double",
+ "type": "number"
+ },
+ "clientVersion": {
+ "type": "string"
+ },
+ "connectedSince": {
+ "type": "string"
+ },
+ "consumerName": {
+ "type": "string"
+ },
+ "drainingHashes": {
+ "items": {
+ "$ref": "#/components/schemas/DrainingHash"
+ },
+ "type": "array"
+ },
+ "drainingHashesClearedTotal": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "drainingHashesCount": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "drainingHashesUnackedMessages": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "firstConsumedFlowTimestamp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "firstMessagesSentTimestamp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "keyHashRangeArrays": {
+ "items": {
+ "items": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "type": "array"
+ },
+ "type": "array"
+ },
+ "keyHashRanges": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "lastAckedTimestamp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "lastConsumedFlowTimestamp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "lastConsumedTimestamp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "messageAckRate": {
+ "format": "double",
+ "type": "number"
+ },
+ "metadata": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "msgOutCounter": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "msgRateOut": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgRateRedeliver": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgThroughputOut": {
+ "format": "double",
+ "type": "number"
+ },
+ "readPositionWhenJoining": {
+ "type": "string"
+ },
+ "unackedMessages": {
+ "format": "int32",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "CursorDetails": {
+ "properties": {
+ "cursorBacklog": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "cursorLedgerId": {
+ "format": "int64",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "CursorInfo": {
+ "properties": {
+ "creationDate": {
+ "type": "string"
+ },
+ "cursorsLedgerId": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "individualDeletedMessages": {
+ "items": {
+ "$ref": "#/components/schemas/MessageRangeInfo"
+ },
+ "type": "array"
+ },
+ "markDelete": {
+ "$ref": "#/components/schemas/PositionInfo"
+ },
+ "modificationDate": {
+ "type": "string"
+ },
+ "properties": {
+ "additionalProperties": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "type": "object"
+ },
+ "version": {
+ "format": "int64",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "CursorStats": {
+ "properties": {
+ "active": {
+ "type": "boolean"
+ },
+ "cursorLedger": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "cursorLedgerLastEntry": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "individuallyDeletedMessages": {
+ "type": "string"
+ },
+ "lastLedgerSwitchTimestamp": {
+ "type": "string"
+ },
+ "markDeletePosition": {
+ "type": "string"
+ },
+ "messagesConsumedCounter": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "numberOfEntriesSinceFirstNotAckedMessage": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "pendingReadOps": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "properties": {
+ "additionalProperties": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "type": "object"
+ },
+ "readPosition": {
+ "type": "string"
+ },
+ "state": {
+ "type": "string"
+ },
+ "subscriptionHavePendingRead": {
+ "type": "boolean"
+ },
+ "subscriptionHavePendingReplayRead": {
+ "type": "boolean"
+ },
+ "totalNonContiguousDeletedMessagesRange": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "waitingReadOp": {
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "DelayedDeliveryPolicies": {
+ "properties": {
+ "active": {
+ "type": "boolean"
+ },
+ "maxDeliveryDelayInMillis": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "tickTime": {
+ "format": "int64",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "DeleteSchemaResponse": {
+ "properties": {
+ "version": {
+ "format": "int64",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "DispatchRate": {
+ "properties": {
+ "dispatchThrottlingRateInByte": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "dispatchThrottlingRateInMsg": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "ratePeriodInSecond": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "relativeToPublishRate": {
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "DispatchRateImpl": {
+ "properties": {
+ "dispatchThrottlingRateInByte": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "dispatchThrottlingRateInMsg": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "ratePeriodInSecond": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "relativeToPublishRate": {
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "DrainingHash": {
+ "properties": {
+ "blockedAttempts": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "hash": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "unackMsgs": {
+ "format": "int32",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "EntryFilters": {
+ "properties": {
+ "entryFilterNames": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "FailureDomain": {
+ "description": "The data of a failure domain configuration in a cluster",
+ "properties": {
+ "brokers": {
+ "description": "The collection of brokers in the same failure domain",
+ "example": "[ 'broker-1', 'broker-2' ]",
+ "items": {
+ "description": "The collection of brokers in the same failure domain",
+ "example": "[ 'broker-1', 'broker-2' ]",
+ "type": "string"
+ },
+ "type": "array",
+ "uniqueItems": true
+ }
+ },
+ "type": "object"
+ },
+ "FunctionInstanceStatsData": {
+ "properties": {
+ "avgProcessLatency": {
+ "format": "double",
+ "type": "number"
+ },
+ "lastInvocation": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "oneMin": {
+ "$ref": "#/components/schemas/FunctionInstanceStatsDataBase"
+ },
+ "processedSuccessfullyTotal": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "receivedTotal": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "systemExceptionsTotal": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "userExceptionsTotal": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "userMetrics": {
+ "additionalProperties": {
+ "format": "double",
+ "type": "number"
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "FunctionInstanceStatsDataBase": {
+ "properties": {
+ "avgProcessLatency": {
+ "format": "double",
+ "type": "number"
+ },
+ "processedSuccessfullyTotal": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "receivedTotal": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "systemExceptionsTotal": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "userExceptionsTotal": {
+ "format": "int64",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "GetAllVersionsSchemaResponse": {
+ "properties": {
+ "getSchemaResponses": {
+ "items": {
+ "$ref": "#/components/schemas/GetSchemaResponse"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "GetSchemaResponse": {
+ "properties": {
+ "data": {
+ "type": "string"
+ },
+ "properties": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "timestamp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "type": {
+ "enum": [
+ "NONE",
+ "STRING",
+ "JSON",
+ "PROTOBUF",
+ "AVRO",
+ "BOOLEAN",
+ "INT8",
+ "INT16",
+ "INT32",
+ "INT64",
+ "FLOAT",
+ "DOUBLE",
+ "DATE",
+ "TIME",
+ "TIMESTAMP",
+ "KEY_VALUE",
+ "INSTANT",
+ "LOCAL_DATE",
+ "LOCAL_TIME",
+ "LOCAL_DATE_TIME",
+ "PROTOBUF_NATIVE",
+ "EXTERNAL",
+ "BYTES",
+ "AUTO",
+ "AUTO_CONSUME",
+ "AUTO_PUBLISH"
+ ],
+ "type": "string"
+ },
+ "version": {
+ "format": "int64",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "GrantTopicPermissionOptions": {
+ "properties": {
+ "actions": {
+ "items": {
+ "enum": [
+ "produce",
+ "consume",
+ "functions",
+ "sources",
+ "sinks",
+ "packages"
+ ],
+ "type": "string"
+ },
+ "type": "array",
+ "uniqueItems": true
+ },
+ "role": {
+ "type": "string"
+ },
+ "topic": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "HashRange": {
+ "properties": {
+ "end": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "start": {
+ "format": "int32",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "InactiveTopicPolicies": {
+ "properties": {
+ "deleteWhileInactive": {
+ "type": "boolean"
+ },
+ "inactiveTopicDeleteMode": {
+ "enum": [
+ "delete_when_no_subscriptions",
+ "delete_when_subscriptions_caught_up"
+ ],
+ "type": "string"
+ },
+ "maxInactiveDurationSeconds": {
+ "format": "int32",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "InternalConfigurationData": {
+ "properties": {
+ "bookkeeperMetadataServiceUri": {
+ "type": "string"
+ },
+ "configurationMetadataStoreUrl": {
+ "type": "string"
+ },
+ "configurationStoreServers": {
+ "type": "string"
+ },
+ "ledgersRootPath": {
+ "type": "string"
+ },
+ "metadataStoreUrl": {
+ "type": "string"
+ },
+ "stateStorageServiceUrl": {
+ "type": "string"
+ },
+ "zookeeperServers": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "IsCompatibilityResponse": {
+ "properties": {
+ "compatibility": {
+ "type": "boolean"
+ },
+ "schemaCompatibilityStrategy": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "LedgerDetails": {
+ "properties": {
+ "entries": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "ledgerId": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "size": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "timestamp": {
+ "format": "int64",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "LedgerInfo": {
+ "properties": {
+ "entries": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "ledgerId": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "metadata": {
+ "type": "string"
+ },
+ "offloaded": {
+ "type": "boolean"
+ },
+ "properties": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "size": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "underReplicated": {
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "LoadManagerReport": {
+ "properties": {
+ "bandwidthIn": {
+ "$ref": "#/components/schemas/ResourceUsage"
+ },
+ "bandwidthOut": {
+ "$ref": "#/components/schemas/ResourceUsage"
+ },
+ "brokerId": {
+ "type": "string"
+ },
+ "brokerVersionString": {
+ "type": "string"
+ },
+ "bundleStats": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/NamespaceBundleStats"
+ },
+ "type": "object"
+ },
+ "cpu": {
+ "$ref": "#/components/schemas/ResourceUsage"
+ },
+ "directMemory": {
+ "$ref": "#/components/schemas/ResourceUsage"
+ },
+ "lastUpdate": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "loadManagerClassName": {
+ "type": "string"
+ },
+ "memory": {
+ "$ref": "#/components/schemas/ResourceUsage"
+ },
+ "msgRateIn": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgRateOut": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgThroughputIn": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgThroughputOut": {
+ "format": "double",
+ "type": "number"
+ },
+ "nonPersistentTopicsEnabled": {
+ "type": "boolean"
+ },
+ "numBundles": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "numConsumers": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "numProducers": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "numTopics": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "persistentTopicsEnabled": {
+ "type": "boolean"
+ },
+ "protocols": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "pulsarServiceUrl": {
+ "type": "string"
+ },
+ "pulsarServiceUrlTls": {
+ "type": "string"
+ },
+ "startTimestamp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "webServiceUrl": {
+ "type": "string"
+ },
+ "webServiceUrlTls": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "LoadReport": {
+ "properties": {
+ "allocatedBandwidthIn": {
+ "format": "double",
+ "type": "number"
+ },
+ "allocatedBandwidthOut": {
+ "format": "double",
+ "type": "number"
+ },
+ "allocatedCPU": {
+ "format": "double",
+ "type": "number"
+ },
+ "allocatedMemory": {
+ "format": "double",
+ "type": "number"
+ },
+ "allocatedMsgRateIn": {
+ "format": "double",
+ "type": "number"
+ },
+ "allocatedMsgRateOut": {
+ "format": "double",
+ "type": "number"
+ },
+ "bandwidthIn": {
+ "$ref": "#/components/schemas/ResourceUsage"
+ },
+ "bandwidthOut": {
+ "$ref": "#/components/schemas/ResourceUsage"
+ },
+ "brokerVersionString": {
+ "type": "string"
+ },
+ "bundleGains": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array",
+ "uniqueItems": true
+ },
+ "bundleLosses": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array",
+ "uniqueItems": true
+ },
+ "bundleStats": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/NamespaceBundleStats"
+ },
+ "type": "object"
+ },
+ "cpu": {
+ "$ref": "#/components/schemas/ResourceUsage"
+ },
+ "directMemory": {
+ "$ref": "#/components/schemas/ResourceUsage"
+ },
+ "lastUpdate": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "loadManagerClassName": {
+ "type": "string"
+ },
+ "loadReportType": {
+ "type": "string"
+ },
+ "memory": {
+ "$ref": "#/components/schemas/ResourceUsage"
+ },
+ "msgRateIn": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgRateOut": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgThroughputIn": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgThroughputOut": {
+ "format": "double",
+ "type": "number"
+ },
+ "name": {
+ "type": "string"
+ },
+ "nonPersistentTopicsEnabled": {
+ "type": "boolean"
+ },
+ "numBundles": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "numConsumers": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "numProducers": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "numTopics": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "overLoaded": {
+ "type": "boolean"
+ },
+ "persistentTopicsEnabled": {
+ "type": "boolean"
+ },
+ "preAllocatedBandwidthIn": {
+ "format": "double",
+ "type": "number"
+ },
+ "preAllocatedBandwidthOut": {
+ "format": "double",
+ "type": "number"
+ },
+ "preAllocatedCPU": {
+ "format": "double",
+ "type": "number"
+ },
+ "preAllocatedMemory": {
+ "format": "double",
+ "type": "number"
+ },
+ "preAllocatedMsgRateIn": {
+ "format": "double",
+ "type": "number"
+ },
+ "preAllocatedMsgRateOut": {
+ "format": "double",
+ "type": "number"
+ },
+ "protocols": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "pulsarServiceUrl": {
+ "type": "string"
+ },
+ "pulsarServiceUrlTls": {
+ "type": "string"
+ },
+ "startTimestamp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "systemResourceUsage": {
+ "$ref": "#/components/schemas/SystemResourceUsage"
+ },
+ "timestamp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "underLoaded": {
+ "type": "boolean"
+ },
+ "webServiceUrl": {
+ "type": "string"
+ },
+ "webServiceUrlTls": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "LongRunningProcessStatus": {
+ "properties": {
+ "lastError": {
+ "type": "string"
+ },
+ "status": {
+ "enum": [
+ "NOT_RUN",
+ "RUNNING",
+ "SUCCESS",
+ "ERROR"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "LongSchemaVersion": {
+ "properties": {
+ "version": {
+ "format": "int64",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "ManagedLedgerInfo": {
+ "properties": {
+ "creationDate": {
+ "type": "string"
+ },
+ "cursors": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/CursorInfo"
+ },
+ "type": "object"
+ },
+ "ledgers": {
+ "items": {
+ "$ref": "#/components/schemas/LedgerInfo"
+ },
+ "type": "array"
+ },
+ "modificationDate": {
+ "type": "string"
+ },
+ "properties": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "terminatedPosition": {
+ "$ref": "#/components/schemas/PositionInfo"
+ },
+ "version": {
+ "format": "int64",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "MessageId": {
+ "type": "object"
+ },
+ "MessageIdAdv": {
+ "properties": {
+ "ackSet": {
+ "properties": {
+ "empty": {
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "batchIndex": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "batchSize": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "entryId": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "firstChunkMessageId": {
+ "$ref": "#/components/schemas/MessageIdAdv"
+ },
+ "ledgerId": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "partitionIndex": {
+ "format": "int32",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "MessageIdImpl": {
+ "properties": {
+ "ackSet": {
+ "properties": {
+ "empty": {
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "batchIndex": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "batchSize": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "entryId": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "firstChunkMessageId": {
+ "$ref": "#/components/schemas/MessageIdAdv"
+ },
+ "ledgerId": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "partitionIndex": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "tracingSpan": {
+ "$ref": "#/components/schemas/Span"
+ }
+ },
+ "type": "object"
+ },
+ "MessageRangeInfo": {
+ "properties": {
+ "from": {
+ "$ref": "#/components/schemas/PositionInfo"
+ },
+ "to": {
+ "$ref": "#/components/schemas/PositionInfo"
+ }
+ },
+ "type": "object"
+ },
+ "Metrics": {
+ "properties": {
+ "dimensions": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "metrics": {
+ "additionalProperties": {
+ "type": "object"
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "MigrationState": {
+ "properties": {
+ "phase": {
+ "enum": [
+ "NOT_STARTED",
+ "PREPARATION",
+ "COPYING",
+ "COMPLETED",
+ "FAILED"
+ ],
+ "type": "string"
+ },
+ "targetUrl": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "NamespaceBundleStats": {
+ "properties": {
+ "cacheSize": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "consumerCount": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "msgRateIn": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgRateOut": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgThroughputIn": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgThroughputOut": {
+ "format": "double",
+ "type": "number"
+ },
+ "producerCount": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "topics": {
+ "format": "int64",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "NamespaceIsolationData": {
+ "description": "The data of namespace isolation configuration",
+ "properties": {
+ "auto_failover_policy": {
+ "$ref": "#/components/schemas/AutoFailoverPolicyData"
+ },
+ "namespaces": {
+ "description": "The list of namespaces to apply this namespace isolation data",
+ "items": {
+ "description": "The list of namespaces to apply this namespace isolation data",
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "primary": {
+ "description": "The list of primary brokers for serving the list of namespaces in this isolation policy",
+ "items": {
+ "description": "The list of primary brokers for serving the list of namespaces in this isolation policy",
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "secondary": {
+ "description": "The list of secondary brokers for serving the list of namespaces in this isolation policy",
+ "items": {
+ "description": "The list of secondary brokers for serving the list of namespaces in this isolation policy",
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "unload_scope": {
+ "description": "The type of unload to perform while applying the new isolation policy.",
+ "enum": [
+ "all_matching",
+ "none",
+ "changed"
+ ],
+ "example": "'changed' (default) for unloading only the namespaces whose placement is actually changing. 'all_matching' for unloading all matching namespaces. 'none' for not unloading any namespaces.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "NamespaceOwnershipStatus": {
+ "properties": {
+ "broker_assignment": {
+ "enum": [
+ "primary",
+ "secondary",
+ "shared"
+ ],
+ "type": "string"
+ },
+ "is_active": {
+ "type": "boolean"
+ },
+ "is_controlled": {
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "NonPersistentPartitionedTopicStatsImpl": {
+ "properties": {
+ "abortedTxnCount": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "averageMsgSize": {
+ "format": "double",
+ "type": "number"
+ },
+ "backlogQuotaLimitSize": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "backlogQuotaLimitTime": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "backlogSize": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "bytesInCounter": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "bytesOutCounter": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "bytesOutInternalCounter": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "committedTxnCount": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "compaction": {
+ "$ref": "#/components/schemas/CompactionStatsImpl"
+ },
+ "deduplicationStatus": {
+ "type": "string"
+ },
+ "delayedMessageIndexSizeInBytes": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "earliestMsgPublishTimeInBacklogs": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "lastOffloadFailureTimeStamp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "lastOffloadLedgerId": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "lastOffloadSuccessTimeStamp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "lastPublishTimeStamp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "metadata": {
+ "$ref": "#/components/schemas/PartitionedTopicMetadata"
+ },
+ "msgChunkPublished": {
+ "type": "boolean"
+ },
+ "msgDropRate": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgInCounter": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "msgOutCounter": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "msgRateIn": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgRateOut": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgThroughputIn": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgThroughputOut": {
+ "format": "double",
+ "type": "number"
+ },
+ "nonContiguousDeletedMessagesRanges": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "nonContiguousDeletedMessagesRangesSerializedSize": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "offloadedStorageSize": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "oldestBacklogMessageAgeSeconds": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "oldestBacklogMessageSubscriptionName": {
+ "type": "string"
+ },
+ "ongoingTxnCount": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "ownerBroker": {
+ "type": "string"
+ },
+ "partitions": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/NonPersistentTopicStatsImpl"
+ },
+ "type": "object"
+ },
+ "publishRateLimitedTimes": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "publishers": {
+ "items": {
+ "$ref": "#/components/schemas/NonPersistentPublisherStats"
+ },
+ "type": "array"
+ },
+ "replication": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/NonPersistentReplicatorStats"
+ },
+ "type": "object"
+ },
+ "storageSize": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "subscriptions": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/NonPersistentSubscriptionStats"
+ },
+ "type": "object"
+ },
+ "systemTopicBytesInCounter": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "topicCreationTimeStamp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "topicEpoch": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "waitingPublishers": {
+ "format": "int32",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "NonPersistentPublisherStats": {
+ "properties": {
+ "accessMode": {
+ "enum": [
+ "Shared",
+ "Exclusive",
+ "ExclusiveWithFencing",
+ "WaitForExclusive"
+ ],
+ "type": "string"
+ },
+ "address": {
+ "type": "string"
+ },
+ "averageMsgSize": {
+ "format": "double",
+ "type": "number"
+ },
+ "chunkedMessageRate": {
+ "format": "double",
+ "type": "number"
+ },
+ "clientVersion": {
+ "type": "string"
+ },
+ "connectedSince": {
+ "type": "string"
+ },
+ "metadata": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "msgDropRate": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgRateIn": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgThroughputIn": {
+ "format": "double",
+ "type": "number"
+ },
+ "producerId": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "producerName": {
+ "type": "string"
+ },
+ "supportsPartialProducer": {
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "NonPersistentReplicatorStats": {
+ "properties": {
+ "bytesInCount": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "bytesOutCount": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "connected": {
+ "type": "boolean"
+ },
+ "inboundConnectedSince": {
+ "type": "string"
+ },
+ "inboundConnection": {
+ "type": "string"
+ },
+ "msgDropCount": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "msgDropRate": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgExpiredCount": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "msgInCount": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "msgOutCount": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "msgRateExpired": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgRateIn": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgRateOut": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgThroughputIn": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgThroughputOut": {
+ "format": "double",
+ "type": "number"
+ },
+ "outboundConnectedSince": {
+ "type": "string"
+ },
+ "outboundConnection": {
+ "type": "string"
+ },
+ "replicationBacklog": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "replicationDelayInSeconds": {
+ "format": "int64",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "NonPersistentSubscriptionStats": {
+ "properties": {
+ "activeConsumerName": {
+ "type": "string"
+ },
+ "allowOutOfOrderDelivery": {
+ "type": "boolean"
+ },
+ "backlogSize": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "blockedSubscriptionOnUnackedMsgs": {
+ "type": "boolean"
+ },
+ "bytesOutCounter": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "chunkedMessageRate": {
+ "format": "double",
+ "type": "number"
+ },
+ "consumers": {
+ "items": {
+ "$ref": "#/components/schemas/ConsumerStats"
+ },
+ "type": "array"
+ },
+ "consumersAfterMarkDeletePosition": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "delayedMessageIndexSizeInBytes": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "dispatchThrottledBytesEventsByBrokerLimit": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "dispatchThrottledBytesEventsBySubscriptionLimit": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "dispatchThrottledBytesEventsByTopicLimit": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "dispatchThrottledMsgEventsByBrokerLimit": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "dispatchThrottledMsgEventsBySubscriptionLimit": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "dispatchThrottledMsgEventsByTopicLimit": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "drainingHashesClearedTotal": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "drainingHashesCount": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "drainingHashesUnackedMessages": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "durable": {
+ "type": "boolean"
+ },
+ "earliestMsgPublishTimeInBacklog": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "filterAcceptedMsgCount": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "filterProcessedMsgCount": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "filterRejectedMsgCount": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "filterRescheduledMsgCount": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "keySharedMode": {
+ "type": "string"
+ },
+ "lastAckedTimestamp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "lastConsumedFlowTimestamp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "lastConsumedTimestamp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "lastExpireTimestamp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "lastMarkDeleteAdvancedTimestamp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "messageAckRate": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgBacklog": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "msgBacklogNoDelayed": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "msgDelayed": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "msgDropRate": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgInReplay": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "msgOutCounter": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "msgRateExpired": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgRateOut": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgRateRedeliver": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgThroughputOut": {
+ "format": "double",
+ "type": "number"
+ },
+ "nonContiguousDeletedMessagesRanges": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "nonContiguousDeletedMessagesRangesSerializedSize": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "replicated": {
+ "type": "boolean"
+ },
+ "subscriptionProperties": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "totalMsgExpired": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "type": {
+ "type": "string"
+ },
+ "unackedMessages": {
+ "format": "int64",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "NonPersistentTopicStatsImpl": {
+ "properties": {
+ "abortedTxnCount": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "averageMsgSize": {
+ "format": "double",
+ "type": "number"
+ },
+ "backlogQuotaLimitSize": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "backlogQuotaLimitTime": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "backlogSize": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "bytesInCounter": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "bytesOutCounter": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "bytesOutInternalCounter": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "committedTxnCount": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "compaction": {
+ "$ref": "#/components/schemas/CompactionStatsImpl"
+ },
+ "deduplicationStatus": {
+ "type": "string"
+ },
+ "delayedMessageIndexSizeInBytes": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "earliestMsgPublishTimeInBacklogs": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "lastOffloadFailureTimeStamp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "lastOffloadLedgerId": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "lastOffloadSuccessTimeStamp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "lastPublishTimeStamp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "msgChunkPublished": {
+ "type": "boolean"
+ },
+ "msgDropRate": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgInCounter": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "msgOutCounter": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "msgRateIn": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgRateOut": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgThroughputIn": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgThroughputOut": {
+ "format": "double",
+ "type": "number"
+ },
+ "nonContiguousDeletedMessagesRanges": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "nonContiguousDeletedMessagesRangesSerializedSize": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "offloadedStorageSize": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "oldestBacklogMessageAgeSeconds": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "oldestBacklogMessageSubscriptionName": {
+ "type": "string"
+ },
+ "ongoingTxnCount": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "ownerBroker": {
+ "type": "string"
+ },
+ "publishRateLimitedTimes": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "publishers": {
+ "items": {
+ "$ref": "#/components/schemas/NonPersistentPublisherStats"
+ },
+ "type": "array"
+ },
+ "replication": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/NonPersistentReplicatorStats"
+ },
+ "type": "object"
+ },
+ "storageSize": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "subscriptions": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/NonPersistentSubscriptionStats"
+ },
+ "type": "object"
+ },
+ "systemTopicBytesInCounter": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "topicCreationTimeStamp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "topicEpoch": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "waitingPublishers": {
+ "format": "int32",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "OffloadPolicies": {
+ "properties": {
+ "fileSystemProfilePath": {
+ "type": "string"
+ },
+ "fileSystemURI": {
+ "type": "string"
+ },
+ "gcsManagedLedgerOffloadBucket": {
+ "type": "string"
+ },
+ "gcsManagedLedgerOffloadMaxBlockSizeInBytes": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "gcsManagedLedgerOffloadReadBufferSizeInBytes": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "gcsManagedLedgerOffloadRegion": {
+ "type": "string"
+ },
+ "gcsManagedLedgerOffloadServiceAccountKeyFile": {
+ "type": "string"
+ },
+ "managedLedgerOffloadBucket": {
+ "type": "string"
+ },
+ "managedLedgerOffloadDeletionLagInMillis": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "managedLedgerOffloadDriver": {
+ "type": "string"
+ },
+ "managedLedgerOffloadMaxBlockSizeInBytes": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "managedLedgerOffloadMaxThreads": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "managedLedgerOffloadPrefetchRounds": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "managedLedgerOffloadReadBufferSizeInBytes": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "managedLedgerOffloadRegion": {
+ "type": "string"
+ },
+ "managedLedgerOffloadServiceEndpoint": {
+ "type": "string"
+ },
+ "managedLedgerOffloadThresholdInBytes": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "managedLedgerOffloadThresholdInSeconds": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "managedLedgerOffloadedReadPriority": {
+ "enum": [
+ "bookkeeper-first",
+ "tiered-storage-first"
+ ],
+ "type": "string"
+ },
+ "offloadersDirectory": {
+ "type": "string"
+ },
+ "s3ManagedLedgerOffloadBucket": {
+ "type": "string"
+ },
+ "s3ManagedLedgerOffloadCredentialId": {
+ "type": "string"
+ },
+ "s3ManagedLedgerOffloadCredentialSecret": {
+ "type": "string"
+ },
+ "s3ManagedLedgerOffloadMaxBlockSizeInBytes": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "s3ManagedLedgerOffloadReadBufferSizeInBytes": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "s3ManagedLedgerOffloadRegion": {
+ "type": "string"
+ },
+ "s3ManagedLedgerOffloadRole": {
+ "type": "string"
+ },
+ "s3ManagedLedgerOffloadRoleSessionName": {
+ "type": "string"
+ },
+ "s3ManagedLedgerOffloadServiceEndpoint": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "OffloadPoliciesImpl": {
+ "properties": {
+ "fileSystemDriver": {
+ "type": "boolean"
+ },
+ "fileSystemProfilePath": {
+ "type": "string"
+ },
+ "fileSystemURI": {
+ "type": "string"
+ },
+ "gcsDriver": {
+ "type": "boolean"
+ },
+ "gcsManagedLedgerOffloadBucket": {
+ "type": "string"
+ },
+ "gcsManagedLedgerOffloadMaxBlockSizeInBytes": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "gcsManagedLedgerOffloadReadBufferSizeInBytes": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "gcsManagedLedgerOffloadRegion": {
+ "type": "string"
+ },
+ "gcsManagedLedgerOffloadServiceAccountKeyFile": {
+ "type": "string"
+ },
+ "managedLedgerExtraConfigurations": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "managedLedgerOffloadBucket": {
+ "type": "string"
+ },
+ "managedLedgerOffloadDeletionLagInMillis": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "managedLedgerOffloadDriver": {
+ "type": "string"
+ },
+ "managedLedgerOffloadMaxBlockSizeInBytes": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "managedLedgerOffloadMaxThreads": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "managedLedgerOffloadPrefetchRounds": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "managedLedgerOffloadReadBufferSizeInBytes": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "managedLedgerOffloadReadThreads": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "managedLedgerOffloadRegion": {
+ "type": "string"
+ },
+ "managedLedgerOffloadServiceEndpoint": {
+ "type": "string"
+ },
+ "managedLedgerOffloadThresholdInBytes": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "managedLedgerOffloadThresholdInSeconds": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "managedLedgerOffloadedReadPriority": {
+ "enum": [
+ "bookkeeper-first",
+ "tiered-storage-first"
+ ],
+ "type": "string"
+ },
+ "offloadersDirectory": {
+ "type": "string"
+ },
+ "s3Driver": {
+ "type": "boolean"
+ },
+ "s3ManagedLedgerOffloadBucket": {
+ "type": "string"
+ },
+ "s3ManagedLedgerOffloadCredentialId": {
+ "type": "string"
+ },
+ "s3ManagedLedgerOffloadCredentialSecret": {
+ "type": "string"
+ },
+ "s3ManagedLedgerOffloadMaxBlockSizeInBytes": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "s3ManagedLedgerOffloadReadBufferSizeInBytes": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "s3ManagedLedgerOffloadRegion": {
+ "type": "string"
+ },
+ "s3ManagedLedgerOffloadRole": {
+ "type": "string"
+ },
+ "s3ManagedLedgerOffloadRoleSessionName": {
+ "type": "string"
+ },
+ "s3ManagedLedgerOffloadServiceEndpoint": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "OffloadProcessStatus": {
+ "properties": {
+ "firstUnoffloadedMessage": {
+ "$ref": "#/components/schemas/MessageId"
+ },
+ "lastError": {
+ "type": "string"
+ },
+ "status": {
+ "enum": [
+ "NOT_RUN",
+ "RUNNING",
+ "SUCCESS",
+ "ERROR"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "PartitionedManagedLedgerInfo": {
+ "properties": {
+ "creationDate": {
+ "type": "string"
+ },
+ "cursors": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/CursorInfo"
+ },
+ "type": "object"
+ },
+ "ledgers": {
+ "items": {
+ "$ref": "#/components/schemas/LedgerInfo"
+ },
+ "type": "array"
+ },
+ "modificationDate": {
+ "type": "string"
+ },
+ "partitions": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/ManagedLedgerInfo"
+ },
+ "type": "object"
+ },
+ "properties": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "terminatedPosition": {
+ "$ref": "#/components/schemas/PositionInfo"
+ },
+ "version": {
+ "format": "int64",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "PartitionedTopicInternalStats": {
+ "properties": {
+ "metadata": {
+ "$ref": "#/components/schemas/PartitionedTopicMetadata"
+ },
+ "partitions": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/PersistentTopicInternalStats"
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "PartitionedTopicMetadata": {
+ "properties": {
+ "deleted": {
+ "type": "boolean"
+ },
+ "partitions": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "properties": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "PartitionedTopicStatsImpl": {
+ "properties": {
+ "abortedTxnCount": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "averageMsgSize": {
+ "format": "double",
+ "type": "number"
+ },
+ "backlogQuotaLimitSize": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "backlogQuotaLimitTime": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "backlogSize": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "bytesInCounter": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "bytesOutCounter": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "bytesOutInternalCounter": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "committedTxnCount": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "compaction": {
+ "$ref": "#/components/schemas/CompactionStatsImpl"
+ },
+ "deduplicationStatus": {
+ "type": "string"
+ },
+ "delayedMessageIndexSizeInBytes": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "earliestMsgPublishTimeInBacklogs": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "lastOffloadFailureTimeStamp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "lastOffloadLedgerId": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "lastOffloadSuccessTimeStamp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "lastPublishTimeStamp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "metadata": {
+ "$ref": "#/components/schemas/PartitionedTopicMetadata"
+ },
+ "msgChunkPublished": {
+ "type": "boolean"
+ },
+ "msgInCounter": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "msgOutCounter": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "msgRateIn": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgRateOut": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgThroughputIn": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgThroughputOut": {
+ "format": "double",
+ "type": "number"
+ },
+ "nonContiguousDeletedMessagesRanges": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "nonContiguousDeletedMessagesRangesSerializedSize": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "offloadedStorageSize": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "oldestBacklogMessageAgeSeconds": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "oldestBacklogMessageSubscriptionName": {
+ "type": "string"
+ },
+ "ongoingTxnCount": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "ownerBroker": {
+ "type": "string"
+ },
+ "partitions": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/TopicStats"
+ },
+ "type": "object"
+ },
+ "publishRateLimitedTimes": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "publishers": {
+ "items": {
+ "$ref": "#/components/schemas/PublisherStats"
+ },
+ "type": "array"
+ },
+ "replication": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/ReplicatorStats"
+ },
+ "type": "object"
+ },
+ "storageSize": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "subscriptions": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/SubscriptionStats"
+ },
+ "type": "object"
+ },
+ "systemTopicBytesInCounter": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "topicCreationTimeStamp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "topicEpoch": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "waitingPublishers": {
+ "format": "int32",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "PendingBookieOpsStats": {
+ "properties": {
+ "cursorLedgerCloseOp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "cursorLedgerCreateOp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "cursorLedgerDeleteOp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "cursorLedgerOpenOp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "dataLedgerCloseOp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "dataLedgerCreateOp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "dataLedgerDeleteOp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "dataLedgerOpenOp": {
+ "format": "int64",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "PersistencePolicies": {
+ "properties": {
+ "bookkeeperAckQuorum": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "bookkeeperEnsemble": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "bookkeeperWriteQuorum": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "managedLedgerMaxMarkDeleteRate": {
+ "format": "double",
+ "type": "number"
+ },
+ "managedLedgerStorageClassName": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "PersistentOfflineTopicStats": {
+ "properties": {
+ "brokerName": {
+ "type": "string"
+ },
+ "cursorDetails": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/CursorDetails"
+ },
+ "type": "object"
+ },
+ "dataLedgerDetails": {
+ "items": {
+ "$ref": "#/components/schemas/LedgerDetails"
+ },
+ "type": "array"
+ },
+ "messageBacklog": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "statGeneratedAt": {
+ "format": "date-time",
+ "type": "string"
+ },
+ "storageSize": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "topicName": {
+ "type": "string"
+ },
+ "totalMessages": {
+ "format": "int64",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "PersistentTopicInternalStats": {
+ "properties": {
+ "compactedLedger": {
+ "$ref": "#/components/schemas/LedgerInfo"
+ },
+ "currentLedgerEntries": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "currentLedgerSize": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "cursors": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/CursorStats"
+ },
+ "type": "object"
+ },
+ "entriesAddedCounter": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "lastConfirmedEntry": {
+ "type": "string"
+ },
+ "lastLedgerCreatedTimestamp": {
+ "type": "string"
+ },
+ "lastLedgerCreationFailureTimestamp": {
+ "type": "string"
+ },
+ "ledgers": {
+ "items": {
+ "$ref": "#/components/schemas/LedgerInfo"
+ },
+ "type": "array"
+ },
+ "numberOfEntries": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "pendingAddEntriesCount": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "schemaLedgers": {
+ "items": {
+ "$ref": "#/components/schemas/LedgerInfo"
+ },
+ "type": "array"
+ },
+ "state": {
+ "type": "string"
+ },
+ "totalSize": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "waitingCursorsCount": {
+ "format": "int32",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "PersistentTopicStats": {
+ "properties": {
+ "averageMsgSize": {
+ "format": "double",
+ "type": "number"
+ },
+ "backlogQuotaLimitSize": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "backlogQuotaLimitTime": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "backlogSize": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "bytesInCounter": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "bytesOutCounter": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "compaction": {
+ "$ref": "#/components/schemas/CompactionStats"
+ },
+ "deduplicationStatus": {
+ "type": "string"
+ },
+ "delayedMessageIndexSizeInBytes": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "earliestMsgPublishTimeInBacklogs": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "lastPublishTimeStamp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "msgChunkPublished": {
+ "type": "boolean"
+ },
+ "msgInCounter": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "msgOutCounter": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "msgRateIn": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgRateOut": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgThroughputIn": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgThroughputOut": {
+ "format": "double",
+ "type": "number"
+ },
+ "nonContiguousDeletedMessagesRanges": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "nonContiguousDeletedMessagesRangesSerializedSize": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "offloadedStorageSize": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "oldestBacklogMessageAgeSeconds": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "oldestBacklogMessageSubscriptionName": {
+ "type": "string"
+ },
+ "ownerBroker": {
+ "type": "string"
+ },
+ "publishers": {
+ "items": {
+ "$ref": "#/components/schemas/PublisherStats"
+ },
+ "type": "array"
+ },
+ "replication": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/ReplicatorStats"
+ },
+ "type": "object"
+ },
+ "storageSize": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "subscriptions": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/SubscriptionStats"
+ },
+ "type": "object"
+ },
+ "topicCreationTimeStamp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "topicEpoch": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "waitingPublishers": {
+ "format": "int32",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "Policies": {
+ "properties": {
+ "allowed_clusters": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array",
+ "uniqueItems": true
+ },
+ "allowed_topic_property_keys_for_metrics": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array",
+ "uniqueItems": true
+ },
+ "auth_policies": {
+ "$ref": "#/components/schemas/AuthPolicies"
+ },
+ "autoSubscriptionCreationOverride": {
+ "$ref": "#/components/schemas/AutoSubscriptionCreationOverride"
+ },
+ "autoTopicCreationOverride": {
+ "$ref": "#/components/schemas/AutoTopicCreationOverride"
+ },
+ "backlog_quota_map": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/BacklogQuota"
+ },
+ "type": "object"
+ },
+ "bundles": {
+ "$ref": "#/components/schemas/BundlesData"
+ },
+ "clusterDispatchRate": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/DispatchRateImpl"
+ },
+ "type": "object"
+ },
+ "clusterSubscribeRate": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/SubscribeRate"
+ },
+ "type": "object"
+ },
+ "compaction_threshold": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "deduplicationEnabled": {
+ "type": "boolean"
+ },
+ "deduplicationSnapshotIntervalSeconds": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "delayed_delivery_policies": {
+ "$ref": "#/components/schemas/DelayedDeliveryPolicies"
+ },
+ "deleted": {
+ "type": "boolean"
+ },
+ "dispatcherPauseOnAckStatePersistentEnabled": {
+ "type": "boolean"
+ },
+ "encryption_required": {
+ "type": "boolean"
+ },
+ "entryFilters": {
+ "$ref": "#/components/schemas/EntryFilters"
+ },
+ "inactive_topic_policies": {
+ "$ref": "#/components/schemas/InactiveTopicPolicies"
+ },
+ "is_allow_auto_update_schema": {
+ "type": "boolean"
+ },
+ "is_allow_auto_update_schema_with_replicator": {
+ "type": "boolean"
+ },
+ "latency_stats_sample_rate": {
+ "additionalProperties": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "type": "object"
+ },
+ "max_consumers_per_subscription": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "max_consumers_per_topic": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "max_producers_per_topic": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "max_subscriptions_per_topic": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "max_topics_per_namespace": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "max_unacked_messages_per_consumer": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "max_unacked_messages_per_subscription": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "message_ttl_in_seconds": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "migrated": {
+ "type": "boolean"
+ },
+ "offload_deletion_lag_ms": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "offload_policies": {
+ "$ref": "#/components/schemas/OffloadPolicies"
+ },
+ "offload_threshold": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "offload_threshold_in_seconds": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "persistence": {
+ "$ref": "#/components/schemas/PersistencePolicies"
+ },
+ "properties": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "publishMaxMessageRate": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/PublishRate"
+ },
+ "type": "object"
+ },
+ "replication_clusters": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array",
+ "uniqueItems": true
+ },
+ "replicatorDispatchRate": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/DispatchRateImpl"
+ },
+ "type": "object"
+ },
+ "resource_group_name": {
+ "type": "string"
+ },
+ "retention_policies": {
+ "$ref": "#/components/schemas/RetentionPolicies"
+ },
+ "scalableTopicAutoScalePolicy": {
+ "$ref": "#/components/schemas/AutoScalePolicyOverride"
+ },
+ "schema_auto_update_compatibility_strategy": {
+ "enum": [
+ "AutoUpdateDisabled",
+ "Backward",
+ "Forward",
+ "Full",
+ "AlwaysCompatible",
+ "BackwardTransitive",
+ "ForwardTransitive",
+ "FullTransitive"
+ ],
+ "type": "string"
+ },
+ "schema_compatibility_strategy": {
+ "enum": [
+ "UNDEFINED",
+ "ALWAYS_INCOMPATIBLE",
+ "ALWAYS_COMPATIBLE",
+ "BACKWARD",
+ "FORWARD",
+ "FULL",
+ "BACKWARD_TRANSITIVE",
+ "FORWARD_TRANSITIVE",
+ "FULL_TRANSITIVE"
+ ],
+ "type": "string"
+ },
+ "schema_validation_enforced": {
+ "type": "boolean"
+ },
+ "subscriptionDispatchRate": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/DispatchRateImpl"
+ },
+ "type": "object"
+ },
+ "subscription_auth_mode": {
+ "enum": [
+ "None",
+ "Prefix"
+ ],
+ "type": "string"
+ },
+ "subscription_expiration_time_minutes": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "subscription_types_enabled": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array",
+ "uniqueItems": true
+ },
+ "topicDispatchRate": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/DispatchRateImpl"
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "PoolArenaStats": {
+ "properties": {
+ "chunkLists": {
+ "items": {
+ "$ref": "#/components/schemas/PoolChunkListStats"
+ },
+ "type": "array"
+ },
+ "numActiveAllocations": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "numActiveHugeAllocations": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "numActiveNormalAllocations": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "numActiveSmallAllocations": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "numAllocations": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "numChunkLists": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "numDeallocations": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "numHugeAllocations": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "numHugeDeallocations": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "numNormalAllocations": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "numNormalDeallocations": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "numSmallAllocations": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "numSmallDeallocations": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "numSmallSubpages": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "smallSubpages": {
+ "items": {
+ "$ref": "#/components/schemas/PoolSubpageStats"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ "PoolChunkListStats": {
+ "properties": {
+ "chunks": {
+ "items": {
+ "$ref": "#/components/schemas/PoolChunkStats"
+ },
+ "type": "array"
+ },
+ "maxUsage": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "minUsage": {
+ "format": "int32",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "PoolChunkStats": {
+ "properties": {
+ "chunkSize": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "freeBytes": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "usage": {
+ "format": "int32",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "PoolSubpageStats": {
+ "properties": {
+ "elementSize": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "maxNumElements": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "numAvailable": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "pageSize": {
+ "format": "int32",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "PositionInfo": {
+ "properties": {
+ "entryId": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "ledgerId": {
+ "format": "int64",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "PostSchemaPayload": {
+ "properties": {
+ "properties": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "schema": {
+ "type": "string"
+ },
+ "type": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "PostSchemaResponse": {
+ "properties": {
+ "version": {
+ "$ref": "#/components/schemas/SchemaVersion"
+ }
+ },
+ "type": "object"
+ },
+ "PublishRate": {
+ "properties": {
+ "publishThrottlingRateInByte": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "publishThrottlingRateInMsg": {
+ "format": "int32",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "PublisherStats": {
+ "properties": {
+ "accessMode": {
+ "enum": [
+ "Shared",
+ "Exclusive",
+ "ExclusiveWithFencing",
+ "WaitForExclusive"
+ ],
+ "type": "string"
+ },
+ "address": {
+ "type": "string"
+ },
+ "averageMsgSize": {
+ "format": "double",
+ "type": "number"
+ },
+ "chunkedMessageRate": {
+ "format": "double",
+ "type": "number"
+ },
+ "clientVersion": {
+ "type": "string"
+ },
+ "connectedSince": {
+ "type": "string"
+ },
+ "metadata": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "msgRateIn": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgThroughputIn": {
+ "format": "double",
+ "type": "number"
+ },
+ "producerId": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "producerName": {
+ "type": "string"
+ },
+ "supportsPartialProducer": {
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "RawBookieInfo": {
+ "properties": {
+ "bookieId": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "ReplicatorStats": {
+ "properties": {
+ "bytesInCount": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "bytesOutCount": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "connected": {
+ "type": "boolean"
+ },
+ "inboundConnectedSince": {
+ "type": "string"
+ },
+ "inboundConnection": {
+ "type": "string"
+ },
+ "msgExpiredCount": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "msgInCount": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "msgOutCount": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "msgRateExpired": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgRateIn": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgRateOut": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgThroughputIn": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgThroughputOut": {
+ "format": "double",
+ "type": "number"
+ },
+ "outboundConnectedSince": {
+ "type": "string"
+ },
+ "outboundConnection": {
+ "type": "string"
+ },
+ "replicationBacklog": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "replicationDelayInSeconds": {
+ "format": "int64",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "ResetCursorData": {
+ "properties": {
+ "batchIndex": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "entryId": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "excluded": {
+ "type": "boolean"
+ },
+ "ledgerId": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "partitionIndex": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "properties": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "ResourceDescription": {
+ "properties": {
+ "resourceUsage": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/ResourceUsage"
+ },
+ "type": "object"
+ },
+ "usagePct": {
+ "format": "int32",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "ResourceGroup": {
+ "properties": {
+ "dispatchRateInBytes": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "dispatchRateInMsgs": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "publishRateInBytes": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "publishRateInMsgs": {
+ "format": "int32",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "ResourceQuota": {
+ "properties": {
+ "bandwidthIn": {
+ "format": "double",
+ "type": "number"
+ },
+ "bandwidthOut": {
+ "format": "double",
+ "type": "number"
+ },
+ "dynamic": {
+ "type": "boolean"
+ },
+ "memory": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgRateIn": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgRateOut": {
+ "format": "double",
+ "type": "number"
+ }
+ },
+ "type": "object"
+ },
+ "ResourceUnit": {
+ "properties": {
+ "availableResource": {
+ "$ref": "#/components/schemas/ResourceDescription"
+ },
+ "resourceId": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "ResourceUsage": {
+ "properties": {
+ "limit": {
+ "format": "double",
+ "type": "number"
+ },
+ "usage": {
+ "format": "double",
+ "type": "number"
+ }
+ },
+ "type": "object"
+ },
+ "RetentionPolicies": {
+ "properties": {
+ "retentionSizeInMB": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "retentionTimeInMinutes": {
+ "format": "int32",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "RevokeTopicPermissionOptions": {
+ "properties": {
+ "role": {
+ "type": "string"
+ },
+ "topic": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "ScalableTopicMetadata": {
+ "properties": {
+ "autoScalePolicy": {
+ "$ref": "#/components/schemas/AutoScalePolicyOverride"
+ },
+ "epoch": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "nextSegmentId": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "properties": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ "segments": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/SegmentInfo"
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "ScalableTopicStats": {
+ "properties": {
+ "activeSegments": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "epoch": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "sealedSegments": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "segments": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/SegmentStats"
+ },
+ "type": "object"
+ },
+ "subscriptions": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/SubscriptionStats"
+ },
+ "type": "object"
+ },
+ "totalSegments": {
+ "format": "int32",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "SchemaVersion": {
+ "type": "object"
+ },
+ "SegmentInfo": {
+ "properties": {
+ "active": {
+ "type": "boolean"
+ },
+ "childIds": {
+ "items": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "type": "array"
+ },
+ "createdAtEpoch": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "createdAtMs": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "hashRange": {
+ "$ref": "#/components/schemas/HashRange"
+ },
+ "leaf": {
+ "type": "boolean"
+ },
+ "legacy": {
+ "type": "boolean"
+ },
+ "legacyTopicName": {
+ "type": "string"
+ },
+ "parentIds": {
+ "items": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "type": "array"
+ },
+ "root": {
+ "type": "boolean"
+ },
+ "sealed": {
+ "type": "boolean"
+ },
+ "sealedAtEpoch": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "sealedAtMs": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "segmentId": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "state": {
+ "enum": [
+ "ACTIVE",
+ "SEALED"
+ ],
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "SegmentStats": {
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "state": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "Span": {
+ "properties": {
+ "allAttributes": {
+ "$ref": "#/components/schemas/Span"
+ },
+ "recording": {
+ "type": "boolean"
+ },
+ "spanContext": {
+ "$ref": "#/components/schemas/SpanContext"
+ },
+ "status": {
+ "$ref": "#/components/schemas/Span"
+ }
+ },
+ "type": "object"
+ },
+ "SpanContext": {
+ "properties": {
+ "remote": {
+ "type": "boolean"
+ },
+ "sampled": {
+ "type": "boolean"
+ },
+ "spanId": {
+ "type": "string"
+ },
+ "spanIdBytes": {
+ "format": "byte",
+ "type": "string"
+ },
+ "traceFlags": {
+ "$ref": "#/components/schemas/TraceFlags"
+ },
+ "traceId": {
+ "type": "string"
+ },
+ "traceIdBytes": {
+ "format": "byte",
+ "type": "string"
+ },
+ "traceState": {
+ "$ref": "#/components/schemas/TraceState"
+ },
+ "valid": {
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "SubscribeRate": {
+ "properties": {
+ "ratePeriodInSecond": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "subscribeThrottlingRatePerConsumer": {
+ "format": "int32",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "SubscriptionStats": {
+ "properties": {
+ "consumerCount": {
+ "format": "int32",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "SystemResourceUsage": {
+ "properties": {
+ "bandwidthIn": {
+ "$ref": "#/components/schemas/ResourceUsage"
+ },
+ "bandwidthOut": {
+ "$ref": "#/components/schemas/ResourceUsage"
+ },
+ "cpu": {
+ "$ref": "#/components/schemas/ResourceUsage"
+ },
+ "directMemory": {
+ "$ref": "#/components/schemas/ResourceUsage"
+ },
+ "memory": {
+ "$ref": "#/components/schemas/ResourceUsage"
+ }
+ },
+ "type": "object"
+ },
+ "TenantInfo": {
+ "description": "Information of adminRoles and allowedClusters for tenant",
+ "properties": {
+ "adminRoles": {
+ "description": "Comma separated list of auth principals allowed to administrate the tenant.",
+ "items": {
+ "description": "Comma separated list of auth principals allowed to administrate the tenant.",
+ "type": "string"
+ },
+ "type": "array",
+ "uniqueItems": true
+ },
+ "allowedClusters": {
+ "description": "Comma separated allowed clusters.",
+ "items": {
+ "description": "Comma separated allowed clusters.",
+ "type": "string"
+ },
+ "type": "array",
+ "uniqueItems": true
+ }
+ },
+ "type": "object"
+ },
+ "TopicHashPositions": {
+ "properties": {
+ "bundle": {
+ "type": "string"
+ },
+ "namespace": {
+ "type": "string"
+ },
+ "topicHashPositions": {
+ "additionalProperties": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "TopicStats": {
+ "properties": {
+ "averageMsgSize": {
+ "format": "double",
+ "type": "number"
+ },
+ "backlogQuotaLimitSize": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "backlogQuotaLimitTime": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "backlogSize": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "bytesInCounter": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "bytesOutCounter": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "compaction": {
+ "$ref": "#/components/schemas/CompactionStats"
+ },
+ "deduplicationStatus": {
+ "type": "string"
+ },
+ "delayedMessageIndexSizeInBytes": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "earliestMsgPublishTimeInBacklogs": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "lastPublishTimeStamp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "msgChunkPublished": {
+ "type": "boolean"
+ },
+ "msgInCounter": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "msgOutCounter": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "msgRateIn": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgRateOut": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgThroughputIn": {
+ "format": "double",
+ "type": "number"
+ },
+ "msgThroughputOut": {
+ "format": "double",
+ "type": "number"
+ },
+ "nonContiguousDeletedMessagesRanges": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "nonContiguousDeletedMessagesRangesSerializedSize": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "offloadedStorageSize": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "oldestBacklogMessageAgeSeconds": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "oldestBacklogMessageSubscriptionName": {
+ "type": "string"
+ },
+ "ownerBroker": {
+ "type": "string"
+ },
+ "publishers": {
+ "items": {
+ "$ref": "#/components/schemas/PublisherStats"
+ },
+ "type": "array"
+ },
+ "replication": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/ReplicatorStats"
+ },
+ "type": "object"
+ },
+ "storageSize": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "subscriptions": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/SubscriptionStats"
+ },
+ "type": "object"
+ },
+ "topicCreationTimeStamp": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "topicEpoch": {
+ "format": "int64",
+ "type": "integer"
+ },
+ "waitingPublishers": {
+ "format": "int32",
+ "type": "integer"
+ }
+ },
+ "type": "object"
+ },
+ "TraceFlags": {
+ "properties": {
+ "sampled": {
+ "type": "boolean"
+ },
+ "traceIdRandom": {
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "TraceState": {
+ "properties": {
+ "empty": {
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "WorkerFunctionInstanceStats": {
+ "properties": {
+ "metrics": {
+ "$ref": "#/components/schemas/FunctionInstanceStatsData"
+ },
+ "name": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "WorkerInfo": {
+ "properties": {
+ "port": {
+ "format": "int32",
+ "type": "integer"
+ },
+ "workerHostname": {
+ "type": "string"
+ },
+ "workerId": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "info": {
+ "description": "This provides the REST API for admin operations",
+ "license": {
+ "name": "Apache 2.0",
+ "url": "http://www.apache.org/licenses/LICENSE-2.0.html"
+ },
+ "title": "Pulsar Admin REST API",
+ "version": "v2"
+ },
+ "openapi": "3.0.1",
+ "paths": {
+ "/admin/v2/bookies/all": {
+ "get": {
+ "operationId": "getAllBookies",
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BookiesClusterInfo"
+ }
+ }
+ },
+ "description": "Gets raw information for all the bookies in the cluster"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ }
+ },
+ "summary": "Gets raw information for all the bookies in the cluster",
+ "tags": [
+ "bookies"
+ ]
+ }
+ },
+ "/admin/v2/bookies/racks-info": {
+ "get": {
+ "operationId": "getBookiesRackInfo",
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BookiesRackConfiguration"
+ }
+ }
+ },
+ "description": "Gets the rack placement information for all the bookies in the cluster"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ }
+ },
+ "summary": "Gets the rack placement information for all the bookies in the cluster",
+ "tags": [
+ "bookies"
+ ]
+ }
+ },
+ "/admin/v2/bookies/racks-info/{bookie}": {
+ "delete": {
+ "operationId": "deleteBookieRackInfo",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "bookie",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ }
+ },
+ "summary": "Removed the rack placement information for a specific bookie in the cluster",
+ "tags": [
+ "bookies"
+ ]
+ },
+ "get": {
+ "operationId": "getBookieRackInfo",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "bookie",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BookieInfo"
+ }
+ }
+ },
+ "description": "Gets the rack placement information for a specific bookie in the cluster"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ }
+ },
+ "summary": "Gets the rack placement information for a specific bookie in the cluster",
+ "tags": [
+ "bookies"
+ ]
+ },
+ "post": {
+ "operationId": "updateBookieRackInfo",
+ "parameters": [
+ {
+ "description": "The bookie address",
+ "in": "path",
+ "name": "bookie",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The group",
+ "in": "query",
+ "name": "group",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "*/*": {
+ "schema": {
+ "$ref": "#/components/schemas/BookieInfo"
+ }
+ }
+ },
+ "description": "The bookie info",
+ "required": true
+ },
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ }
+ },
+ "summary": "Updates the rack placement information for a specific bookie in the cluster (note. bookie address format:`address:port`)",
+ "tags": [
+ "bookies"
+ ]
+ }
+ },
+ "/admin/v2/broker-stats/allocator-stats/{allocator}": {
+ "get": {
+ "operationId": "getAllocatorStats",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "allocator",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AllocatorStats"
+ }
+ }
+ },
+ "description": "Get the stats for the Netty allocator. Available allocators are 'default' and 'ml-cache'"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ }
+ },
+ "summary": "Get the stats for the Netty allocator. Available allocators are 'default' and 'ml-cache'",
+ "tags": [
+ "broker-stats"
+ ]
+ }
+ },
+ "/admin/v2/broker-stats/bookieops": {
+ "get": {
+ "description": "Returns a nested map structure: Map<String, Map<String, PendingBookieOpsStats>>.",
+ "operationId": "getPendingBookieOpsStats",
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "additionalProperties": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/PendingBookieOpsStats"
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "description": "Get pending bookie client op stats by namespace"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ }
+ },
+ "summary": "Get pending bookie client op stats by namespace",
+ "tags": [
+ "broker-stats"
+ ]
+ }
+ },
+ "/admin/v2/broker-stats/broker-resource-availability/{tenant}/{namespace}": {
+ "get": {
+ "description": "This API gives the current broker availability in percent, each resource percentage usage is calculated and then sum of all of the resource usage percent is called broker-resource-availability<br/><br/>THIS API IS ONLY FOR USE BY TESTING FOR CONFIRMING NAMESPACE ALLOCATION ALGORITHM",
+ "operationId": "getBrokerResourceAvailability",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/ResourceUnit"
+ },
+ "type": "object"
+ }
+ }
+ },
+ "description": "Returns broker resource availability as Map<Long, List<ResourceUnit>>.Since `ResourceUnit` is an interface, its specific content is not determinable via class reflection. Refer to the source code or interface tests for detailed type definitions."
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "409": {
+ "description": "Load-manager doesn't support operation"
+ }
+ },
+ "summary": "Broker availability report",
+ "tags": [
+ "broker-stats"
+ ]
+ }
+ },
+ "/admin/v2/broker-stats/load-report": {
+ "get": {
+ "description": "consists of topics stats & systemResourceUsage",
+ "operationId": "getLoadReport",
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/LoadReport"
+ }
+ }
+ },
+ "description": "Get Load for this broker"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ }
+ },
+ "summary": "Get Load for this broker",
+ "tags": [
+ "broker-stats"
+ ]
+ }
+ },
+ "/admin/v2/broker-stats/mbeans": {
+ "get": {
+ "operationId": "getMBeans",
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "$ref": "#/components/schemas/Metrics"
+ },
+ "type": "array"
+ }
+ }
+ },
+ "description": "Get all the mbean details of this broker JVM"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ }
+ },
+ "summary": "Get all the mbean details of this broker JVM",
+ "tags": [
+ "broker-stats"
+ ]
+ }
+ },
+ "/admin/v2/broker-stats/metrics": {
+ "get": {
+ "description": "The request should be executed by the Monitoring agent on each broker to fetch the metrics",
+ "operationId": "getMetrics",
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "$ref": "#/components/schemas/Metrics"
+ },
+ "type": "array"
+ }
+ }
+ },
+ "description": "Gets the metrics for Monitoring"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ }
+ },
+ "summary": "Gets the metrics for Monitoring",
+ "tags": [
+ "broker-stats"
+ ]
+ }
+ },
+ "/admin/v2/broker-stats/topics": {
+ "get": {
+ "operationId": "getTopics2",
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "description": "Nested JSON object: namespace -> bundle range -> persistent/non-persistent -> topic -> stats",
+ "type": "object"
+ }
+ }
+ },
+ "description": "Get all the topic stats by namespace"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ }
+ },
+ "summary": "Get all the topic stats by namespace",
+ "tags": [
+ "broker-stats"
+ ]
+ }
+ },
+ "/admin/v2/brokers": {
+ "get": {
+ "operationId": "getActiveBrokers",
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array",
+ "uniqueItems": true
+ }
+ }
+ },
+ "description": "Get the list of active brokers (broker ids) in the local cluster. If authorization is not enabled"
+ },
+ "401": {
+ "description": "Authentication required"
+ },
+ "403": {
+ "description": "This operation requires super-user access"
+ }
+ },
+ "summary": "Get the list of active brokers (broker ids) in the local cluster. If authorization is not enabled",
+ "tags": [
+ "brokers"
+ ]
+ }
+ },
+ "/admin/v2/brokers/backlog-quota-check": {
+ "get": {
+ "operationId": "backlogQuotaCheck",
+ "responses": {
+ "204": {
+ "description": "Everything is OK"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "500": {
+ "description": "Internal server error"
+ }
+ },
+ "summary": "A REST endpoint to trigger backlogQuotaCheck",
+ "tags": [
+ "brokers"
+ ]
+ }
+ },
+ "/admin/v2/brokers/configuration": {
+ "get": {
+ "operationId": "getDynamicConfigurationName",
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ }
+ },
+ "description": "Get all updatable dynamic configurations' names"
+ },
+ "403": {
+ "description": "You don't have admin permission to get configuration"
+ }
+ },
+ "summary": "Get all updatable dynamic configurations' names",
+ "tags": [
+ "brokers"
+ ]
+ }
+ },
+ "/admin/v2/brokers/configuration/runtime": {
+ "get": {
+ "operationId": "getRuntimeConfiguration",
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ }
+ }
+ },
+ "description": "Get all runtime configurations. This operation requires Pulsar super-user privileges."
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ }
+ },
+ "summary": "Get all runtime configurations. This operation requires Pulsar super-user privileges.",
+ "tags": [
+ "brokers"
+ ]
+ }
+ },
+ "/admin/v2/brokers/configuration/values": {
+ "get": {
+ "operationId": "getAllDynamicConfigurations",
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "type": "object"
+ }
+ }
+ },
+ "description": "Get the values of all dynamic configurations overridden on local config"
+ },
+ "403": {
+ "description": "You don't have admin permission to view configuration"
+ },
+ "404": {
+ "description": "Configuration not found"
+ },
+ "500": {
+ "description": "Internal server error"
+ }
+ },
+ "summary": "Get the values of all dynamic configurations overridden on local config",
+ "tags": [
+ "brokers"
+ ]
+ }
+ },
+ "/admin/v2/brokers/configuration/{configName}": {
+ "delete": {
+ "operationId": "deleteDynamicConfiguration",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "configName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "Service configuration deleted successfully"
+ },
+ "403": {
+ "description": "You don't have admin permission to update service-configuration"
+ },
+ "412": {
+ "description": "Invalid dynamic-config value"
+ },
+ "500": {
+ "description": "Internal server error"
+ }
+ },
+ "summary": "Delete dynamic ServiceConfiguration from metadata only. This operation requires Pulsar super-user privileges.",
+ "tags": [
+ "brokers"
+ ]
+ }
+ },
+ "/admin/v2/brokers/configuration/{configName}/{configValue}": {
+ "post": {
+ "operationId": "updateDynamicConfiguration",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "configName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "configValue",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "Service configuration updated successfully"
+ },
+ "403": {
+ "description": "You don't have admin permission to update service-configuration"
+ },
+ "404": {
+ "description": "Configuration not found"
+ },
+ "412": {
+ "description": "Invalid dynamic-config value"
+ },
+ "500": {
+ "description": "Internal server error"
+ }
+ },
+ "summary": "Update dynamic ServiceConfiguration into zk only. This operation requires Pulsar super-user privileges.",
+ "tags": [
+ "brokers"
+ ]
+ }
+ },
+ "/admin/v2/brokers/health": {
+ "get": {
+ "operationId": "healthCheck",
+ "parameters": [
+ {
+ "in": "query",
+ "name": "brokerId",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Everything is OK"
+ },
+ "307": {
+ "description": "Current broker is not the target broker"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Cluster doesn't exist"
+ },
+ "500": {
+ "description": "Internal server error"
+ },
+ "503": {
+ "description": "Service unavailable"
+ }
+ },
+ "summary": "Run a healthCheck against the broker",
+ "tags": [
+ "brokers"
+ ]
+ }
+ },
+ "/admin/v2/brokers/internal-configuration": {
+ "get": {
+ "operationId": "getInternalConfigurationData",
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/InternalConfigurationData"
+ }
+ }
+ },
+ "description": "Get the internal configuration data"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ }
+ },
+ "summary": "Get the internal configuration data",
+ "tags": [
+ "brokers"
+ ]
+ }
+ },
+ "/admin/v2/brokers/leaderBroker": {
+ "get": {
+ "operationId": "getLeaderBroker",
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BrokerInfo"
+ }
+ }
+ },
+ "description": "Get the information of the leader broker."
+ },
+ "401": {
+ "description": "Authentication required"
+ },
+ "403": {
+ "description": "This operation requires super-user access"
+ },
+ "404": {
+ "description": "Leader broker not found"
+ }
+ },
+ "summary": "Get the information of the leader broker.",
+ "tags": [
+ "brokers"
+ ]
+ }
+ },
+ "/admin/v2/brokers/ready": {
+ "get": {
+ "operationId": "isReady",
+ "responses": {
+ "200": {
+ "description": "Broker is ready"
+ },
+ "500": {
+ "description": "Broker is not ready"
+ }
+ },
+ "summary": "Check if the broker is fully initialized",
+ "tags": [
+ "brokers"
+ ]
+ }
+ },
+ "/admin/v2/brokers/shutdown": {
+ "post": {
+ "operationId": "shutDownBrokerGracefully",
+ "parameters": [
+ {
+ "description": "If the value is absent (value=0), it means there is no concurrency limit.",
+ "in": "query",
+ "name": "maxConcurrentUnloadPerSec",
+ "schema": {
+ "format": "int32",
+ "type": "integer"
+ }
+ },
+ {
+ "in": "query",
+ "name": "forcedTerminateTopic",
+ "schema": {
+ "default": true,
+ "type": "boolean"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "Execute shutdown command successfully"
+ },
+ "403": {
+ "description": "You don't have admin permission to update service-configuration"
+ },
+ "500": {
+ "description": "Internal server error"
+ }
+ },
+ "summary": "Shutdown broker gracefully.",
+ "tags": [
+ "brokers"
+ ]
+ }
+ },
+ "/admin/v2/brokers/version": {
+ "get": {
+ "operationId": "version",
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ },
+ "description": "The Pulsar version"
+ },
+ "500": {
+ "description": "Internal server error"
+ }
+ },
+ "summary": "Get version of current broker",
+ "tags": [
+ "brokers"
+ ]
+ }
+ },
+ "/admin/v2/brokers/{clusterName}/{brokerId}/ownedNamespaces": {
+ "get": {
+ "operationId": "getOwnedNamespaces",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "clusterName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "brokerId",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/NamespaceOwnershipStatus"
+ },
+ "type": "object"
+ }
+ }
+ },
+ "description": "Get the list of namespaces served by the specific broker id"
+ },
+ "307": {
+ "description": "Current broker doesn't serve the cluster"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Cluster doesn't exist"
+ }
+ },
+ "summary": "Get the list of namespaces served by the specific broker id",
+ "tags": [
+ "brokers"
+ ]
+ }
+ },
+ "/admin/v2/brokers/{cluster}": {
+ "get": {
+ "operationId": "getActiveBrokers_1",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "cluster",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array",
+ "uniqueItems": true
+ }
+ }
+ },
+ "description": "Get the list of active brokers (broker ids) in the cluster. If authorization is not enabled, any cluster name is valid."
+ },
+ "307": {
+ "description": "Current broker doesn't serve this cluster"
+ },
+ "401": {
+ "description": "Authentication required"
+ },
+ "403": {
+ "description": "This operation requires super-user access"
+ },
+ "404": {
+ "description": "Cluster does not exist: cluster={clustername}"
+ }
+ },
+ "summary": "Get the list of active brokers (broker ids) in the cluster. If authorization is not enabled, any cluster name is valid.",
+ "tags": [
+ "brokers"
+ ]
+ }
+ },
+ "/admin/v2/clusters": {
+ "get": {
+ "operationId": "getClusters",
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array",
+ "uniqueItems": true
+ }
+ }
+ },
+ "description": "Return a list of clusters."
+ },
+ "500": {
+ "description": "Internal server error."
+ }
+ },
+ "summary": "Get the list of all the Pulsar clusters.",
+ "tags": [
+ "clusters"
+ ]
+ }
+ },
+ "/admin/v2/clusters/{cluster}": {
+ "delete": {
+ "description": "This operation requires Pulsar superuser privileges.",
+ "operationId": "deleteCluster",
+ "parameters": [
+ {
+ "description": "The cluster name",
+ "in": "path",
+ "name": "cluster",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "Cluster has been deleted."
+ },
+ "403": {
+ "description": "Don't have admin permission or policies are read-only."
+ },
+ "404": {
+ "description": "Cluster doesn't exist."
+ },
+ "412": {
+ "description": "Cluster is not empty."
+ },
+ "500": {
+ "description": "Internal server error."
+ }
+ },
+ "summary": "Delete an existing cluster.",
+ "tags": [
+ "clusters"
+ ]
+ },
+ "get": {
+ "description": "This operation requires Pulsar superuser privileges.",
+ "operationId": "getCluster",
+ "parameters": [
+ {
+ "description": "The cluster name",
+ "in": "path",
+ "name": "cluster",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ClusterData"
+ }
+ }
+ },
+ "description": "Return the cluster data."
+ },
+ "403": {
+ "description": "Don't have admin permission."
+ },
+ "404": {
+ "description": "Cluster doesn't exist."
+ },
+ "500": {
+ "description": "Internal server error."
+ }
+ },
+ "summary": "Get the configuration for the specified cluster.",
+ "tags": [
+ "clusters"
+ ]
+ },
+ "post": {
+ "description": "This operation requires Pulsar superuser privileges.",
+ "operationId": "updateCluster",
+ "parameters": [
+ {
+ "description": "The cluster name",
+ "in": "path",
+ "name": "cluster",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "example": {
+ "brokerServiceUrl": "pulsar://pulsar.example.com:6651",
+ "serviceUrl": "http://pulsar.example.com:8080"
+ },
+ "schema": {
+ "$ref": "#/components/schemas/ClusterData"
+ }
+ }
+ },
+ "description": "The cluster data",
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Cluster has been updated."
+ },
+ "400": {
+ "description": "Bad request parameter."
+ },
+ "403": {
+ "description": "Don't have admin permission or policies are read-only."
+ },
+ "404": {
+ "description": "Cluster doesn't exist."
+ },
+ "500": {
+ "description": "Internal server error."
+ }
+ },
+ "summary": "Update the configuration for a cluster.",
+ "tags": [
+ "clusters"
+ ]
+ },
+ "put": {
+ "description": "This operation requires Pulsar superuser privileges, and the name cannot contain the '/' characters.",
+ "operationId": "createCluster",
+ "parameters": [
+ {
+ "description": "The cluster name",
+ "in": "path",
+ "name": "cluster",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "example": {
+ "brokerServiceUrl": "pulsar://pulsar.example.com:6651",
+ "serviceUrl": "http://pulsar.example.com:8080"
+ },
+ "schema": {
+ "$ref": "#/components/schemas/ClusterData"
+ }
+ }
+ },
+ "description": "The cluster data",
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Cluster has been created."
+ },
+ "400": {
+ "description": "Bad request parameter."
+ },
+ "403": {
+ "description": "You don't have admin permission to create the cluster."
+ },
+ "409": {
+ "description": "Cluster already exists."
+ },
+ "412": {
+ "description": "Cluster name is not valid."
+ },
+ "500": {
+ "description": "Internal server error."
+ }
+ },
+ "summary": "Create a new cluster.",
+ "tags": [
+ "clusters"
+ ]
+ }
+ },
+ "/admin/v2/clusters/{cluster}/failureDomains": {
+ "get": {
+ "description": "This operation requires Pulsar superuser privileges.",
+ "operationId": "getFailureDomains",
+ "parameters": [
+ {
+ "description": "The cluster name",
+ "in": "path",
+ "name": "cluster",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/FailureDomain"
+ },
+ "type": "object"
+ }
+ }
+ },
+ "description": "Get the cluster failure domains."
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "500": {
+ "description": "Internal server error"
+ }
+ },
+ "summary": "Get the cluster failure domains.",
+ "tags": [
+ "clusters"
+ ]
+ }
+ },
+ "/admin/v2/clusters/{cluster}/failureDomains/{domainName}": {
+ "delete": {
+ "description": "This operation requires Pulsar superuser privileges.",
+ "operationId": "deleteFailureDomain",
+ "parameters": [
+ {
+ "description": "The cluster name",
+ "in": "path",
+ "name": "cluster",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The failure domain name",
+ "in": "path",
+ "name": "domainName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Delete the failure domain of the cluster successfully"
+ },
+ "403": {
+ "description": "Don't have admin permission or policy is read only"
+ },
+ "404": {
+ "description": "FailureDomain doesn't exist"
+ },
+ "412": {
+ "description": "Cluster doesn't exist"
+ },
+ "500": {
+ "description": "Internal server error"
+ }
+ },
+ "summary": "Delete the failure domain of the cluster",
+ "tags": [
+ "clusters"
+ ]
+ },
+ "get": {
+ "description": "This operation requires Pulsar superuser privileges.",
+ "operationId": "getDomain",
+ "parameters": [
+ {
+ "description": "The cluster name",
+ "in": "path",
+ "name": "cluster",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The failure domain name",
+ "in": "path",
+ "name": "domainName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/FailureDomain"
+ }
+ }
+ },
+ "description": "Get a domain in a cluster"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "FailureDomain doesn't exist"
+ },
+ "412": {
+ "description": "Cluster doesn't exist"
+ },
+ "500": {
+ "description": "Internal server error"
+ }
+ },
+ "summary": "Get a domain in a cluster",
+ "tags": [
+ "clusters"
+ ]
+ },
+ "post": {
+ "description": "This operation requires Pulsar superuser privileges.",
+ "operationId": "setFailureDomain",
+ "parameters": [
+ {
+ "description": "The cluster name",
+ "in": "path",
+ "name": "cluster",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The failure domain name",
+ "in": "path",
+ "name": "domainName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "*/*": {
+ "schema": {
+ "$ref": "#/components/schemas/FailureDomain"
+ }
+ }
+ },
+ "description": "The configuration data of a failure domain",
+ "required": true
+ },
+ "responses": {
+ "204": {
+ "description": "Set the failure domain of the cluster successfully."
+ },
+ "403": {
+ "description": "Don't have admin permission."
+ },
+ "404": {
+ "description": "Failure domain doesn't exist."
+ },
+ "409": {
+ "description": "Broker already exists in another domain."
+ },
+ "412": {
+ "description": "Cluster doesn't exist."
+ },
+ "500": {
+ "description": "Internal server error."
+ }
+ },
+ "summary": "Set the failure domain of the cluster.",
+ "tags": [
+ "clusters"
+ ]
+ }
+ },
+ "/admin/v2/clusters/{cluster}/migrate": {
+ "get": {
+ "description": "This operation requires Pulsar superuser privileges.",
+ "operationId": "getClusterMigration",
+ "parameters": [
+ {
+ "description": "The cluster name",
+ "in": "path",
+ "name": "cluster",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/ClusterData"
+ }
+ }
+ },
+ "description": "Return the cluster data."
+ },
+ "403": {
+ "description": "Don't have admin permission."
+ },
+ "404": {
+ "description": "Cluster doesn't exist."
+ },
+ "500": {
+ "description": "Internal server error."
+ }
+ },
+ "summary": "Get the cluster migration configuration for the specified cluster.",
+ "tags": [
+ "clusters"
+ ]
+ },
+ "post": {
+ "description": "This operation requires Pulsar superuser privileges.",
+ "operationId": "updateClusterMigration",
+ "parameters": [
+ {
+ "description": "The cluster name",
+ "in": "path",
+ "name": "cluster",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Is cluster migrated",
+ "in": "query",
+ "name": "migrated",
+ "required": true,
+ "schema": {
+ "type": "boolean"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "example": {
+ "brokerServiceUrl": "pulsar://pulsar.example.com:6651",
+ "serviceUrl": "http://pulsar.example.com:8080"
+ },
+ "schema": {
+ "$ref": "#/components/schemas/ClusterUrl"
+ }
+ }
+ },
+ "description": "The cluster url data",
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Cluster has been updated."
+ },
+ "400": {
+ "description": "Cluster url must not be empty."
+ },
+ "403": {
+ "description": "Don't have admin permission or policies are read-only."
+ },
+ "404": {
+ "description": "Cluster doesn't exist."
+ },
+ "500": {
+ "description": "Internal server error."
+ }
+ },
+ "summary": "Update the configuration for a cluster migration.",
+ "tags": [
+ "clusters"
+ ]
+ }
+ },
+ "/admin/v2/clusters/{cluster}/namespaceIsolationPolicies": {
+ "get": {
+ "description": "This operation requires Pulsar superuser privileges.",
+ "operationId": "getNamespaceIsolationPolicies",
+ "parameters": [
+ {
+ "description": "The cluster name",
+ "in": "path",
+ "name": "cluster",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/NamespaceIsolationData"
+ },
+ "type": "object"
+ }
+ }
+ },
+ "description": "Get the namespace isolation policies assigned to the cluster."
+ },
+ "403": {
+ "description": "Don't have admin permission."
+ },
+ "404": {
+ "description": "Cluster doesn't exist."
+ },
+ "500": {
+ "description": "Internal server error."
+ }
+ },
+ "summary": "Get the namespace isolation policies assigned to the cluster.",
+ "tags": [
+ "clusters"
+ ]
+ }
+ },
+ "/admin/v2/clusters/{cluster}/namespaceIsolationPolicies/brokers": {
+ "get": {
+ "description": "This operation requires Pulsar superuser privileges.",
+ "operationId": "getBrokersWithNamespaceIsolationPolicy",
+ "parameters": [
+ {
+ "description": "The cluster name",
+ "in": "path",
+ "name": "cluster",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "$ref": "#/components/schemas/BrokerNamespaceIsolationData"
+ },
+ "type": "array",
+ "uniqueItems": true
+ }
+ }
+ },
+ "description": "Get list of brokers with namespace-isolation policies attached to them."
+ },
+ "403": {
+ "description": "Don't have admin permission."
+ },
+ "404": {
+ "description": "Namespace-isolation policies not found."
+ },
+ "412": {
+ "description": "Cluster doesn't exist."
+ },
+ "500": {
+ "description": "Internal server error."
+ }
+ },
+ "summary": "Get list of brokers with namespace-isolation policies attached to them.",
+ "tags": [
+ "clusters"
+ ]
+ }
+ },
+ "/admin/v2/clusters/{cluster}/namespaceIsolationPolicies/brokers/{broker}": {
+ "get": {
+ "description": "This operation requires Pulsar superuser privileges.",
+ "operationId": "getBrokerWithNamespaceIsolationPolicy",
+ "parameters": [
+ {
+ "description": "The cluster name",
+ "in": "path",
+ "name": "cluster",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The broker name (<broker-hostname>:<web-service-port>)",
+ "example": "broker1:8080",
+ "in": "path",
+ "name": "broker",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BrokerNamespaceIsolationData"
+ }
+ }
+ },
+ "description": "Get a broker with namespace-isolation policies attached to it."
+ },
+ "403": {
+ "description": "Don't have admin permission."
+ },
+ "404": {
+ "description": "Namespace-isolation policies/ Broker not found."
+ },
+ "412": {
+ "description": "Cluster doesn't exist."
+ },
+ "500": {
+ "description": "Internal server error."
+ }
+ },
+ "summary": "Get a broker with namespace-isolation policies attached to it.",
+ "tags": [
+ "clusters"
+ ]
+ }
+ },
+ "/admin/v2/clusters/{cluster}/namespaceIsolationPolicies/{policyName}": {
+ "delete": {
+ "description": "This operation requires Pulsar superuser privileges.",
+ "operationId": "deleteNamespaceIsolationPolicy",
+ "parameters": [
+ {
+ "description": "The cluster name",
+ "in": "path",
+ "name": "cluster",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The namespace isolation policy name",
+ "in": "path",
+ "name": "policyName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "Delete namespace isolation policy successfully."
+ },
+ "403": {
+ "description": "Don't have admin permission or policies are read only."
+ },
+ "404": {
+ "description": "Namespace isolation policy doesn't exist."
+ },
+ "412": {
+ "description": "Cluster doesn't exist."
+ },
+ "500": {
+ "description": "Internal server error."
+ }
+ },
+ "summary": "Delete namespace isolation policy.",
+ "tags": [
+ "clusters"
+ ]
+ },
+ "get": {
+ "description": "This operation requires Pulsar superuser privileges.",
+ "operationId": "getNamespaceIsolationPolicy",
+ "parameters": [
+ {
+ "description": "The cluster name",
+ "in": "path",
+ "name": "cluster",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The name of the namespace isolation policy",
+ "in": "path",
+ "name": "policyName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/NamespaceIsolationData"
+ }
+ }
+ },
+ "description": "Get the single namespace isolation policy assigned to the cluster."
+ },
+ "403": {
+ "description": "Don't have admin permission."
+ },
+ "404": {
+ "description": "Policy doesn't exist."
+ },
+ "412": {
+ "description": "Cluster doesn't exist."
+ },
+ "500": {
+ "description": "Internal server error."
+ }
+ },
+ "summary": "Get the single namespace isolation policy assigned to the cluster.",
+ "tags": [
+ "clusters"
+ ]
+ },
+ "post": {
+ "description": "This operation requires Pulsar superuser privileges.",
+ "operationId": "setNamespaceIsolationPolicy",
+ "parameters": [
+ {
+ "description": "The cluster name",
+ "in": "path",
+ "name": "cluster",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "The namespace isolation policy name",
+ "in": "path",
+ "name": "policyName",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "*/*": {
+ "schema": {
+ "$ref": "#/components/schemas/NamespaceIsolationData"
+ }
+ }
+ },
+ "description": "The namespace isolation policy data",
+ "required": true
+ },
+ "responses": {
+ "204": {
+ "description": "Set namespace isolation policy successfully."
+ },
+ "400": {
+ "description": "Namespace isolation policy data is invalid."
+ },
+ "403": {
+ "description": "Don't have admin permission or policies are read-only."
+ },
+ "404": {
+ "description": "Namespace isolation policy doesn't exist."
+ },
+ "412": {
+ "description": "Cluster doesn't exist."
+ },
+ "500": {
+ "description": "Internal server error."
+ }
+ },
+ "summary": "Set namespace isolation policy.",
+ "tags": [
+ "clusters"
+ ]
+ }
+ },
+ "/admin/v2/clusters/{cluster}/peers": {
+ "get": {
+ "description": "This operation requires Pulsar superuser privileges.",
+ "operationId": "getPeerCluster",
+ "parameters": [
+ {
+ "description": "The cluster name",
+ "in": "path",
+ "name": "cluster",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array",
+ "uniqueItems": true
+ }
+ }
+ },
+ "description": "Get the peer-cluster data for the specified cluster."
+ },
+ "403": {
+ "description": "Don't have admin permission."
+ },
+ "404": {
+ "description": "Cluster doesn't exist."
+ },
+ "500": {
+ "description": "Internal server error."
+ }
+ },
+ "summary": "Get the peer-cluster data for the specified cluster.",
+ "tags": [
+ "clusters"
+ ]
+ },
+ "post": {
+ "description": "This operation requires Pulsar superuser privileges.",
+ "operationId": "setPeerClusterNames",
+ "parameters": [
+ {
+ "description": "The cluster name",
+ "in": "path",
+ "name": "cluster",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "example": [
+ "cluster-a",
+ "cluster-b"
+ ],
+ "schema": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ }
+ },
+ "description": "The list of peer cluster names",
+ "required": true
+ },
+ "responses": {
+ "204": {
+ "description": "Cluster has been updated."
+ },
+ "403": {
+ "description": "Don't have admin permission or policies are read-only."
+ },
+ "404": {
+ "description": "Cluster doesn't exist."
+ },
+ "412": {
+ "description": "Peer cluster doesn't exist."
+ },
+ "500": {
+ "description": "Internal server error."
+ }
+ },
+ "summary": "Update peer-cluster-list for a cluster.",
+ "tags": [
+ "clusters"
+ ]
+ }
+ },
+ "/admin/v2/metadata/migration/start": {
+ "post": {
+ "operationId": "startMigration",
+ "parameters": [
+ {
+ "description": "Target metadata store URL",
+ "in": "query",
+ "name": "target",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "Migration started successfully"
+ },
+ "400": {
+ "description": "Invalid target URL"
+ },
+ "409": {
+ "description": "Migration already in progress"
+ },
+ "500": {
+ "description": "Internal server error"
+ }
+ },
+ "summary": "Start metadata store migration",
+ "tags": [
+ "metadata-migration"
+ ]
+ }
+ },
+ "/admin/v2/metadata/migration/status": {
+ "get": {
+ "operationId": "getStatus",
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/MigrationState"
+ }
+ }
+ },
+ "description": "Migration status retrieved successfully"
+ },
+ "500": {
+ "description": "Internal server error"
+ }
+ },
+ "summary": "Get current migration status",
+ "tags": [
+ "metadata-migration"
+ ]
+ }
+ },
+ "/admin/v2/namespaces/grantPermissionsOnTopics": {
+ "post": {
+ "operationId": "grantPermissionsOnTopics",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "$ref": "#/components/schemas/GrantTopicPermissionOptions"
+ },
+ "type": "array"
+ }
+ }
+ }
+ },
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "401": {
+ "description": "Don't have permission to administrate resources on this tenant"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "tenant/namespace/topic doesn't exist"
+ },
+ "500": {
+ "description": "Internal server error"
+ }
+ },
+ "summary": "Grant new permissions to a role on multi-topics.",
+ "tags": [
+ "namespaces"
+ ]
+ }
+ },
+ "/admin/v2/namespaces/revokePermissionsOnTopics": {
+ "post": {
+ "operationId": "revokePermissionsOnTopics",
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "$ref": "#/components/schemas/RevokeTopicPermissionOptions"
+ },
+ "type": "array"
+ }
+ }
+ }
+ },
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "401": {
+ "description": "Don't have permission to administrate resources on this tenant"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "tenant/namespace/topic doesn't exist"
+ },
+ "500": {
+ "description": "Internal server error"
+ }
+ },
+ "summary": "Revoke new permissions to a role on multi-topics.",
+ "tags": [
+ "namespaces"
+ ]
+ }
+ },
+ "/admin/v2/namespaces/{cluster}/antiAffinity/{group}": {
+ "get": {
+ "operationId": "getAntiAffinityNamespaces",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "cluster",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "group",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "query",
+ "name": "tenant",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ }
+ },
+ "description": "Get all namespaces that are grouped by the given anti-affinity group in a given cluster. This API can only be accessed by an admin of any of the existing tenants."
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "412": {
+ "description": "Cluster not exist/Anti-affinity group can't be empty."
+ }
+ },
+ "summary": "Get all namespaces that are grouped by the given anti-affinity group in a given cluster. This API can only be accessed by an admin of any of the existing tenants.",
+ "tags": [
+ "namespaces"
+ ]
+ }
+ },
+ "/admin/v2/namespaces/{tenant}": {
+ "get": {
+ "operationId": "getTenantNamespaces",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array",
+ "uniqueItems": true
+ }
+ }
+ },
+ "description": "Get the list of all the namespaces for a certain tenant."
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Tenant doesn't exist"
+ }
+ },
+ "summary": "Get the list of all the namespaces for a certain tenant.",
+ "tags": [
+ "namespaces"
+ ]
+ }
+ },
+ "/admin/v2/namespaces/{tenant}/{namespace}": {
+ "delete": {
+ "operationId": "deleteNamespace",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "query",
+ "name": "force",
+ "schema": {
+ "default": false,
+ "type": "boolean"
+ }
+ },
+ {
+ "in": "query",
+ "name": "authoritative",
+ "schema": {
+ "default": false,
+ "type": "boolean"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "307": {
+ "description": "Current broker doesn't serve the namespace"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Tenant or cluster or namespace doesn't exist"
+ },
+ "405": {
+ "description": "Broker doesn't allow forced deletion of namespaces"
+ },
+ "409": {
+ "description": "Namespace is not empty"
+ }
+ },
+ "summary": "Delete a namespace and all the topics under it.",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "get": {
+ "operationId": "getPolicies",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Policies"
+ }
+ }
+ },
+ "description": "Get the dump all the policies specified for a namespace."
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Tenant or cluster or namespace doesn't exist"
+ }
+ },
+ "summary": "Get the dump all the policies specified for a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "put": {
+ "operationId": "createNamespace",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Policies"
+ }
+ }
+ },
+ "description": "Policies for the namespace"
+ },
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Tenant or cluster doesn't exist"
+ },
+ "409": {
+ "description": "Namespace already exists"
+ },
+ "412": {
+ "description": "Namespace name is not valid"
+ }
+ },
+ "summary": "Creates a new namespace with the specified policies",
+ "tags": [
+ "namespaces"
+ ]
+ }
+ },
+ "/admin/v2/namespaces/{tenant}/{namespace}/allowedClusters": {
+ "get": {
+ "operationId": "getNamespaceAllowedClusters",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ }
+ },
+ "description": "Get the allowed clusters for a namespace."
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Tenant or cluster or namespace doesn't exist"
+ },
+ "412": {
+ "description": "Namespace is not global"
+ }
+ },
+ "summary": "Get the allowed clusters for a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "post": {
+ "operationId": "setNamespaceAllowedClusters",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ }
+ },
+ "description": "List of allowed clusters",
+ "required": true
+ },
+ "responses": {
+ "400": {
+ "description": "The list of allowed clusters should include all replication clusters."
+ },
+ "403": {
+ "description": "The requester does not have admin permissions."
+ },
+ "404": {
+ "description": "The specified tenant, cluster, or namespace does not exist."
+ },
+ "409": {
+ "description": "A peer-cluster cannot be part of an allowed-cluster."
+ },
+ "412": {
+ "description": "The namespace is not global or the provided cluster IDs are invalid."
+ }
+ },
+ "summary": "Set the allowed clusters for a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ }
+ },
+ "/admin/v2/namespaces/{tenant}/{namespace}/allowedTopicPropertyKeysForMetrics": {
+ "delete": {
+ "operationId": "removeAllowedTopicPropertyKeysForMetrics",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Tenant or Namespace does not exist"
+ },
+ "409": {
+ "description": "Concurrent modification"
+ }
+ },
+ "summary": "Remove allowed topic property keys for metrics on a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "get": {
+ "operationId": "getAllowedTopicPropertyKeysForMetrics",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array",
+ "uniqueItems": true
+ }
+ }
+ },
+ "description": "Get allowed topic property keys for metrics for a namespace."
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Namespace doesn't exist"
+ },
+ "409": {
+ "description": "Concurrent modification"
+ }
+ },
+ "summary": "Get allowed topic property keys for metrics for a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "post": {
+ "operationId": "setAllowedTopicPropertyKeysForMetrics",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array",
+ "uniqueItems": true
+ }
+ }
+ },
+ "description": "Set of allowed topic property keys for metrics",
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Namespace doesn't exist"
+ },
+ "409": {
+ "description": "Concurrent modification"
+ }
+ },
+ "summary": "Set allowed topic property keys for metrics for a namespace",
+ "tags": [
+ "namespaces"
+ ]
+ }
+ },
+ "/admin/v2/namespaces/{tenant}/{namespace}/antiAffinity": {
+ "delete": {
+ "operationId": "removeNamespaceAntiAffinityGroup",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Namespace does not exist"
+ },
+ "409": {
+ "description": "Concurrent modification"
+ }
+ },
+ "summary": "Remove anti-affinity group of a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "get": {
+ "operationId": "getNamespaceAntiAffinityGroup",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ },
+ "description": "Get anti-affinity group of a namespace."
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Tenant or cluster or namespace doesn't exist"
+ }
+ },
+ "summary": "Get anti-affinity group of a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "post": {
+ "operationId": "setNamespaceAntiAffinityGroup",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "string"
+ }
+ }
+ },
+ "description": "Anti-affinity group for the specified namespace",
+ "required": true
+ },
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Tenant or cluster or namespace doesn't exist"
+ },
+ "412": {
+ "description": "Invalid antiAffinityGroup"
+ }
+ },
+ "summary": "Set anti-affinity group for a namespace",
+ "tags": [
+ "namespaces"
+ ]
+ }
+ },
+ "/admin/v2/namespaces/{tenant}/{namespace}/autoSubscriptionCreation": {
+ "delete": {
+ "operationId": "removeAutoSubscriptionCreation",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Tenant or cluster or namespace doesn't exist"
+ }
+ },
+ "summary": "Remove override of broker's allowAutoSubscriptionCreation in a namespace",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "get": {
+ "operationId": "getAutoSubscriptionCreation",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AutoSubscriptionCreationOverrideImpl"
+ }
+ }
+ },
+ "description": "Get autoSubscriptionCreation info in a namespace"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Tenant or namespace doesn't exist"
+ }
+ },
+ "summary": "Get autoSubscriptionCreation info in a namespace",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "post": {
+ "operationId": "setAutoSubscriptionCreation",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AutoSubscriptionCreationOverride"
+ }
+ }
+ },
+ "description": "Settings for automatic subscription creation"
+ },
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "400": {
+ "description": "Invalid autoSubscriptionCreation override"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Tenant or cluster or namespace doesn't exist"
+ }
+ },
+ "summary": "Override broker's allowAutoSubscriptionCreation setting for a namespace",
+ "tags": [
+ "namespaces"
+ ]
+ }
+ },
+ "/admin/v2/namespaces/{tenant}/{namespace}/autoTopicCreation": {
+ "delete": {
+ "operationId": "removeAutoTopicCreation",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Tenant or cluster or namespace doesn't exist"
+ }
+ },
+ "summary": "Remove override of broker's allowAutoTopicCreation in a namespace",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "get": {
+ "operationId": "getAutoTopicCreation",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AutoTopicCreationOverrideImpl"
+ }
+ }
+ },
+ "description": "Get autoTopicCreation info in a namespace"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Tenant or namespace doesn't exist"
+ }
+ },
+ "summary": "Get autoTopicCreation info in a namespace",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "post": {
+ "operationId": "setAutoTopicCreation",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/AutoTopicCreationOverride"
+ }
+ }
+ },
+ "description": "Settings for automatic topic creation",
+ "required": true
+ },
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "400": {
+ "description": "Invalid autoTopicCreation override"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Tenant or cluster or namespace doesn't exist"
+ },
+ "406": {
+ "description": "The number of partitions should be less than or equal to maxNumPartitionsPerPartitionedTopic"
+ }
+ },
+ "summary": "Override broker's allowAutoTopicCreation setting for a namespace",
+ "tags": [
+ "namespaces"
+ ]
+ }
+ },
+ "/admin/v2/namespaces/{tenant}/{namespace}/backlogQuota": {
+ "delete": {
+ "operationId": "removeBacklogQuota",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "query",
+ "name": "backlogQuotaType",
+ "schema": {
+ "enum": [
+ "destination_storage",
+ "message_age"
+ ],
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Namespace does not exist"
+ },
+ "409": {
+ "description": "Concurrent modification"
+ }
+ },
+ "summary": "Remove a backlog quota policy from a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "post": {
+ "operationId": "setBacklogQuota",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "query",
+ "name": "backlogQuotaType",
+ "schema": {
+ "enum": [
+ "destination_storage",
+ "message_age"
+ ],
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BacklogQuota"
+ }
+ }
+ },
+ "description": "Backlog quota for all topics of the specified namespace"
+ },
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Namespace does not exist"
+ },
+ "409": {
+ "description": "Concurrent modification"
+ },
+ "412": {
+ "description": "Specified backlog quota exceeds retention quota. Increase retention quota and retry request"
+ }
+ },
+ "summary": "Set a backlog quota for all the topics on a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ }
+ },
+ "/admin/v2/namespaces/{tenant}/{namespace}/backlogQuotaMap": {
+ "get": {
+ "operationId": "getBacklogQuotaMap",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "additionalProperties": {
+ "$ref": "#/components/schemas/BacklogQuotaImpl"
+ },
+ "type": "object"
+ }
+ }
+ },
+ "description": "Get backlog quota map on a namespace."
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Namespace does not exist"
+ }
+ },
+ "summary": "Get backlog quota map on a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ }
+ },
+ "/admin/v2/namespaces/{tenant}/{namespace}/bundles": {
+ "get": {
+ "operationId": "getBundlesData",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/BundlesDataImpl"
+ }
+ }
+ },
+ "description": "Get the bundles split data."
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Tenant or cluster or namespace doesn't exist"
+ },
+ "412": {
+ "description": "Namespace is not setup to split in bundles"
+ }
+ },
+ "summary": "Get the bundles split data.",
+ "tags": [
+ "namespaces"
+ ]
+ }
+ },
+ "/admin/v2/namespaces/{tenant}/{namespace}/clearBacklog": {
+ "post": {
+ "operationId": "clearNamespaceBacklog",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "query",
+ "name": "authoritative",
+ "schema": {
+ "default": false,
+ "type": "boolean"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin or operate permission on the namespace"
+ },
+ "404": {
+ "description": "Namespace does not exist"
+ }
+ },
+ "summary": "Clear backlog for all topics on a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ }
+ },
+ "/admin/v2/namespaces/{tenant}/{namespace}/clearBacklog/{subscription}": {
+ "post": {
+ "operationId": "clearNamespaceBacklogForSubscription",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "subscription",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "query",
+ "name": "authoritative",
+ "schema": {
+ "default": false,
+ "type": "boolean"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin or operate permission on the namespace"
+ },
+ "404": {
+ "description": "Namespace does not exist"
+ }
+ },
+ "summary": "Clear backlog for a given subscription on all topics on a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ }
+ },
+ "/admin/v2/namespaces/{tenant}/{namespace}/compactionThreshold": {
+ "delete": {
+ "description": "The backlog size is compared to the threshold periodically. A threshold of 0 disables automatic compaction",
+ "operationId": "deleteCompactionThreshold",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Namespace doesn't exist"
+ },
+ "409": {
+ "description": "Concurrent modification"
+ }
+ },
+ "summary": "Delete maximum number of uncompacted bytes in a topic before compaction is triggered.",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "get": {
+ "description": "The backlog size is compared to the threshold periodically. A threshold of 0 disables automatic compaction",
+ "operationId": "getCompactionThreshold",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "format": "int64",
+ "type": "integer"
+ }
+ }
+ },
+ "description": "Maximum number of uncompacted bytes in topics before compaction is triggered."
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Namespace doesn't exist"
+ }
+ },
+ "summary": "Maximum number of uncompacted bytes in topics before compaction is triggered.",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "put": {
+ "description": "The backlog size is compared to the threshold periodically. A threshold of 0 disables automatic compaction",
+ "operationId": "setCompactionThreshold",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "format": "int64",
+ "type": "integer"
+ }
+ }
+ },
+ "description": "Maximum number of uncompacted bytes in a topic of the specified namespace",
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Namespace doesn't exist"
+ },
+ "409": {
+ "description": "Concurrent modification"
+ },
+ "412": {
+ "description": "compactionThreshold value is not valid"
+ }
+ },
+ "summary": "Set maximum number of uncompacted bytes in a topic before compaction is triggered.",
+ "tags": [
+ "namespaces"
+ ]
+ }
+ },
+ "/admin/v2/namespaces/{tenant}/{namespace}/deduplication": {
+ "delete": {
+ "operationId": "removeDeduplication",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Tenant or cluster or namespace doesn't exist"
+ }
+ },
+ "summary": "Remove broker side deduplication for all topics in a namespace",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "get": {
+ "operationId": "getDeduplication",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "boolean"
+ }
+ }
+ },
+ "description": "Get broker side deduplication for all topics in a namespace"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Tenant or cluster or namespace doesn't exist"
+ }
+ },
+ "summary": "Get broker side deduplication for all topics in a namespace",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "post": {
+ "operationId": "modifyDeduplication",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "boolean"
+ }
+ }
+ },
+ "description": "Flag for disabling or enabling broker side deduplication for all topics in the specified namespace",
+ "required": true
+ },
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Tenant or cluster or namespace doesn't exist"
+ }
+ },
+ "summary": "Enable or disable broker side deduplication for all topics in a namespace",
+ "tags": [
+ "namespaces"
+ ]
+ }
+ },
+ "/admin/v2/namespaces/{tenant}/{namespace}/deduplicationSnapshotInterval": {
+ "get": {
+ "operationId": "getDeduplicationSnapshotInterval",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "format": "int32",
+ "type": "integer"
+ }
+ }
+ },
+ "description": "Get deduplicationSnapshotInterval config on a namespace."
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Namespace does not exist"
+ }
+ },
+ "summary": "Get deduplicationSnapshotInterval config on a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "post": {
+ "operationId": "setDeduplicationSnapshotInterval",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "format": "int32",
+ "type": "integer"
+ }
+ }
+ },
+ "description": "Interval to take deduplication snapshot per topic",
+ "required": true
+ },
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Namespace does not exist"
+ }
+ },
+ "summary": "Set deduplicationSnapshotInterval config on a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ }
+ },
+ "/admin/v2/namespaces/{tenant}/{namespace}/delayedDelivery": {
+ "delete": {
+ "operationId": "removeDelayedDeliveryPolicies",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Tenant or cluster or namespace doesn't exist"
+ }
+ },
+ "summary": "Delete delayed delivery messages config on a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "get": {
+ "operationId": "getDelayedDeliveryPolicies",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DelayedDeliveryPolicies"
+ }
+ }
+ },
+ "description": "Get delayed delivery messages config on a namespace."
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Tenant or cluster or namespace doesn't exist"
+ },
+ "409": {
+ "description": "Concurrent modification"
+ }
+ },
+ "summary": "Get delayed delivery messages config on a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "post": {
+ "operationId": "setDelayedDeliveryPolicies",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DelayedDeliveryPolicies"
+ }
+ }
+ },
+ "description": "Delayed delivery policies for the specified namespace"
+ },
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Tenant or cluster or namespace doesn't exist"
+ }
+ },
+ "summary": "Set delayed delivery messages config on a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ }
+ },
+ "/admin/v2/namespaces/{tenant}/{namespace}/dispatchRate": {
+ "delete": {
+ "operationId": "deleteDispatchRate",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ }
+ },
+ "summary": "Delete dispatch-rate throttling for all topics of the namespace",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "get": {
+ "operationId": "getDispatchRate",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DispatchRate"
+ }
+ }
+ },
+ "description": "Get dispatch-rate configured for the namespace, null means dispatch-rate not configured, -1 means msg-dispatch-rate or byte-dispatch-rate not configured in dispatch-rate yet"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Namespace does not exist"
+ }
+ },
+ "summary": "Get dispatch-rate configured for the namespace, null means dispatch-rate not configured, -1 means msg-dispatch-rate or byte-dispatch-rate not configured in dispatch-rate yet",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "post": {
+ "operationId": "setDispatchRate",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/DispatchRateImpl"
+ }
+ }
+ },
+ "description": "Dispatch rate for all topics of the specified namespace"
+ },
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ }
+ },
+ "summary": "Set dispatch-rate throttling for all topics of the namespace",
+ "tags": [
+ "namespaces"
+ ]
+ }
+ },
+ "/admin/v2/namespaces/{tenant}/{namespace}/dispatcherPauseOnAckStatePersistent": {
+ "delete": {
+ "operationId": "removeDispatcherPauseOnAckStatePersistent",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Tenant or cluster or namespace doesn't exist"
+ },
+ "409": {
+ "description": "Concurrent modification"
+ }
+ },
+ "summary": "Remove dispatcher pause on ack state persistent configuration for specified namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "get": {
+ "operationId": "getDispatcherPauseOnAckStatePersistent",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "boolean"
+ }
+ }
+ },
+ "description": "Get dispatcher pause on ack state persistent config on a namespace."
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Tenant or cluster or namespace doesn't exist"
+ }
+ },
+ "summary": "Get dispatcher pause on ack state persistent config on a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "post": {
+ "operationId": "setDispatcherPauseOnAckStatePersistent",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Tenant or cluster or namespace doesn't exist"
+ },
+ "409": {
+ "description": "Concurrent modification"
+ }
+ },
+ "summary": "Set dispatcher pause on ack state persistent configuration for specified namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ }
+ },
+ "/admin/v2/namespaces/{tenant}/{namespace}/encryptionRequired": {
+ "get": {
+ "operationId": "getEncryptionRequired",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "boolean"
+ }
+ }
+ },
+ "description": "Get message encryption required status in a namespace"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Tenant or namespace doesn't exist"
+ }
+ },
+ "summary": "Get message encryption required status in a namespace",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "post": {
+ "operationId": "modifyEncryptionRequired",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "boolean"
+ }
+ }
+ },
+ "description": "Flag defining if message encryption is required",
+ "required": true
+ },
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Tenant or cluster or namespace doesn't exist"
+ },
+ "409": {
+ "description": "Concurrent modification"
+ }
+ },
+ "summary": "Message encryption is required or not for all topics in a namespace",
+ "tags": [
+ "namespaces"
+ ]
+ }
+ },
+ "/admin/v2/namespaces/{tenant}/{namespace}/entryFilters": {
+ "delete": {
+ "operationId": "removeNamespaceEntryFilters",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Tenant or cluster or namespace doesn't exist"
+ },
+ "412": {
+ "description": "Invalid TTL"
+ }
+ },
+ "summary": "Remove entry filters for namespace",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "get": {
+ "operationId": "getEntryFiltersPerTopic",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/EntryFilters"
+ }
+ }
+ },
+ "description": "Get maxConsumersPerSubscription config on a namespace."
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Namespace does not exist"
+ }
+ },
+ "summary": "Get maxConsumersPerSubscription config on a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "post": {
+ "operationId": "setEntryFiltersPerTopic",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/EntryFilters"
+ }
+ }
+ },
+ "description": "entry filters",
+ "required": true
+ },
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "400": {
+ "description": "Specified entry filters are not valid"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Tenant or cluster or namespace doesn't exist"
+ }
+ },
+ "summary": "Set entry filters for namespace",
+ "tags": [
+ "namespaces"
+ ]
+ }
+ },
+ "/admin/v2/namespaces/{tenant}/{namespace}/inactiveTopicPolicies": {
+ "delete": {
+ "operationId": "removeInactiveTopicPolicies",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Namespace does not exist"
+ },
+ "409": {
+ "description": "Concurrent modification"
+ }
+ },
+ "summary": "Remove inactive topic policies from a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "get": {
+ "operationId": "getInactiveTopicPolicies",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/InactiveTopicPolicies"
+ }
+ }
+ },
+ "description": "Get inactive topic policies config on a namespace."
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Tenant or cluster or namespace doesn't exist"
+ },
+ "409": {
+ "description": "Concurrent modification"
+ }
+ },
+ "summary": "Get inactive topic policies config on a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "post": {
+ "operationId": "setInactiveTopicPolicies",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/InactiveTopicPolicies"
+ }
+ }
+ },
+ "description": "Inactive topic policies for the specified namespace"
+ },
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Tenant or cluster or namespace doesn't exist"
+ }
+ },
+ "summary": "Set inactive topic policies config on a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ }
+ },
+ "/admin/v2/namespaces/{tenant}/{namespace}/isAllowAutoUpdateSchema": {
+ "get": {
+ "operationId": "getIsAllowAutoUpdateSchema",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "boolean"
+ }
+ }
+ },
+ "description": "The flag of whether to allow auto update schema"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Namespace doesn't exist"
+ },
+ "409": {
+ "description": "Concurrent modification"
+ }
+ },
+ "summary": "The flag of whether to allow auto update schema",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "post": {
+ "operationId": "setIsAllowAutoUpdateSchema",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "description": "Allow replicator to auto update schema",
+ "in": "query",
+ "name": "allowAutoUpdateSchemaWithReplicator",
+ "schema": {
+ "type": "boolean"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "boolean"
+ }
+ }
+ },
+ "description": "Flag of whether to allow auto update schema",
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Namespace doesn't exist"
+ },
+ "409": {
+ "description": "Concurrent modification"
+ }
+ },
+ "summary": "Update flag of whether to allow auto update schema",
+ "tags": [
+ "namespaces"
+ ]
+ }
+ },
+ "/admin/v2/namespaces/{tenant}/{namespace}/maxConsumersPerSubscription": {
+ "delete": {
+ "operationId": "removeMaxConsumersPerSubscription",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Namespace does not exist"
+ },
+ "409": {
+ "description": "Concurrent modification"
+ },
+ "412": {
+ "description": "maxConsumersPerSubscription value is not valid"
+ }
+ },
+ "summary": "Set maxConsumersPerSubscription configuration on a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "get": {
+ "operationId": "getMaxConsumersPerSubscription",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "format": "int32",
+ "type": "integer"
+ }
+ }
+ },
+ "description": "Get maxConsumersPerSubscription config on a namespace."
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Namespace does not exist"
+ }
+ },
+ "summary": "Get maxConsumersPerSubscription config on a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "post": {
+ "operationId": "setMaxConsumersPerSubscription",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "format": "int32",
+ "type": "integer"
+ }
+ }
+ },
+ "description": "Number of maximum consumers per subscription",
+ "required": true
+ },
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Namespace does not exist"
+ },
+ "409": {
+ "description": "Concurrent modification"
+ },
+ "412": {
+ "description": "maxConsumersPerSubscription value is not valid"
+ }
+ },
+ "summary": "Set maxConsumersPerSubscription configuration on a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ }
+ },
+ "/admin/v2/namespaces/{tenant}/{namespace}/maxConsumersPerTopic": {
+ "delete": {
+ "operationId": "removeMaxConsumersPerTopic",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Namespace does not exist"
+ },
+ "409": {
+ "description": "Concurrent modification"
+ }
+ },
+ "summary": "Remove maxConsumersPerTopic configuration on a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "get": {
+ "operationId": "getMaxConsumersPerTopic",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "format": "int32",
+ "type": "integer"
+ }
+ }
+ },
+ "description": "Get maxConsumersPerTopic config on a namespace."
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Namespace does not exist"
+ }
+ },
+ "summary": "Get maxConsumersPerTopic config on a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "post": {
+ "operationId": "setMaxConsumersPerTopic",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "format": "int32",
+ "type": "integer"
+ }
+ }
+ },
+ "description": "Number of maximum consumers per topic",
+ "required": true
+ },
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Namespace does not exist"
+ },
+ "409": {
+ "description": "Concurrent modification"
+ },
+ "412": {
+ "description": "maxConsumersPerTopic value is not valid"
+ }
+ },
+ "summary": "Set maxConsumersPerTopic configuration on a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ }
+ },
+ "/admin/v2/namespaces/{tenant}/{namespace}/maxProducersPerTopic": {
+ "delete": {
+ "operationId": "removeMaxProducersPerTopic",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Namespace does not exist"
+ },
+ "409": {
+ "description": "Concurrent modification"
+ }
+ },
+ "summary": "Remove maxProducersPerTopic configuration on a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "get": {
+ "operationId": "getMaxProducersPerTopic",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "format": "int32",
+ "type": "integer"
+ }
+ }
+ },
+ "description": "Get maxProducersPerTopic config on a namespace."
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Namespace does not exist"
+ }
+ },
+ "summary": "Get maxProducersPerTopic config on a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "post": {
+ "operationId": "setMaxProducersPerTopic",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "format": "int32",
+ "type": "integer"
+ }
+ }
+ },
+ "description": "Number of maximum producers per topic",
+ "required": true
+ },
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Namespace does not exist"
+ },
+ "409": {
+ "description": "Concurrent modification"
+ },
+ "412": {
+ "description": "maxProducersPerTopic value is not valid"
+ }
+ },
+ "summary": "Set maxProducersPerTopic configuration on a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ }
+ },
+ "/admin/v2/namespaces/{tenant}/{namespace}/maxSubscriptionsPerTopic": {
+ "delete": {
+ "operationId": "removeMaxSubscriptionsPerTopic",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Namespace does not exist"
+ },
+ "409": {
+ "description": "Concurrent modification"
+ }
+ },
+ "summary": "Remove maxSubscriptionsPerTopic configuration on a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "get": {
+ "operationId": "getMaxSubscriptionsPerTopic",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "format": "int32",
+ "type": "integer"
+ }
+ }
+ },
+ "description": "Get maxSubscriptionsPerTopic config on a namespace."
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Namespace does not exist"
+ }
+ },
+ "summary": "Get maxSubscriptionsPerTopic config on a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "post": {
+ "operationId": "setMaxSubscriptionsPerTopic",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "format": "int32",
+ "type": "integer"
+ }
+ }
+ },
+ "description": "Number of maximum subscriptions per topic",
+ "required": true
+ },
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Namespace does not exist"
+ },
+ "409": {
+ "description": "Concurrent modification"
+ },
+ "412": {
+ "description": "maxUnackedMessagesPerSubscription value is not valid"
+ }
+ },
+ "summary": "Set maxSubscriptionsPerTopic configuration on a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ }
+ },
+ "/admin/v2/namespaces/{tenant}/{namespace}/maxTopicsPerNamespace": {
+ "delete": {
+ "operationId": "removeMaxTopicsPerNamespace",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Tenant or namespace doesn't exist"
+ }
+ },
+ "summary": "Remove maxTopicsPerNamespace config on a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "get": {
+ "operationId": "getMaxTopicsPerNamespace",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "format": "int32",
+ "type": "integer"
+ }
+ }
+ },
+ "description": "Get maxTopicsPerNamespace config on a namespace."
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Tenant or namespace does not exist"
+ }
+ },
+ "summary": "Get maxTopicsPerNamespace config on a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "post": {
+ "operationId": "setMaxTopicsPerNamespace",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "format": "int32",
+ "type": "integer"
+ }
+ }
+ },
+ "description": "Number of maximum topics for specific namespace",
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Tenant or namespace doesn't exist"
+ }
+ },
+ "summary": "Set maxTopicsPerNamespace config on a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ }
+ },
+ "/admin/v2/namespaces/{tenant}/{namespace}/maxUnackedMessagesPerConsumer": {
+ "delete": {
+ "operationId": "removeMaxUnackedmessagesPerConsumer",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Namespace does not exist"
+ }
+ },
+ "summary": "Remove maxUnackedMessagesPerConsumer config on a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "get": {
+ "operationId": "getMaxUnackedMessagesPerConsumer",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "format": "int32",
+ "type": "integer"
+ }
+ }
+ },
+ "description": "Get maxUnackedMessagesPerConsumer config on a namespace."
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Namespace does not exist"
+ }
+ },
+ "summary": "Get maxUnackedMessagesPerConsumer config on a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "post": {
+ "operationId": "setMaxUnackedMessagesPerConsumer",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "format": "int32",
+ "type": "integer"
+ }
+ }
+ },
+ "description": "Number of maximum unacked messages per consumer",
+ "required": true
+ },
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Namespace does not exist"
+ },
+ "409": {
+ "description": "Concurrent modification"
+ },
+ "412": {
+ "description": "maxUnackedMessagesPerConsumer value is not valid"
+ }
+ },
+ "summary": "Set maxConsumersPerTopic configuration on a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ }
+ },
+ "/admin/v2/namespaces/{tenant}/{namespace}/maxUnackedMessagesPerSubscription": {
+ "delete": {
+ "operationId": "removeMaxUnackedmessagesPerSubscription",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Namespace does not exist"
+ }
+ },
+ "summary": "Remove maxUnackedMessagesPerSubscription config on a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "get": {
+ "operationId": "getMaxUnackedmessagesPerSubscription",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "format": "int32",
+ "type": "integer"
+ }
+ }
+ },
+ "description": "Get maxUnackedMessagesPerSubscription config on a namespace."
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Namespace does not exist"
+ }
+ },
+ "summary": "Get maxUnackedMessagesPerSubscription config on a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "post": {
+ "operationId": "setMaxUnackedMessagesPerSubscription",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "format": "int32",
+ "type": "integer"
+ }
+ }
+ },
+ "description": "Number of maximum unacked messages per subscription",
+ "required": true
+ },
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Namespace does not exist"
+ },
+ "409": {
+ "description": "Concurrent modification"
+ },
+ "412": {
+ "description": "maxUnackedMessagesPerSubscription value is not valid"
+ }
+ },
+ "summary": "Set maxUnackedMessagesPerSubscription configuration on a namespace.",
+ "tags": [
+ "namespaces"
+ ]
+ }
+ },
+ "/admin/v2/namespaces/{tenant}/{namespace}/messageTTL": {
+ "delete": {
+ "operationId": "removeNamespaceMessageTTL",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Tenant or cluster or namespace doesn't exist"
+ },
+ "412": {
+ "description": "Invalid TTL"
+ }
+ },
+ "summary": "Remove message TTL in seconds for namespace",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "get": {
+ "operationId": "getNamespaceMessageTTL",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "format": "int32",
+ "type": "integer"
+ }
+ }
+ },
+ "description": "Get the message TTL for the namespace"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Tenant or cluster or namespace doesn't exist"
+ }
+ },
+ "summary": "Get the message TTL for the namespace",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "post": {
+ "operationId": "setNamespaceMessageTTL",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "format": "int32",
+ "type": "integer"
+ }
+ }
+ },
+ "description": "TTL in seconds for the specified namespace",
+ "required": true
+ },
+ "responses": {
+ "204": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Tenant or cluster or namespace doesn't exist"
+ },
+ "412": {
+ "description": "Invalid TTL"
+ }
+ },
+ "summary": "Set message TTL in seconds for namespace",
+ "tags": [
+ "namespaces"
+ ]
+ }
+ },
+ "/admin/v2/namespaces/{tenant}/{namespace}/offloadDeletionLagMs": {
+ "delete": {
+ "operationId": "clearOffloadDeletionLag",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Operation successful"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Namespace doesn't exist"
+ },
+ "409": {
+ "description": "Concurrent modification"
+ }
+ },
+ "summary": "Clear the namespace configured offload deletion lag. The topics in the namespace will fallback to using the default configured deletion lag for the broker",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "get": {
+ "description": "A negative value denotes that deletion has been completely disabled. 'null' denotes that the topics in the namespace will fall back to the broker default for deletion lag.",
+ "operationId": "getOffloadDeletionLag",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "format": "int64",
+ "type": "integer"
+ }
+ }
+ },
+ "description": "Number of milliseconds to wait before deleting a ledger segment which has been offloaded from the Pulsar cluster's local storage (i.e. BookKeeper)"
+ },
+ "403": {
+ "description": "Don't have admin permission"
+ },
+ "404": {
+ "description": "Namespace doesn't exist"
+ }
+ },
+ "summary": "Number of milliseconds to wait before deleting a ledger segment which has been offloaded from the Pulsar cluster's local storage (i.e. BookKeeper)",
+ "tags": [
+ "namespaces"
+ ]
+ },
+ "put": {
+ "description": "A negative value disables the deletion completely.",
+ "operationId": "setOffloadDeletionLag",
+ "parameters": [
+ {
+ "in": "path",
+ "name": "tenant",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "in": "path",
+ "name": "namespace",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "format": "int64",
+ "type": "integer"
+ }
+ }
+ },
+ "description": "New number of milliseconds to wait before deleting a ledger segment which has been offloaded",
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "Operation successful"
+ },
... 84549 lines suppressed ...
(pulsar-site) 03/16: Publish V5 client Javadoc and link types from the V5 doc
Posted by lh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
lhotari pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/pulsar-site.git
commit 56268c15e100df8c17bb995d21cd6e6773fb7a7a
Author: Lari Hotari <lh...@users.noreply.github.com>
AuthorDate: Tue Jun 23 18:46:07 2026 +0300
Publish V5 client Javadoc and link types from the V5 doc
The V5 scalable-topics client (org.apache.pulsar.client.api.v5, new in
Pulsar 5.0.0) had no published Javadoc and the java-v5 guide named its types
in plain text.
- javadoc_generator: build :pulsar-client-api-v5:javadoc on the Gradle path
and publish it to static/api/client-v5/<version> (no Maven counterpart).
- pulsarVariables: add the @pulsar:javadoc:client-v5@ token. The V5 API only
exists in 5.x+, so it resolves against the doc's own version when that is
5.x+, else the newest 5.x+ release, falling back to 5.0.x.
- client-libraries/java-v5.md: link each referenced type (PulsarClient,
Producer, the three consumers, Schema, Transaction, …) to its Javadoc,
rewording the prose so the links read naturally.
---
client-libraries/java-v5.md | 24 ++++++++++++------------
src/config/pulsarVariables.ts | 17 +++++++++++++++++
tools/pytools/lib/execute/javadoc_generator.py | 6 +++++-
3 files changed, 34 insertions(+), 13 deletions(-)
diff --git a/client-libraries/java-v5.md b/client-libraries/java-v5.md
index 0e103d675a6..7df5684bca6 100644
--- a/client-libraries/java-v5.md
+++ b/client-libraries/java-v5.md
@@ -7,7 +7,7 @@ description: Set up and use the Pulsar V5 Java client for scalable topics — pr
The **V5 Java client** is a client SDK built for [scalable topics](pathname:///docs/concepts-scalable-topics). It offers three purpose-built consumer types and a modern, sync-first API, and it also works against existing partitioned and non-partitioned topics -- so you can adopt it before migrating any topic.
-For how it compares to the current Java client, see [Java client SDKs](java.md#java-client-sdks). For the messaging model and a deeper API walkthrough, see [Messaging](pathname:///docs/concepts-messaging).
+For how it compares to the current Java client, see [Java client SDKs](java.md#java-client-sdks). For the messaging model and a deeper API walkthrough, see [Messaging](pathname:///docs/concepts-messaging). Every type named below links to its [API reference](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/package-summary.html).
:::note
@@ -17,7 +17,7 @@ The V5 client requires **Java 17**. Scalable-topic support in the other language
## Install
-The V5 client is published to Maven Central as `pulsar-client-v5` (available from **@pulsar:version:latest@**). The API lives under the `org.apache.pulsar.client.api.v5` package.
+The V5 client is published to Maven Central as `pulsar-client-v5` (available from **@pulsar:version:latest@**). Its API lives under the [`org.apache.pulsar.client.api.v5`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/package-summary.html) package.
### Maven
@@ -39,7 +39,7 @@ dependencies {
## Create a client
-Build one `PulsarClient` and share it across producers and consumers; close it on shutdown.
+A [`PulsarClient`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/PulsarClient.html) is the entry point to the API: build one, share it across all producers and consumers, and close it on shutdown. `PulsarClient.builder()` returns a [`PulsarClientBuilder`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/PulsarClientBuilder.html) where you configure the connection.
```java
import org.apache.pulsar.client.api.v5.PulsarClient;
@@ -53,11 +53,11 @@ PulsarClient client = PulsarClient.builder()
client.close();
```
-The service URL uses the `pulsar://` (or `pulsar+ssl://`) scheme. Authentication, TLS, operation timeouts, and memory limits are set on the same builder.
+The service URL uses the `pulsar://` (or `pulsar+ssl://`) scheme. Authentication, TLS, operation timeouts, and memory limits are all set on the same builder.
## Produce messages
-Create a producer with a [schema](#schemas) and a topic, then build and send messages:
+Create a [`Producer`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/Producer.html) from the client with a [schema](#schemas) and a topic. `client.newProducer(schema)` returns a [`ProducerBuilder`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/ProducerBuilder.html); call `create()` to get the producer. Each `producer.newMessage()` returns a [`MessageBuilder`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/MessageBuilder.html) for setting the key, valu [...]
```java
Producer<String> producer = client.newProducer(Schema.string())
@@ -70,7 +70,7 @@ producer.newMessage()
.send();
```
-Send asynchronously through `async()`:
+For non-blocking sends, `producer.async()` returns an [`AsyncProducer`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/async/AsyncProducer.html) whose operations return `CompletableFuture`s:
```java
var async = producer.async();
@@ -81,11 +81,11 @@ async.flush().join();
## Consume messages
-The V5 client replaces the four classic subscription types with three consumer types. Choose one by how you intend to consume; see [Consumers](pathname:///docs/concepts-messaging#consumers) for the full semantics.
+The V5 client replaces the four classic subscription types with three consumer types. Choose one by how you intend to consume; see [Consumers](pathname:///docs/concepts-messaging#consumers) for the full semantics. Each consumer hands you a [`Message`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/Message.html), identified by a [`MessageId`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/MessageId.html).
### Stream consumer
-Ordered consumption with cumulative acknowledgment:
+A [`StreamConsumer`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/StreamConsumer.html) gives ordered consumption with cumulative acknowledgment -- acknowledging a message also acknowledges everything before it:
```java
StreamConsumer<String> consumer = client.newStreamConsumer(Schema.string())
@@ -102,7 +102,7 @@ if (msg != null) {
### Queue consumer
-Parallel consumption with individual acknowledgment, negative acknowledgment, and dead-letter support:
+A [`QueueConsumer`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/QueueConsumer.html) gives parallel consumption with individual acknowledgment, negative acknowledgment, and dead-letter support:
```java
QueueConsumer<String> consumer = client.newQueueConsumer(Schema.string())
@@ -123,7 +123,7 @@ if (msg != null) {
### Checkpoint consumer
-For stream-processing engines that track their own position -- no subscription and no acknowledgment. Capture a serializable `Checkpoint` and restore from it:
+A [`CheckpointConsumer`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/CheckpointConsumer.html) suits stream-processing engines that track their own position -- it has no subscription and no acknowledgment. Capture a serializable [`Checkpoint`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/Checkpoint.html) and restore from it later:
```java
CheckpointConsumer<String> consumer = client.newCheckpointConsumer(Schema.string())
@@ -138,7 +138,7 @@ byte[] state = consumer.checkpoint().toByteArray(); // persist externally
## Schemas
-Pass a schema when creating any producer or consumer. The V5 schema factories are lowercase methods:
+Pass a [`Schema`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/schema/Schema.html) when creating any producer or consumer. The V5 schema factories are lowercase methods:
```java
Schema.string() // String
@@ -150,7 +150,7 @@ Primitive factories (`Schema.int32()`, `Schema.bool()`, `Schema.bytes()`, …) a
## Transactions
-Produce messages and acknowledge consumed messages atomically. Bind a produce with `.transaction(txn)` on the message builder and an acknowledgment with the two-argument `acknowledge`:
+A [`Transaction`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/Transaction.html) lets you produce messages and acknowledge consumed messages atomically. Start one with `client.newTransaction()`, bind a produce with `.transaction(txn)` on the message builder and an acknowledgment with the two-argument `acknowledge`, then commit or abort:
```java
Transaction txn = client.newTransaction();
diff --git a/src/config/pulsarVariables.ts b/src/config/pulsarVariables.ts
index a3165a5d145..651c9b1f67a 100644
--- a/src/config/pulsarVariables.ts
+++ b/src/config/pulsarVariables.ts
@@ -135,6 +135,22 @@ export function javadocVersionUrl(version: string, type: string): string {
return `${urlConfig.siteUrl}/api/${type}/${version}`;
}
+// The V5 client API (org.apache.pulsar.client.api.v5) ships only in Pulsar
+// 5.0.0+, so its Javadoc has no pre-5.0 directory. Resolve it against the doc's
+// own version when that is already 5.x+; otherwise (e.g. the current docs, whose
+// latestMajorRelease is still a 4.x line) point at the newest published 5.x+
+// release, falling back to 5.0.x — the first release to carry it — until a 5.x
+// line is listed in versions.json.
+const firstClientV5Release = "5.0.x";
+const latestClientV5Release: string =
+ versions.find((v) => (semver.coerce(v)?.major ?? 0) >= 5) ?? firstClientV5Release;
+
+export function javadocClientV5Url(originVersion: string): string {
+ const major = semver.coerce(originVersion)?.major ?? 0;
+ const version = major >= 5 ? originVersion : latestClientV5Release;
+ return javadocVersionUrl(version, "client-v5");
+}
+
export function referenceVersion(version: string): string {
const v = semver.coerce(version)!;
if (v.compareMain("2.7.0") < 0) return "2.6.x";
@@ -208,6 +224,7 @@ export function resolveTokens(versionKey: string, referenceLatest = false): Map<
["download_page_url", downloadPageUrl()],
["javadoc:admin", javadocVersionUrl(originVersion, "admin")],
["javadoc:client", javadocVersionUrl(originVersion, "client")],
+ ["javadoc:client-v5", javadocClientV5Url(originVersion)],
["javadoc:pulsar-functions", javadocVersionUrl(originVersion, "pulsar-functions")],
["offloader_release_url", offloaderReleaseUrl(resolvedVersion)],
["presto_pulsar_connector_release_url", prestoPulsarReleaseUrl(resolvedVersion)],
diff --git a/tools/pytools/lib/execute/javadoc_generator.py b/tools/pytools/lib/execute/javadoc_generator.py
index 3e680774edb..117a9150fa0 100644
--- a/tools/pytools/lib/execute/javadoc_generator.py
+++ b/tools/pytools/lib/execute/javadoc_generator.py
@@ -74,11 +74,14 @@ def _publish(apidocs: Path, name: str, v: str):
def _generate_gradle(src: Path, v: str):
# Pulsar master/5.0.0+ build with Gradle: the modules' standard `javadoc`
# tasks write to <module>/build/docs/javadoc. A single Gradle invocation
- # builds all three; the task graph compiles the dependent projects as needed.
+ # builds them all; the task graph compiles the dependent projects as needed.
+ # pulsar-client-api-v5 (the V5 scalable-topics client) is new in 5.0.0 and
+ # has no Maven counterpart, so it is published only on the Gradle path.
gradlew = src / 'gradlew'
run(
str(gradlew.absolute()),
':pulsar-client-api:javadoc',
+ ':pulsar-client-api-v5:javadoc',
':pulsar-client-admin-api:javadoc',
':pulsar-functions:pulsar-functions-api:javadoc',
'--no-configuration-cache',
@@ -86,6 +89,7 @@ def _generate_gradle(src: Path, v: str):
cwd=src,
)
_publish(src / 'pulsar-client-api' / 'build' / 'docs' / 'javadoc', 'client', v)
+ _publish(src / 'pulsar-client-api-v5' / 'build' / 'docs' / 'javadoc', 'client-v5', v)
_publish(src / 'pulsar-client-admin-api' / 'build' / 'docs' / 'javadoc', 'admin', v)
_publish(src / 'pulsar-functions' / 'api-java' / 'build' / 'docs' / 'javadoc',
'pulsar-functions', v)
(pulsar-site) 04/16: Link V5 client method calls in the java-v5 doc to their Javadoc
Posted by lh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
lhotari pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/pulsar-site.git
commit cec920754f8d142f4288d2c5027d473b2ed1a040
Author: Lari Hotari <lh...@users.noreply.github.com>
AuthorDate: Tue Jun 23 18:55:43 2026 +0300
Link V5 client method calls in the java-v5 doc to their Javadoc
Deep-link the inline method references in the prose (PulsarClient.builder(),
client.newProducer(schema), create(), producer.newMessage(), producer.async(),
client.newTransaction(), .transaction(txn), the two-argument acknowledge, and
the Schema primitive/protobuf factories) to their Javadoc method anchors, using
the Java 17 #method(param.Types) anchor format taken from the generated docs.
---
client-libraries/java-v5.md | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/client-libraries/java-v5.md b/client-libraries/java-v5.md
index 7df5684bca6..08aae44d165 100644
--- a/client-libraries/java-v5.md
+++ b/client-libraries/java-v5.md
@@ -39,7 +39,7 @@ dependencies {
## Create a client
-A [`PulsarClient`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/PulsarClient.html) is the entry point to the API: build one, share it across all producers and consumers, and close it on shutdown. `PulsarClient.builder()` returns a [`PulsarClientBuilder`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/PulsarClientBuilder.html) where you configure the connection.
+A [`PulsarClient`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/PulsarClient.html) is the entry point to the API: build one, share it across all producers and consumers, and close it on shutdown. [`PulsarClient.builder()`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/PulsarClient.html#builder()) returns a [`PulsarClientBuilder`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/PulsarClientBuilder.html) where you configure the connection.
```java
import org.apache.pulsar.client.api.v5.PulsarClient;
@@ -57,7 +57,7 @@ The service URL uses the `pulsar://` (or `pulsar+ssl://`) scheme. Authentication
## Produce messages
-Create a [`Producer`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/Producer.html) from the client with a [schema](#schemas) and a topic. `client.newProducer(schema)` returns a [`ProducerBuilder`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/ProducerBuilder.html); call `create()` to get the producer. Each `producer.newMessage()` returns a [`MessageBuilder`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/MessageBuilder.html) for setting the key, valu [...]
+Create a [`Producer`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/Producer.html) from the client with a [schema](#schemas) and a topic. [`client.newProducer(schema)`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/PulsarClient.html#newProducer(org.apache.pulsar.client.api.v5.schema.Schema)) returns a [`ProducerBuilder`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/ProducerBuilder.html); call [`create()`](@pulsar:javadoc:client-v5@/org/apache/pulsa [...]
```java
Producer<String> producer = client.newProducer(Schema.string())
@@ -70,7 +70,7 @@ producer.newMessage()
.send();
```
-For non-blocking sends, `producer.async()` returns an [`AsyncProducer`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/async/AsyncProducer.html) whose operations return `CompletableFuture`s:
+For non-blocking sends, [`producer.async()`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/Producer.html#async()) returns an [`AsyncProducer`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/async/AsyncProducer.html) whose operations return `CompletableFuture`s:
```java
var async = producer.async();
@@ -146,11 +146,11 @@ Schema.json(Order.class) // JSON-encoded POJO
Schema.avro(Order.class) // Avro-encoded POJO
```
-Primitive factories (`Schema.int32()`, `Schema.bool()`, `Schema.bytes()`, …) and `Schema.protobuf(...)` are also available.
+Primitive factories ([`Schema.int32()`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/schema/Schema.html#int32()), [`Schema.bool()`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/schema/Schema.html#bool()), [`Schema.bytes()`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/schema/Schema.html#bytes()), …) and [`Schema.protobuf(...)`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/schema/Schema.html#protobuf(java.lang.Class)) are also available.
## Transactions
-A [`Transaction`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/Transaction.html) lets you produce messages and acknowledge consumed messages atomically. Start one with `client.newTransaction()`, bind a produce with `.transaction(txn)` on the message builder and an acknowledgment with the two-argument `acknowledge`, then commit or abort:
+A [`Transaction`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/Transaction.html) lets you produce messages and acknowledge consumed messages atomically. Start one with [`client.newTransaction()`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/PulsarClient.html#newTransaction()), bind a produce with [`.transaction(txn)`](@pulsar:javadoc:client-v5@/org/apache/pulsar/client/api/v5/MessageMetadata.html#transaction(org.apache.pulsar.client.api.v5.Transaction)) on the [...]
```java
Transaction txn = client.newTransaction();
(pulsar-site) 15/16: Update internal links in blog post
Posted by lh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
lhotari pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/pulsar-site.git
commit 9c21b03327f3a97cc2e708bf923f5c6d3c58c4db
Author: Lari Hotari <lh...@users.noreply.github.com>
AuthorDate: Wed Jun 24 00:38:29 2026 +0300
Update internal links in blog post
---
blog/2026-06-23-announcing-apache-pulsar-5-0-m1.md | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/blog/2026-06-23-announcing-apache-pulsar-5-0-m1.md b/blog/2026-06-23-announcing-apache-pulsar-5-0-m1.md
index 6844a0ef2da..3bb03424804 100644
--- a/blog/2026-06-23-announcing-apache-pulsar-5-0-m1.md
+++ b/blog/2026-06-23-announcing-apache-pulsar-5-0-m1.md
@@ -49,7 +49,7 @@ For now, the classic client API remains fully supported, and existing applicatio
The V5 client (`pulsar-client-v5`) also works against your existing partitioned and non-partitioned topics, so you can adopt the new API before migrating a single topic — and a consumer can now subscribe to an entire **namespace**, filtered by topic properties. In M1 the V5 client ships for Java; the other language SDKs will follow before GA.
-Start here: [Scalable topics concepts](https://pulsar.apache.org/docs/next/concepts-scalable-topics), the [V5 Java client](https://pulsar.apache.org/docs/client-libraries/java-v5), and the [migration guide](https://pulsar.apache.org/docs/client-libraries/java-migrate-to-v5).
+Start here: [Scalable topics concepts](/docs/concepts-scalable-topics), the [V5 Java client](/docs/client-libraries/java-v5), and the [migration guide](/docs/client-libraries/java-migrate-to-v5).
## Oxia is now the recommended metadata store
@@ -57,7 +57,7 @@ Start here: [Scalable topics concepts](https://pulsar.apache.org/docs/next/conce
ZooKeeper remains fully supported, and 5.0 makes moving to Oxia straightforward:
-- **[PIP-454](https://github.com/apache/pulsar/blob/master/pip/pip-454.md): Metadata Store Migration Framework** — a live, **zero-downtime** migration from ZooKeeper to Oxia. The data plane keeps publishing and consuming while metadata is copied. See [Migrate metadata store](https://pulsar.apache.org/docs/next/administration-metadata-store-migration).
+- **[PIP-454](https://github.com/apache/pulsar/blob/master/pip/pip-454.md): Metadata Store Migration Framework** — a live, **zero-downtime** migration from ZooKeeper to Oxia. The data plane keeps publishing and consuming while metadata is copied. See [Migrate metadata store](/docs/administration-metadata-store-migration).
- **[PIP-469](https://github.com/apache/pulsar/blob/master/pip/pip-469.md): Metadata-store topic policies** — topic policies can be stored directly in the metadata store, with legacy-aware routing for clusters still using system-topic policies.
5.0 also **removes the etcd metadata store backend** ([PIP-462](https://github.com/apache/pulsar/blob/master/pip/pip-462.md)). ZooKeeper and Oxia are the supported backends going forward, so etcd users should migrate before upgrading.
@@ -72,7 +72,7 @@ ZooKeeper remains fully supported, and 5.0 makes moving to Oxia straightforward:
## Try it and tell us what you think
-Deploy Pulsar 5.0 to a test cluster, or try it locally with [Docker Compose](https://pulsar.apache.org/docs/next/getting-started-docker-compose) — which runs Pulsar on Oxia out of the box — or [Pulsar Standalone](https://pulsar.apache.org/docs/next/getting-started-standalone). Because this is a preview, we're especially keen to hear about:
+Deploy Pulsar 5.0 to a test cluster, or try it locally with [Docker Compose](/docs/getting-started-docker-compose) — which runs Pulsar on Oxia out of the box — or [Pulsar Standalone](/docs/getting-started-standalone). Because this is a preview, we're especially keen to hear about:
- creating and operating **scalable topics** with the V5 client;
- migrating a cluster's metadata store from **ZooKeeper to Oxia**;
(pulsar-site) 16/16: Add links to the blog post
Posted by lh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
lhotari pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/pulsar-site.git
commit 7effc9f983f49804beb8a397b3c6ddf34975e04a
Author: Lari Hotari <lh...@users.noreply.github.com>
AuthorDate: Wed Jun 24 00:43:48 2026 +0300
Add links to the blog post
---
docusaurus.config.ts | 4 ++--
src/pages/download.mdx | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/docusaurus.config.ts b/docusaurus.config.ts
index 6725a9d9ddc..b0af3605638 100644
--- a/docusaurus.config.ts
+++ b/docusaurus.config.ts
@@ -106,8 +106,8 @@ module.exports = async function createConfigAsync() {
announcementBar: {
id: "summit",
content: renderAnnouncementBar(
- "✨ Apache Pulsar 4.2 is here! ✨",
- "/download/"
+ "✨ Apache Pulsar 5.0.0-M1 is here! ✨",
+ "/blog/2026/06/23/announcing-apache-pulsar-5-0-m1/"
),
backgroundColor: "#282826",
textColor: "#fff",
diff --git a/src/pages/download.mdx b/src/pages/download.mdx
index ef3e00e3904..e0853ebdae9 100644
--- a/src/pages/download.mdx
+++ b/src/pages/download.mdx
@@ -33,7 +33,7 @@ import SupportedVersionsTable from "@site/src/components/SupportedVersionsTable"
<SupportedVersionsTable isHideUnmaintained />
````
-- [What's New in Apache Pulsar 4.0](pathname:///blog/2024/10/24/announcing-apache-pulsar-4-0)
+- [Blog: Apache Pulsar 5.0.0-M1: A Preview of the Next Major Release](pathname:///blog/2026/06/23/announcing-apache-pulsar-5-0-m1)
- [All Versions Schedule](pathname:///contribute/release-policy)
- [Release notes](pathname:///release-notes)