Skip to content

Commit a18d77f

Browse files
committed
more changes
1 parent 055964f commit a18d77f

14 files changed

Lines changed: 214 additions & 43 deletions

File tree

extensions-core/kubernetes-overlord-extensions/src/main/java/org/apache/druid/k8s/overlord/execution/KubernetesTaskExecutionConfigResource.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -161,10 +161,14 @@ public Response getExecutionConfigHistory(
161161
@ResourceFilters(ConfigResourceFilter.class)
162162
public Response getExecutionConfig()
163163
{
164-
return DynamicConfigEtagHelper.withEtag(
165-
Response.ok(getDynamicConfig()),
166-
configManager.getCurrentBytes(KubernetesTaskRunnerDynamicConfig.CONFIG_KEY)
167-
).build();
164+
return DynamicConfigEtagHelper.buildReadResponseWithEtag(
165+
() -> configManager.getCurrentBytes(KubernetesTaskRunnerDynamicConfig.CONFIG_KEY),
166+
currentBytes -> configManager.convertByteToConfig(
167+
currentBytes,
168+
KubernetesTaskRunnerDynamicConfig.class,
169+
null
170+
)
171+
);
168172
}
169173

170174
private KubernetesTaskRunnerDynamicConfig getDynamicConfig()

extensions-core/kubernetes-overlord-extensions/src/test/java/org/apache/druid/k8s/overlord/execution/KubernetesTaskExecutionConfigResourceTest.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
package org.apache.druid.k8s.overlord.execution;
2121

2222
import org.apache.druid.audit.AuditManager;
23+
import org.apache.druid.common.config.ConfigEtag;
2324
import org.apache.druid.common.config.ConfigManager;
2425
import org.apache.druid.common.config.JacksonConfigManager;
2526
import org.apache.druid.error.ErrorResponse;
@@ -33,6 +34,7 @@
3334
import javax.servlet.http.HttpServletRequest;
3435
import javax.ws.rs.core.HttpHeaders;
3536
import javax.ws.rs.core.Response;
37+
import java.nio.charset.StandardCharsets;
3638
import java.util.concurrent.atomic.AtomicReference;
3739

3840
public class KubernetesTaskExecutionConfigResourceTest
@@ -51,6 +53,36 @@ public void setUp()
5153
dynamicConfig = EasyMock.createMock(KubernetesTaskRunnerDynamicConfig.class);
5254
}
5355

