Skip to content

Commit 0588808

Browse files
authored
Introduce project-global blocks (#127978)
This change introduces project global cluster blocks. It is similar to the current global block concept but scoped to only a project. i.e., for a project, there are two different globals. Cluster global and project global. This seems to fit best to the current way of how `ClusterBlocks` work. This PR focuses on extending `ProjectBlocks` to support project global blocks, and serialization/etc changes. In a follow up PR, I'll integrate the newly added project block for project deletion in the different places where we check the blocks. (originally I had some of it here, but I've reverted those to make this easier to review). Relates ES-11209
1 parent b3817cb commit 0588808

File tree

7 files changed

+263
-80
lines changed

7 files changed

+263
-80
lines changed

server/src/main/java/org/elasticsearch/TransportVersions.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,7 @@ static TransportVersion def(int id) {
297297
public static final TransportVersion SEARCH_LOAD_PER_INDEX_STATS = def(9_095_0_00);
298298
public static final TransportVersion HEAP_USAGE_IN_CLUSTER_INFO = def(9_096_0_00);
299299
public static final TransportVersion NONE_CHUNKING_STRATEGY = def(9_097_0_00);
300+
public static final TransportVersion PROJECT_DELETION_GLOBAL_BLOCK = def(9_098_0_00);
300301

301302
/*
302303
* STOP! READ THIS FIRST! No, really,

server/src/main/java/org/elasticsearch/cluster/ClusterState.java

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -873,21 +873,24 @@ private Iterator<ToXContent> blocksXContentMultiProjects() {
873873
}
874874
builder.endObject();
875875
}
876-
if (blocks().noIndexBlockAllProjects() == false) {
876+
if (blocks().noProjectHasAProjectBlock() == false) {
877877
builder.startArray("projects");
878878
}
879879
return builder;
880880
};
881881
final ToXContent after = (builder, params) -> {
882-
if (blocks().noIndexBlockAllProjects() == false) {
882+
if (blocks().noProjectHasAProjectBlock() == false) {
883883
builder.endArray();
884884
}
885885
return builder.endObject();
886886
};
887887
return chunkedSection(
888888
true,
889889
before,
890-
Iterators.map(metadata().projects().keySet().iterator(), projectId -> new Tuple<>(projectId, blocks().indices(projectId))),
890+
Iterators.map(
891+
metadata().projects().keySet().iterator(),
892+
projectId -> new Tuple<>(projectId, blocks().projectBlocks(projectId))
893+
),
891894
ClusterState::projectBlocksXContent,
892895
after
893896
);
@@ -929,19 +932,37 @@ private Iterator<ToXContent> blocksXContentSingleProject(ProjectId singleProject
929932
);
930933
}
931934

932-
private static Iterator<ToXContent> projectBlocksXContent(Tuple<ProjectId, Map<String, Set<ClusterBlock>>> entry) {
933-
return chunkedSection(
934-
entry.v2().isEmpty() == false,
935-
(builder, params) -> builder.startObject().field("id", entry.v1()).startObject("indices"),
936-
entry.v2().entrySet().iterator(),
937-
e -> Iterators.single((builder, params) -> {
938-
builder.startObject(e.getKey());
939-
for (ClusterBlock block : e.getValue()) {
935+
private static Iterator<ToXContent> projectBlocksXContent(Tuple<ProjectId, ClusterBlocks.ProjectBlocks> entry) {
936+
final var projectId = entry.v1();
937+
final var projectBlocks = entry.v2();
938+
if (projectBlocks.isEmpty()) {
939+
return Collections.emptyIterator();
940+
}
941+
return Iterators.concat(
942+
Iterators.single((builder, params) -> builder.startObject().field("id", projectId)),
943+
// write project global blocks in one chunk
944+
projectBlocks.projectGlobals().isEmpty() ? Collections.emptyIterator() : Iterators.single((builder, params) -> {
945+
builder.startObject("project_globals");
946+
for (ClusterBlock block : projectBlocks.projectGlobals()) {
940947
block.toXContent(builder, params);
941948
}
942949
return builder.endObject();
943950
}),
944-
(builder, params) -> builder.endObject().endObject()
951+
// write index blocks for the project
952+
projectBlocks.indices().isEmpty()
953+
? Collections.emptyIterator()
954+
: Iterators.concat(
955+
Iterators.single((builder, params) -> builder.startObject("indices")),
956+
Iterators.flatMap(projectBlocks.indices().entrySet().iterator(), indexBlocks -> Iterators.single((builder, params) -> {
957+
builder.startObject(indexBlocks.getKey());
958+
for (ClusterBlock block : indexBlocks.getValue()) {
959+
block.toXContent(builder, params);
960+
}
961+
return builder.endObject();
962+
})),
963+
Iterators.single((builder, params) -> builder.endObject())
964+
),
965+
Iterators.single((builder, params) -> builder.endObject())
945966
);
946967
}
947968

0 commit comments

Comments
 (0)