Skip to content

Commit dd2fafb

Browse files
authored
Add endpoint for rebuild (#161)
This adds an endpoint for rebuild operations that are performed asynchronously similar to cleanup and decommission.
1 parent b5c0341 commit dd2fafb

File tree

5 files changed

+54
-1
lines changed

5 files changed

+54
-1
lines changed

management-api-agent-common/src/main/java/com/datastax/mgmtapi/NodeOpsProvider.java

+11
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,17 @@ public String decommission(@RpcParam(name="force") boolean force, @RpcParam(name
171171
return jobPair.left;
172172
}
173173

174+
public String rebuild(@RpcParam(name = "srcDatacenter") String srcDatacenter)
175+
{
176+
logger.debug("Starting rebuild");
177+
178+
Pair<String, CompletableFuture<Void>> jobPair = service.submit("rebuild",
179+
() -> ShimLoader.instance.get().rebuild(srcDatacenter)
180+
);
181+
182+
return jobPair.left;
183+
}
184+
174185
@Rpc(name = "setCompactionThroughput")
175186
public void setCompactionThroughput(@RpcParam(name="value") int value)
176187
{

management-api-common/src/main/java/com/datastax/mgmtapi/shims/CassandraAPI.java

+5
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ default public boolean isFullQueryLogEnabled()
4848

4949
void decommission(boolean force) throws InterruptedException;
5050

51+
default void rebuild(String srcDc)
52+
{
53+
getStorageService().rebuild(srcDc);
54+
}
55+
5156
Map<List<Long>, List<String>> checkConsistencyLevel(String consistencyLevelName, Integer rfPerDc);
5257

5358
SeedProvider getK8SeedProvider();

management-api-server/src/main/java/com/datastax/mgmtapi/resources/models/FeatureSet.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ public class FeatureSet implements Serializable {
1212

1313
public enum Feature {
1414
ASYNC_SSTABLE_TASKS("async_sstable_tasks"),
15-
FULL_QUERY_LOGGING("full_query_logging");
15+
FULL_QUERY_LOGGING("full_query_logging"),
16+
REBUILD("rebuild");
1617

1718
@JsonValue
1819
private String featureName;

management-api-server/src/main/java/com/datastax/mgmtapi/resources/v1/NodeOpsResources.java

+12
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,16 @@ public Response decommission(@QueryParam(value="force")boolean force)
3535
).build());
3636
}
3737

38+
@POST
39+
@Path("/rebuild")
40+
@Operation(summary = "Rebuild data by streaming data from other nodes. This operation returns immediately with a job id.")
41+
@Produces(MediaType.TEXT_PLAIN)
42+
public Response rebuild(@QueryParam("src_dc") String srcDatacenter)
43+
{
44+
return com.datastax.mgmtapi.resources.NodeOpsResources.handle(() ->
45+
Response.accepted(
46+
ResponseTools.getSingleRowStringResponse(app.dbUnixSocketFile, cqlService, "CALL NodeOps.rebuild(?)", srcDatacenter)
47+
).build());
48+
}
49+
3850
}

management-api-server/src/test/java/com/datastax/mgmtapi/K8OperatorResourcesTest.java

+24
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,30 @@ public void testDecommissionMissingValue() throws Exception {
175175
verify(context.cqlService).executePreparedStatement(any(), eq("CALL NodeOps.decommission(?, ?)"), eq(false), eq(false));
176176
}
177177

178+
@Test
179+
public void testRebuild() throws Exception {
180+
Context context = setup();
181+
String srcDc = "dc1";
182+
String jobId = "0fe65b47-98c2-47d8-9c3c-5810c9988e10";
183+
184+
ResultSet mockResultSet = mock(ResultSet.class);
185+
Row mockRow = mock(Row.class);
186+
187+
when(context.cqlService.executePreparedStatement(any(), anyString(), eq(srcDc))).thenReturn(mockResultSet);
188+
189+
when(mockResultSet.one()).thenReturn(mockRow);
190+
191+
when(mockRow.getString(0)).thenReturn(jobId);
192+
193+
MockHttpRequest request = MockHttpRequest.post("/api/v1/ops/node/rebuild?src_dc=dc1");
194+
MockHttpResponse response = context.invoke(request);
195+
196+
Assert.assertEquals(HttpStatus.SC_ACCEPTED, response.getStatus());
197+
assertEquals(jobId, response.getContentAsString());
198+
199+
verify(context.cqlService, timeout(500)).executePreparedStatement(any(), eq("CALL NodeOps.rebuild(?)"), eq(srcDc));
200+
}
201+
178202
@Test
179203
public void testSetCompactionThroughput() throws Exception {
180204
int value = 1;

0 commit comments

Comments
 (0)