use of com.linkedin.r2.message.rest.RestException in project voldemort by voldemort.
the class R2Store method getAll.
@Override
public Map<ByteArray, List<Versioned<byte[]>>> getAll(Iterable<ByteArray> keys, Map<ByteArray, byte[]> transforms) throws VoldemortException {
Map<ByteArray, List<Versioned<byte[]>>> resultMap = new HashMap<ByteArray, List<Versioned<byte[]>>>();
int numberOfKeys = 0;
try {
Iterator<ByteArray> it = keys.iterator();
StringBuilder keyArgs = null;
while (it.hasNext()) {
ByteArray key = it.next();
String base64Key = RestUtils.encodeVoldemortKey(key.get());
if (keyArgs == null) {
keyArgs = new StringBuilder();
keyArgs.append(base64Key);
} else {
keyArgs.append("," + base64Key);
}
numberOfKeys++;
}
// TODO a common way to handle getAll with any number of keys
if (numberOfKeys == 1) {
List<Versioned<byte[]>> resultList = new ArrayList<Versioned<byte[]>>();
it = keys.iterator();
ByteArray key = it.next();
byte[] singleKeyTransforms = null;
if (transforms != null) {
singleKeyTransforms = transforms.get(key);
}
resultList = this.get(key, singleKeyTransforms);
resultMap.put(key, resultList);
} else {
RestRequestBuilder rb = new RestRequestBuilder(new URI(this.restBootstrapURL + "/" + getName() + "/" + keyArgs.toString()));
rb.setMethod(GET);
rb.setHeader("Accept", MULTIPART_CONTENT_TYPE);
String timeoutStr = Long.toString(this.config.getTimeoutConfig().getOperationTimeout(VoldemortOpCode.GET_ALL_OP_CODE));
rb.setHeader(RestMessageHeaders.X_VOLD_REQUEST_TIMEOUT_MS, timeoutStr);
rb.setHeader(RestMessageHeaders.X_VOLD_REQUEST_ORIGIN_TIME_MS, String.valueOf(System.currentTimeMillis()));
if (this.routingTypeCode != null) {
rb.setHeader(RestMessageHeaders.X_VOLD_ROUTING_TYPE_CODE, this.routingTypeCode);
}
if (this.zoneId != INVALID_ZONE_ID) {
rb.setHeader(RestMessageHeaders.X_VOLD_ZONE_ID, String.valueOf(this.zoneId));
}
RestRequest request = rb.build();
Future<RestResponse> f = client.restRequest(request);
// This will block
RestResponse response = f.get();
// Parse the response
final ByteString entity = response.getEntity();
String contentType = response.getHeader(CONTENT_TYPE);
if (entity != null) {
if (contentType.equalsIgnoreCase(MULTIPART_CONTENT_TYPE)) {
resultMap = parseGetAllResults(entity);
} else {
if (logger.isDebugEnabled()) {
logger.debug("Did not receive a multipart response");
}
}
} else {
if (logger.isDebugEnabled()) {
logger.debug("Did not get any response!");
}
}
}
} catch (ExecutionException e) {
if (e.getCause() instanceof RestException) {
RestException exception = (RestException) e.getCause();
if (logger.isDebugEnabled()) {
logger.debug("REST EXCEPTION STATUS : " + exception.getResponse().getStatus());
}
} else {
throw new VoldemortException("Unknown HTTP request execution exception: " + e.getMessage(), e);
}
} catch (InterruptedException e) {
if (logger.isDebugEnabled()) {
logger.debug("Operation interrupted : " + e.getMessage(), e);
}
throw new VoldemortException("Operation interrupted exception: " + e.getMessage(), e);
} catch (URISyntaxException e) {
throw new VoldemortException("Illegal HTTP URL" + e.getMessage(), e);
}
return resultMap;
}
use of com.linkedin.r2.message.rest.RestException in project voldemort by voldemort.
the class CoordinatorAdminClient method putStoreClientConfigString.
public boolean putStoreClientConfigString(String storeClientConfigAvro, String coordinatorUrl) {
String responseMessage = null;
Boolean success = false;
try {
// Create the REST request
StringBuilder URIStringBuilder = new StringBuilder().append(coordinatorUrl).append(URL_SEPARATOR).append(STORE_CLIENT_CONFIG_OPS).append(URL_SEPARATOR);
RestRequestBuilder requestBuilder = new RestRequestBuilder(new URI(URIStringBuilder.toString()));
byte[] payload = storeClientConfigAvro.getBytes("UTF-8");
// Create a HTTP POST request
requestBuilder.setMethod(requestType.POST.toString());
requestBuilder.setEntity(payload);
requestBuilder.setHeader(CONTENT_TYPE, "binary");
requestBuilder.setHeader(CONTENT_LENGTH, "" + payload.length);
String timeoutStr = Long.toString(this.config.getTimeoutConfig().getOperationTimeout(VoldemortOpCode.PUT_OP_CODE));
requestBuilder.setHeader(RestMessageHeaders.X_VOLD_REQUEST_TIMEOUT_MS, timeoutStr);
requestBuilder = setCommonRequestHeader(requestBuilder);
RestRequest request = requestBuilder.build();
Future<RestResponse> future = client.restRequest(request);
// This will block
RestResponse response = future.get();
final ByteString entity = response.getEntity();
if (entity == null) {
if (logger.isDebugEnabled()) {
logger.debug("Empty response !");
}
responseMessage = "Received empty response from " + coordinatorUrl;
} else {
responseMessage = entity.asString("UTF-8");
success = true;
}
} catch (Exception e) {
if (e.getCause() instanceof RestException) {
responseMessage = ((RestException) e.getCause()).getResponse().getEntity().asString("UTF-8");
} else {
responseMessage = "An exception other than RestException happens!";
}
handleRequestAndResponseException(e);
} finally {
System.out.println(responseMessage);
}
return success;
}
use of com.linkedin.r2.message.rest.RestException in project rest.li by linkedin.
the class RestLiResponseHandler method buildRestException.
public RestException buildRestException(final Throwable e, PartialRestResponse partialResponse) {
List<String> cookies = CookieUtil.encodeSetCookies(partialResponse.getCookies());
RestResponseBuilder builder = new RestResponseBuilder().setHeaders(partialResponse.getHeaders()).setCookies(cookies).setStatus(partialResponse.getStatus().getCode());
if (partialResponse.hasData()) {
DataMap dataMap = partialResponse.getDataMap();
ByteArrayOutputStream baos = new ByteArrayOutputStream(4096);
// partialResponse.getSchema()
DataMapUtils.write(dataMap, null, baos, true);
builder.setEntity(baos.toByteArray());
}
RestResponse restResponse = builder.build();
RestException restException = new RestException(restResponse, e);
return restException;
}
use of com.linkedin.r2.message.rest.RestException in project rest.li by linkedin.
the class TestRestCaptureFilter method testCaptureRestException.
@Test
public void testCaptureRestException() {
final RestRequest req = request();
final RestResponse res = new RestResponseBuilder().setStatus(RestStatus.NOT_FOUND).build();
final Exception ex = new RestException(res);
FilterUtil.fireUntypedRequestError(getFilterChain(), req, ex);
Assert.assertEquals(res, getDb().replay(req));
}
use of com.linkedin.r2.message.rest.RestException in project rest.li by linkedin.
the class TestRestReplayFilter method testReplayWithRestException.
@Test
public void testReplayWithRestException() {
final RestRequest req = request();
final RestResponse res = new RestResponseBuilder().setStatus(RestStatus.NOT_FOUND).build();
final CaptureLastCallFilter captureFilter = new CaptureLastCallFilter();
final FilterChain fc = getFilterChain().addFirstRest(captureFilter);
// Record a response for the request we will fire
getDb().record(req, res);
// We should be able to fire just the request - the response should be replayed from the
// capture we set up above. The response should be a RestException since the status code is 404.
FilterUtil.fireUntypedRequest(fc, req);
Assert.assertTrue(captureFilter.getLastErr() instanceof RestException);
Assert.assertEquals(res, ((RestException) captureFilter.getLastErr()).getResponse());
}
Aggregations