Search in sources :

Example 1 with SingleSender

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();
    }
}
Also used : DocprocMessageProcessor(com.yahoo.feedapi.DocprocMessageProcessor) RouteMetricSet(com.yahoo.clientmetrics.RouteMetricSet) SingleSender(com.yahoo.feedapi.SingleSender) XMLFeeder(com.yahoo.feedapi.XMLFeeder) Feeder(com.yahoo.feedapi.Feeder) JsonFeeder(com.yahoo.feedapi.JsonFeeder) XMLFeeder(com.yahoo.feedapi.XMLFeeder) EmptyResponse(com.yahoo.container.jdisc.EmptyResponse) MessagePropertyProcessor(com.yahoo.feedapi.MessagePropertyProcessor)

Example 2 with SingleSender

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;
}
Also used : RemoveLocationMessage(com.yahoo.documentapi.messagebus.protocol.RemoveLocationMessage) RouteMetricSet(com.yahoo.clientmetrics.RouteMetricSet) SingleSender(com.yahoo.feedapi.SingleSender) MessagePropertyProcessor(com.yahoo.feedapi.MessagePropertyProcessor)

Example 3 with SingleSender

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;
}
Also used : InputStreamReader(java.io.InputStreamReader) DocumentId(com.yahoo.document.DocumentId) RouteMetricSet(com.yahoo.clientmetrics.RouteMetricSet) SingleSender(com.yahoo.feedapi.SingleSender) BufferedReader(java.io.BufferedReader) MessagePropertyProcessor(com.yahoo.feedapi.MessagePropertyProcessor)

Aggregations

RouteMetricSet (com.yahoo.clientmetrics.RouteMetricSet)3 MessagePropertyProcessor (com.yahoo.feedapi.MessagePropertyProcessor)3 SingleSender (com.yahoo.feedapi.SingleSender)3 EmptyResponse (com.yahoo.container.jdisc.EmptyResponse)1 DocumentId (com.yahoo.document.DocumentId)1 RemoveLocationMessage (com.yahoo.documentapi.messagebus.protocol.RemoveLocationMessage)1 DocprocMessageProcessor (com.yahoo.feedapi.DocprocMessageProcessor)1 Feeder (com.yahoo.feedapi.Feeder)1 JsonFeeder (com.yahoo.feedapi.JsonFeeder)1 XMLFeeder (com.yahoo.feedapi.XMLFeeder)1 BufferedReader (java.io.BufferedReader)1 InputStreamReader (java.io.InputStreamReader)1