use of com.yahoo.feedapi.SingleSender in project vespa by vespa-engine.
the class VespaFeedHandler method handle.
public HttpResponse handle(HttpRequest request, RouteMetricSet.ProgressCallback callback) {
if (request.getProperty("status") != null) {
return new MetricResponse(context.getMetrics().getMetricSet());
}
try {
int busy = busyThreads.incrementAndGet();
if (busy > maxBusyThreads)
return new EmptyResponse(com.yahoo.jdisc.http.HttpResponse.Status.SERVICE_UNAVAILABLE);
boolean asynchronous = request.getBooleanProperty("asynchronous");
MessagePropertyProcessor.PropertySetter properties = getPropertyProcessor().buildPropertySetter(request);
String route = properties.getRoute().toString();
FeedResponse response = new FeedResponse(new RouteMetricSet(route, callback));
SingleSender sender = new SingleSender(response, getSharedSender(route), !asynchronous);
sender.addMessageProcessor(properties);
sender.addMessageProcessor(new DocprocMessageProcessor(getDocprocChain(request), getDocprocServiceRegistry(request)));
Feeder feeder = createFeeder(sender, request);
feeder.setAbortOnDocumentError(properties.getAbortOnDocumentError());
feeder.setCreateIfNonExistent(properties.getCreateIfNonExistent());
response.setAbortOnFeedError(properties.getAbortOnFeedError());
List<String> errors = feeder.parse();
for (String s : errors) {
response.addXMLParseError(s);
}
if (errors.size() > 0 && feeder instanceof XMLFeeder) {
response.addXMLParseError("If you are trying to feed JSON, set the Content-Type header to application/json.");
}
sender.done();
if (asynchronous) {
return response;
}
long millis = getTimeoutMillis(request);
boolean completed = sender.waitForPending(millis);
if (!completed) {
response.addError(Error.TIMEOUT, "Timed out after " + millis + " ms waiting for responses");
}
response.done();
return response;
} finally {
busyThreads.decrementAndGet();
}
}
use of com.yahoo.feedapi.SingleSender in project vespa by vespa-engine.
the class VespaFeedHandlerRemoveLocation method handle.
@Override
public HttpResponse handle(HttpRequest request) {
MessagePropertyProcessor.PropertySetter properties = getPropertyProcessor().buildPropertySetter(request);
FeedResponse response;
if (request.getProperty("route") == null) {
if (context.getClusterList().getStorageClusters().size() == 0) {
return new FeedResponse(null).addError("No storage clusters configured and no alternate route specified.");
} else if (context.getClusterList().getStorageClusters().size() > 1) {
return new FeedResponse(null).addError("More than one storage cluster configured and no route specified.");
} else {
properties.setRoute(Route.parse(context.getClusterList().getStorageClusters().get(0).getName()));
}
}
response = new FeedResponse(new RouteMetricSet(properties.getRoute().toString(), null));
SingleSender sender = new SingleSender(response, getSharedSender(properties.getRoute().toString()));
sender.addMessageProcessor(properties);
String user = request.getProperty("user");
String group = request.getProperty("group");
String selection = request.getProperty("selection");
boolean oneFound = (user != null) ^ (group != null) ^ (selection != null);
if (!oneFound) {
response.addError("Exactly one of \"user\", \"group\" or \"selection\" must be specified for removelocation");
return response;
}
if (user != null) {
selection = "id.user=" + user;
}
if (group != null) {
selection = "id.group=\"" + group + "\"";
}
sender.send(new RemoveLocationMessage(selection));
sender.done();
long millis = getTimeoutMillis(request);
boolean completed = sender.waitForPending(millis);
if (!completed)
response.addError(Error.TIMEOUT, "Timed out after " + millis + " ms waiting for responses");
return response;
}
use of com.yahoo.feedapi.SingleSender in project vespa by vespa-engine.
the class VespaFeedHandlerRemove method handle.
@Override
public HttpResponse handle(HttpRequest request) {
if (request.getProperty("status") != null) {
return new MetricResponse(context.getMetrics().getMetricSet());
}
MessagePropertyProcessor.PropertySetter properties = getPropertyProcessor().buildPropertySetter(request);
String route = properties.getRoute().toString();
FeedResponse response = new FeedResponse(new RouteMetricSet(route, null));
SingleSender sender = new SingleSender(response, getSharedSender(route));
sender.addMessageProcessor(properties);
response.setAbortOnFeedError(properties.getAbortOnFeedError());
if (request.hasProperty("id")) {
sender.remove(new DocumentId(request.getProperty("id")));
} else if (request.hasProperty("id[0]")) {
int index = 0;
while (request.hasProperty("id[" + index + "]")) {
sender.remove(new DocumentId(request.getProperty("id[" + index + "]")));
++index;
}
}
if (request.getData() != null) {
try {
String line;
BufferedReader reader = new BufferedReader(new InputStreamReader(getRequestInputStream(request), "UTF-8"));
while ((line = reader.readLine()) != null) {
sender.remove(new DocumentId(line));
}
} catch (Exception e) {
response.addError(e.getClass() + ": " + e.getCause());
}
}
sender.done();
long millis = getTimeoutMillis(request);
boolean completed = sender.waitForPending(millis);
if (!completed)
response.addError(Error.TIMEOUT, "Timed out after " + millis + " ms waiting for responses");
return response;
}
Aggregations