use of com.github.ambry.network.ResponseInfo in project ambry by linkedin.
the class TtlUpdateNotificationSystem method sendRequestsGetResponses.
// helpers
// general
/**
* Sends all the requests that the {@code manager} may have ready
* @param futureResult the {@link FutureResult} that tracks the operation
* @param manager the {@link TtlUpdateManager} to poll for requests
* @param advanceTime if {@code true}, advances time after each poll and handleResponse iteration
* @param ignoreUnrecognizedRequests if {@code true}, doesn't throw an exception if a response is received for a
* request not sent in this execution of the function
*/
private void sendRequestsGetResponses(FutureResult<Void> futureResult, TtlUpdateManager manager, boolean advanceTime, boolean ignoreUnrecognizedRequests) {
List<RequestInfo> requestInfoList = new ArrayList<>();
Set<Integer> requestsToDrop = new HashSet<>();
Set<RequestInfo> requestAcks = new HashSet<>();
List<RequestInfo> referenceRequestInfos = new ArrayList<>();
while (!futureResult.isDone()) {
manager.poll(requestInfoList, requestsToDrop);
referenceRequestInfos.addAll(requestInfoList);
List<ResponseInfo> responseInfoList = new ArrayList<>();
try {
responseInfoList = networkClient.sendAndPoll(requestInfoList, requestsToDrop, AWAIT_TIMEOUT_MS);
} catch (RuntimeException | Error e) {
if (!advanceTime) {
throw e;
}
}
for (ResponseInfo responseInfo : responseInfoList) {
RequestInfo requestInfo = responseInfo.getRequestInfo();
assertNotNull("RequestInfo is null", requestInfo);
if (!referenceRequestInfos.contains(requestInfo)) {
if (ignoreUnrecognizedRequests) {
continue;
}
throw new IllegalStateException("Received response for unrecognized request");
} else if (requestAcks.contains(requestInfo)) {
// received a second response for the same request
throw new IllegalStateException("Received response more than once for a request");
}
requestAcks.add(requestInfo);
RequestInfo routerRequestInfo = responseInfo.getRequestInfo();
RequestOrResponseType type = ((RequestOrResponse) routerRequestInfo.getRequest()).getRequestType();
switch(type) {
case TtlUpdateRequest:
manager.handleResponse(responseInfo);
break;
default:
throw new IllegalStateException("Unrecognized request type: " + type);
}
}
if (advanceTime) {
time.sleep(ADVANCE_TIME_INCREMENT_MS);
}
responseInfoList.forEach(ResponseInfo::release);
requestInfoList.clear();
}
}
use of com.github.ambry.network.ResponseInfo in project ambry by linkedin.
the class ServerAdminTool method controlRequest.
/**
* Sends a {@link RequestControlAdminRequest} to set the enable state of {@code toControl} on {@code partitionIdStr}
* to {@code enable} in {@code dataNodeId}.
* @param dataNodeId the {@link DataNodeId} to contact.
* @param partitionId the {@link PartitionId} to control requests to. Can be {@code null}.
* @param toControl the {@link RequestOrResponseType} to control.
* @param enable the enable (or disable) status required for {@code toControl}.
* @return the {@link ServerErrorCode} that is returned.
* @throws IOException
* @throws TimeoutException
*/
public ServerErrorCode controlRequest(DataNodeId dataNodeId, PartitionId partitionId, RequestOrResponseType toControl, boolean enable) throws IOException, TimeoutException {
AdminRequest adminRequest = new AdminRequest(AdminRequestOrResponseType.RequestControl, partitionId, correlationId.incrementAndGet(), CLIENT_ID);
RequestControlAdminRequest controlRequest = new RequestControlAdminRequest(toControl, enable, adminRequest);
ResponseInfo response = sendRequestGetResponse(dataNodeId, partitionId, controlRequest);
AdminResponse adminResponse = AdminResponse.readFrom(new NettyByteBufDataInputStream(response.content()));
response.release();
return adminResponse.getError();
}
use of com.github.ambry.network.ResponseInfo in project ambry by linkedin.
the class ServerAdminTool method controlBlobStore.
/**
* Sends a {@link BlobStoreControlAdminRequest} to start or stop a store associated with {@code partitionId}
* on {@code dataNodeId}.
* @param dataNodeId the {@link DataNodeId} to contact.
* @param partitionId the {@link PartitionId} to start or stop.
* @param numReplicasCaughtUpPerPartition the minimum number of peers should catch up with partition if the store is
* being stopped
* @param storeControlRequestType the type of control operation that will performed on certain store.
* @return the {@link ServerErrorCode} that is returned.
* @throws IOException
* @throws TimeoutException
*/
private ServerErrorCode controlBlobStore(DataNodeId dataNodeId, PartitionId partitionId, short numReplicasCaughtUpPerPartition, BlobStoreControlAction storeControlRequestType) throws IOException, TimeoutException {
AdminRequest adminRequest = new AdminRequest(AdminRequestOrResponseType.BlobStoreControl, partitionId, correlationId.incrementAndGet(), CLIENT_ID);
BlobStoreControlAdminRequest controlRequest = new BlobStoreControlAdminRequest(numReplicasCaughtUpPerPartition, storeControlRequestType, adminRequest);
ResponseInfo response = sendRequestGetResponse(dataNodeId, partitionId, controlRequest);
AdminResponse adminResponse = AdminResponse.readFrom(new NettyByteBufDataInputStream(response.content()));
response.release();
return adminResponse.getError();
}
use of com.github.ambry.network.ResponseInfo in project ambry by linkedin.
the class ServerAdminTool method controlReplication.
/**
* Sends a {@link ReplicationControlAdminRequest} to enable/disable replication from {@code origins} for
* {@code partitionIdStr} in {@code dataNodeId}.
* @param dataNodeId the {@link DataNodeId} to contact.
* @param partitionId the {@link PartitionId} to control replication for. Can be {@code null}.
* @param origins the names of the datacenters from which replication should be controlled.
* @param enable the enable (or disable) status required for replication from {@code origins}.
* @return the {@link ServerErrorCode} that is returned.
* @throws IOException
* @throws TimeoutException
*/
public ServerErrorCode controlReplication(DataNodeId dataNodeId, PartitionId partitionId, List<String> origins, boolean enable) throws IOException, TimeoutException {
AdminRequest adminRequest = new AdminRequest(AdminRequestOrResponseType.ReplicationControl, partitionId, correlationId.incrementAndGet(), CLIENT_ID);
ReplicationControlAdminRequest controlRequest = new ReplicationControlAdminRequest(origins, enable, adminRequest);
ResponseInfo response = sendRequestGetResponse(dataNodeId, partitionId, controlRequest);
AdminResponse adminResponse = AdminResponse.readFrom(new NettyByteBufDataInputStream(response.content()));
response.release();
return adminResponse.getError();
}
Aggregations