Skip to content

Commit b389733

Browse files
authored
Merge pull request #23743 from ztlpn/leadership-pinning-license
Leadership pinning: add to enterprise features
2 parents 875dac5 + 6c4ecab commit b389733

File tree

6 files changed

+31
-0
lines changed

6 files changed

+31
-0
lines changed

src/v/cluster/controller.cc

+1
Original file line numberDiff line numberDiff line change
@@ -625,6 +625,7 @@ ss::future<> controller::start(
625625
std::ref(_feature_table),
626626
std::ref(_connections),
627627
std::ref(_roles),
628+
std::ref(_tp_state),
628629
_raft0->group());
629630

630631
co_await _health_manager.start_single(

src/v/cluster/feature_manager.cc

+17
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ feature_manager::feature_manager(
5252
ss::sharded<features::feature_table>& table,
5353
ss::sharded<rpc::connection_cache>& connection_cache,
5454
ss::sharded<security::role_store>& role_store,
55+
ss::sharded<topic_table>& topic_table,
5556
raft::group_id raft0_group)
5657
: _stm(stm)
5758
, _as(as)
@@ -62,6 +63,7 @@ feature_manager::feature_manager(
6263
, _feature_table(table)
6364
, _connection_cache(connection_cache)
6465
, _role_store(role_store)
66+
, _topic_table(topic_table)
6567
, _raft0_group(raft0_group)
6668
, _barrier_state(
6769
*config::node().node_id(),
@@ -225,6 +227,18 @@ feature_manager::report_enterprise_features() const {
225227
auto has_non_default_roles
226228
= n_roles >= 2
227229
|| (n_roles == 1 && !_role_store.local().contains(security::default_role));
230+
auto leadership_pinning_enabled = [&cfg, this]() {
231+
if (cfg.default_leaders_preference() != config::leaders_preference{}) {
232+
return true;
233+
}
234+
for (const auto& topic : _topic_table.local().topics_map()) {
235+
if (topic.second.get_configuration()
236+
.properties.leaders_preference) {
237+
return true;
238+
}
239+
}
240+
return false;
241+
};
228242

229243
features::enterprise_feature_report report;
230244
report.set(
@@ -249,6 +263,9 @@ feature_manager::report_enterprise_features() const {
249263
report.set(
250264
features::license_required_feature::datalake_iceberg,
251265
cfg.iceberg_enabled());
266+
report.set(
267+
features::license_required_feature::leadership_pinning,
268+
leadership_pinning_enabled());
252269
return report;
253270
}
254271

src/v/cluster/feature_manager.h

+2
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ class feature_manager {
6767
ss::sharded<features::feature_table>& table,
6868
ss::sharded<rpc::connection_cache>& connection_cache,
6969
ss::sharded<security::role_store>& role_store,
70+
ss::sharded<topic_table>&,
7071
raft::group_id raft0_group);
7172

7273
/**
@@ -165,6 +166,7 @@ class feature_manager {
165166
ss::sharded<features::feature_table>& _feature_table;
166167
ss::sharded<rpc::connection_cache>& _connection_cache;
167168
ss::sharded<security::role_store>& _role_store;
169+
ss::sharded<topic_table>& _topic_table;
168170
raft::group_id _raft0_group;
169171

170172
version_map _updates;

src/v/features/enterprise_features.cc

+2
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ std::ostream& operator<<(std::ostream& os, license_required_feature f) {
3939
return os << "fips";
4040
case license_required_feature::datalake_iceberg:
4141
return os << "datalake_iceberg";
42+
case license_required_feature::leadership_pinning:
43+
return os << "leadership_pinning";
4244
}
4345
__builtin_unreachable();
4446
}

src/v/features/enterprise_features.h

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ enum class license_required_feature {
2929
rbac,
3030
fips,
3131
datalake_iceberg,
32+
leadership_pinning,
3233
};
3334

3435
std::ostream& operator<<(std::ostream&, license_required_feature);

tests/rptest/tests/enterprise_features_license_test.py

+8
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from enum import IntEnum
44

55
from rptest.utils.rpenv import sample_license
6+
from rptest.clients.rpk import RpkTool
67
from rptest.services.admin import Admin, EnterpriseLicenseStatus, RolesList, RoleDescription
78
from rptest.services.redpanda import RESTART_LOG_ALLOW_LIST, SecurityConfig, SchemaRegistryConfig
89
from rptest.tests.redpanda_test import RedpandaTest
@@ -38,6 +39,7 @@ class Features(IntEnum):
3839
rbac = 7
3940
fips = 8
4041
datalake_iceberg = 9
42+
leadership_pinning = 10
4143

4244

4345
SKIP_FEATURES = [
@@ -191,6 +193,12 @@ def has_role(r: str):
191193
elif feature == Features.datalake_iceberg:
192194
self.redpanda.set_cluster_config({'iceberg_enabled': 'true'},
193195
expect_restart=True)
196+
elif feature == Features.leadership_pinning:
197+
RpkTool(self.redpanda).create_topic(
198+
"foo",
199+
partitions=1,
200+
replicas=1,
201+
config={"redpanda.leaders.preference": "racks:rack1"})
194202
else:
195203
assert False, f"Unexpected feature={feature}"
196204

0 commit comments

Comments
 (0)