56+
@Test
57+
public void getExecutionConfigDerivesBodyAndEtagFromSameBytes()
58+
{
59+
final byte[] currentBytes = "current-k8s-execution-config".getBytes(StandardCharsets.UTF_8);
60+
final KubernetesTaskRunnerDynamicConfig expectedConfig =
61+
new DefaultKubernetesTaskRunnerDynamicConfig(new TaskTypePodTemplateSelectStrategy(), 10);
62+
final KubernetesTaskExecutionConfigResource testedResource = new KubernetesTaskExecutionConfigResource(
63+
configManager,
64+
auditManager
65+
);
66+
67+
EasyMock.expect(configManager.getCurrentBytes(KubernetesTaskRunnerDynamicConfig.CONFIG_KEY))
68+
.andReturn(currentBytes)
69+
.once();
70+
EasyMock.expect(
71+
configManager.convertByteToConfig(
72+
EasyMock.aryEq(currentBytes),
73+
EasyMock.eq(KubernetesTaskRunnerDynamicConfig.class),
74+
(KubernetesTaskRunnerDynamicConfig) EasyMock.isNull()
75+
)
76+
).andReturn(expectedConfig).once();
77+
EasyMock.replay(configManager, auditManager);
78+
79+
final Response result = testedResource.getExecutionConfig();
80+
81+
Assertions.assertEquals(Response.Status.OK.getStatusCode(), result.getStatus());
82+
Assertions.assertEquals(expectedConfig, result.getEntity());
83+
Assertions.assertEquals(ConfigEtag.compute(currentBytes), result.getMetadata().getFirst(HttpHeaders.ETAG));
84+
}
85+
5486
@Test
5587
public void setExecutionConfigSuccessfulUpdate()
5688
{

indexing-service/src/main/java/org/apache/druid/indexing/overlord/http/OverlordCompactionResource.java

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -138,16 +138,10 @@ public Response updateClusterCompactionConfig(
138138
@ResourceFilters(ConfigResourceFilter.class)
139139
public Response getClusterCompactionConfig()
140140
{
141-
final Response base = ServletResourceUtils.buildReadResponse(
142-
configManager::getClusterCompactionConfig
141+
return DynamicConfigEtagHelper.buildReadResponseWithEtag(
142+
configManager::getCurrentCompactionConfigBytes,
143+
currentBytes -> configManager.convertBytesToCompactionConfig(currentBytes).clusterConfig()
143144
);
144-
if (base.getStatus() != Response.Status.OK.getStatusCode()) {
145-
return base;
146-
}
147-
return DynamicConfigEtagHelper.withEtag(
148-
Response.fromResponse(base),
149-
configManager.getCurrentCompactionConfigBytes()
150-
).build();
151145
}
152146

153147
@GET

indexing-service/src/main/java/org/apache/druid/indexing/overlord/http/OverlordResource.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -427,10 +427,14 @@ public Response getMultipleTaskStatuses(Set<String> taskIds)
427427
@ResourceFilters(ConfigResourceFilter.class)
428428
public Response getWorkerConfig()
429429
{
430-
return DynamicConfigEtagHelper.withEtag(
431-
Response.ok(taskQueryTool.getLatestWorkerConfig()),
432-
configManager.getCurrentBytes(WorkerBehaviorConfig.CONFIG_KEY)
433-
).build();
430+
return DynamicConfigEtagHelper.buildReadResponseWithEtag(
431+
() -> configManager.getCurrentBytes(WorkerBehaviorConfig.CONFIG_KEY),
432+
currentBytes -> configManager.convertByteToConfig(
433+
currentBytes,
434+
WorkerBehaviorConfig.class,
435+
null
436+
)
437+
);
434438
}
435439

436440
/**

indexing-service/src/test/java/org/apache/druid/indexing/overlord/http/OverlordCompactionResourceTest.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import com.google.common.util.concurrent.Futures;
2424
import org.apache.druid.audit.AuditManager;
2525
import org.apache.druid.client.coordinator.CoordinatorClient;
26+
import org.apache.druid.common.config.ConfigEtag;
2627
import org.apache.druid.error.DruidExceptionMatcher;
2728
import org.apache.druid.error.ErrorResponse;
2829
import org.apache.druid.indexer.CompactionEngine;
@@ -41,6 +42,7 @@
4142
import org.apache.druid.server.coordinator.CoordinatorConfigManager;
4243
import org.apache.druid.server.coordinator.DataSourceCompactionConfig;
4344
import org.apache.druid.server.coordinator.DataSourceCompactionConfigAuditEntry;
45+
import org.apache.druid.server.coordinator.DruidCompactionConfig;
4446
import org.apache.druid.server.coordinator.InlineSchemaDataSourceCompactionConfig;
4547
import org.apache.druid.server.security.AllowAllAuthorizer;
4648
import org.apache.druid.server.security.AuthConfig;
@@ -57,6 +59,7 @@
5759
import javax.servlet.http.HttpServletRequest;
5860
import javax.ws.rs.core.HttpHeaders;
5961
import javax.ws.rs.core.Response;
62+
import java.nio.charset.StandardCharsets;
6063
import java.util.List;
6164
import java.util.Map;
6265
import java.util.Random;
@@ -192,17 +195,20 @@ public void test_getClusterConfig()
192195
{
193196
final ClusterCompactionConfig clusterConfig =
194197
new ClusterCompactionConfig(0.4, 100, null, true, CompactionEngine.MSQ, true);
195-
EasyMock.expect(configManager.getClusterCompactionConfig())
196-
.andReturn(clusterConfig)
197-
.once();
198+
final DruidCompactionConfig compactionConfig = DruidCompactionConfig.empty().withClusterConfig(clusterConfig);
199+
final byte[] currentBytes = "current-compaction-config".getBytes(StandardCharsets.UTF_8);
198200
EasyMock.expect(configManager.getCurrentCompactionConfigBytes())
199-
.andReturn(null)
201+
.andReturn(currentBytes)
202+
.once();
203+
EasyMock.expect(configManager.convertBytesToCompactionConfig(EasyMock.aryEq(currentBytes)))
204+
.andReturn(compactionConfig)
200205
.once();
201206
replayAll();
202207

203208
final Response response = compactionResource.getClusterCompactionConfig();
204209
Assert.assertEquals(200, response.getStatus());
205210
Assert.assertEquals(clusterConfig, response.getEntity());
211+
Assert.assertEquals(ConfigEtag.compute(currentBytes), response.getMetadata().getFirst(HttpHeaders.ETAG));
206212
}
207213

208214
@Test

indexing-service/src/test/java/org/apache/druid/indexing/overlord/http/OverlordResourceTest.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import com.google.common.collect.ImmutableSet;
2828
import org.apache.druid.audit.AuditEntry;
2929
import org.apache.druid.audit.AuditManager;
30+
import org.apache.druid.common.config.ConfigEtag;
3031
import org.apache.druid.common.config.JacksonConfigManager;
3132
import org.apache.druid.error.DruidException;
3233
import org.apache.druid.error.ErrorResponse;
@@ -94,6 +95,7 @@
9495
import javax.ws.rs.core.HttpHeaders;
9596
import javax.ws.rs.core.Response;
9697
import javax.ws.rs.core.Response.Status;
98+
import java.nio.charset.StandardCharsets;
9799
import java.util.Arrays;
98100
import java.util.Collection;
99101
import java.util.Collections;
@@ -1365,6 +1367,31 @@ public void testGetTotalWorkerCapacityWithMaximumCapacity()
13651367
Assert.assertEquals(expectedWorkerCapacityWithAutoscale, ((TotalWorkerCapacityResponse) response.getEntity()).getMaximumCapacityWithAutoScale());
13661368
}
13671369

1370+
@Test
1371+
public void testGetWorkerConfigDerivesBodyAndEtagFromSameBytes()
1372+
{
1373+
final WorkerBehaviorConfig workerBehaviorConfig = EasyMock.createMock(WorkerBehaviorConfig.class);
1374+
final byte[] currentBytes = "current-worker-config".getBytes(StandardCharsets.UTF_8);
1375+
1376+
EasyMock.expect(configManager.getCurrentBytes(WorkerBehaviorConfig.CONFIG_KEY))
1377+
.andReturn(currentBytes)
1378+
.once();
1379+
EasyMock.expect(
1380+
configManager.convertByteToConfig(
1381+
EasyMock.aryEq(currentBytes),
1382+
EasyMock.eq(WorkerBehaviorConfig.class),
1383+
(WorkerBehaviorConfig) EasyMock.isNull()
1384+
)
1385+
).andReturn(workerBehaviorConfig).once();
1386+
replayAll();
1387+
1388+
final Response response = overlordResource.getWorkerConfig();
1389+
1390+
Assert.assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
1391+
Assert.assertEquals(workerBehaviorConfig, response.getEntity());
1392+
Assert.assertEquals(ConfigEtag.compute(currentBytes), response.getMetadata().getFirst(HttpHeaders.ETAG));
1393+
}
1394+
13681395
@Test
13691396
public void testSetWorkerConfigWithBlankIfMatchReturnsBadRequest()
13701397
{

server/src/main/java/org/apache/druid/server/coordinator/CoordinatorConfigManager.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,15 @@ public CoordinatorDynamicConfig getCurrentDynamicConfig()
8888
return Preconditions.checkNotNull(dynamicConfig, "Got null config from watcher?!");
8989
}
9090

91+
public CoordinatorDynamicConfig convertBytesToDynamicConfig(@Nullable byte[] bytes)
92+
{
93+
return jacksonConfigManager.convertByteToConfig(
94+
bytes,
95+
CoordinatorDynamicConfig.class,
96+
CoordinatorDynamicConfig.builder().build()
97+
);
98+
}
99+
91100
public ConfigManager.SetResult setDynamicConfig(CoordinatorDynamicConfig config, AuditInfo auditInfo)
92101
{
93102
return setDynamicConfig(config, null, auditInfo);
@@ -190,7 +199,7 @@ public ConfigManager.SetResult getAndUpdateCompactionConfig(
190199
}
191200
}
192201

193-
public DruidCompactionConfig convertBytesToCompactionConfig(byte[] bytes)
202+
public DruidCompactionConfig convertBytesToCompactionConfig(@Nullable byte[] bytes)
194203
{
195204
return jacksonConfigManager.convertByteToConfig(
196205
bytes,

server/src/main/java/org/apache/druid/server/http/CoordinatorBrokerConfigsResource.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,14 @@ public CoordinatorBrokerConfigsResource(
7676
@Produces(MediaType.APPLICATION_JSON)
7777
public Response getBrokerDynamicConfig()
7878
{
79-
return DynamicConfigEtagHelper.withEtag(
80-
Response.ok(currentConfig.get()),
81-
configManager.getCurrentBytes(BrokerDynamicConfig.CONFIG_KEY)
82-
).build();
79+
return DynamicConfigEtagHelper.buildReadResponseWithEtag(
80+
() -> configManager.getCurrentBytes(BrokerDynamicConfig.CONFIG_KEY),
81+
currentBytes -> configManager.convertByteToConfig(
82+
currentBytes,
83+
BrokerDynamicConfig.class,
84+
BrokerDynamicConfig.builder().build()
85+
)
86+
);
8387
}
8488

8589
@POST

server/src/main/java/org/apache/druid/server/http/CoordinatorCompactionConfigsResource.java

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -60,16 +60,10 @@ public CoordinatorCompactionConfigsResource(
6060
@Produces(MediaType.APPLICATION_JSON)
6161
public Response getCompactionConfig()
6262
{
63-
final Response baseResponse = ServletResourceUtils.buildReadResponse(
64-
configManager::getCurrentCompactionConfig
63+
return DynamicConfigEtagHelper.buildReadResponseWithEtag(
64+
configManager::getCurrentCompactionConfigBytes,
65+
configManager::convertBytesToCompactionConfig
6566
);
66-
if (baseResponse.getStatus() != Response.Status.OK.getStatusCode()) {
67-
return baseResponse;
68-
}
69-
return DynamicConfigEtagHelper.withEtag(
70-
Response.fromResponse(baseResponse),
71-
configManager.getCurrentCompactionConfigBytes()
72-
).build();
7367
}
7468

7569
/**

server/src/main/java/org/apache/druid/server/http/CoordinatorDynamicConfigsResource.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,10 @@ public CoordinatorDynamicConfigsResource(
7575
@Produces(MediaType.APPLICATION_JSON)
7676
public Response getDynamicConfigs()
7777
{
78-
return DynamicConfigEtagHelper.withEtag(
79-
Response.ok(manager.getCurrentDynamicConfig()),
80-
manager.getCurrentDynamicConfigBytes()
81-
).build();
78+
return DynamicConfigEtagHelper.buildReadResponseWithEtag(
79+
manager::getCurrentDynamicConfigBytes,
80+
manager::convertBytesToDynamicConfig
81+
);
8282
}
8383

8484
// default value is used for backwards compatibility

0 commit comments

Comments
 (0)