Search in sources :

Example 1 with Call

use of com.yahoo.docproc.Call in project vespa by vespa-engine.

the class SchemaMappingAndAccessesTest method testProxyAndSecure.

public void testProxyAndSecure() {
    DocumentProcessor procOK = new TestDPSecure();
    Map<Pair<String, String>, String> fieldMap = new HashMap<>();
    fieldMap.put(new Pair<>("album", "titleMapped"), "title");
    procOK.setFieldMap(fieldMap);
    DocumentPut put = new DocumentPut(getDoc());
    Document proxyDoc = new Call(procOK).configDoc(procOK, put).getDocument();
    procOK.process(Processing.of(new DocumentPut(proxyDoc)));
    assertEquals(proxyDoc.getFieldValue("title").toString(), "MyTitle MyTitle");
}
Also used : Call(com.yahoo.docproc.Call) DocumentProcessor(com.yahoo.docproc.DocumentProcessor) HashMap(java.util.HashMap) DocumentPut(com.yahoo.document.DocumentPut) Document(com.yahoo.document.Document) Pair(com.yahoo.collections.Pair)

Example 2 with Call

use of com.yahoo.docproc.Call in project vespa by vespa-engine.

the class SchemaMappingAndAccessesTest method testProxyAndSecureSecureFailing.

public void testProxyAndSecureSecureFailing() {
    DocumentProcessor procInsecure = new TestDPInsecure();
    Map<Pair<String, String>, String> fieldMap = new HashMap<>();
    fieldMap.put(new Pair<>("album", "titleMapped"), "title");
    procInsecure.setFieldMap(fieldMap);
    DocumentPut put = new DocumentPut(getDoc());
    Document doc = new Call(procInsecure).configDoc(procInsecure, put).getDocument();
    try {
        procInsecure.process(Processing.of(new DocumentPut(doc)));
        fail("Insecure docproc went through");
    } catch (Exception e) {
        assertTrue(e.getMessage().matches(".*allowed.*"));
    }
// assertEquals(doc.get("title"), "MyTitle");
}
Also used : Call(com.yahoo.docproc.Call) DocumentProcessor(com.yahoo.docproc.DocumentProcessor) HashMap(java.util.HashMap) DocumentPut(com.yahoo.document.DocumentPut) Document(com.yahoo.document.Document) Pair(com.yahoo.collections.Pair)

Example 3 with Call

use of com.yahoo.docproc.Call in project vespa by vespa-engine.

the class DocumentProcessingTask method process.

/**
 * Processes a single Processing, and fails the message if this processing fails.
 *
 * @param executor the DocprocService to use for processing
 */
private DocumentProcessor.Progress process(DocprocExecutor executor) {
    Iterator<Processing> iterator = processings.iterator();
    List<Tuple2<DocumentProcessor.Progress, Processing>> later = new ArrayList<>();
    while (iterator.hasNext()) {
        Processing processing = iterator.next();
        iterator.remove();
        if (requestContext.hasExpired()) {
            DocumentProcessor.Progress progress = DocumentProcessor.Progress.FAILED;
            final String location;
            if (processing != null) {
                final CallStack callStack = processing.callStack();
                if (callStack != null) {
                    final Call lastPopped = callStack.getLastPopped();
                    if (lastPopped != null) {
                        location = lastPopped.toString();
                    } else {
                        location = "empty call stack or no processors popped";
                    }
                } else {
                    location = "no call stack";
                }
            } else {
                location = "no processing instance";
            }
            String errorMsg = processing + " failed, " + location;
            log.log(Level.FINE, "Time is up for '" + errorMsg + "'.");
            requestContext.processingFailed(RequestContext.ErrorCode.ERROR_PROCESSING_FAILURE, "Time is up.");
            return progress;
        }
        DocumentProcessor.Progress progress = DocumentProcessor.Progress.FAILED;
        try {
            progress = executor.process(processing);
        } catch (Exception e) {
            logProcessingFailure(processing, e);
            requestContext.processingFailed(e);
            return progress;
        }
        if (DocumentProcessor.Progress.LATER.equals(progress)) {
            later.add(new Tuple2<>(progress, processing));
        } else if (DocumentProcessor.Progress.DONE.equals(progress)) {
            processingsDone.add(processing);
        } else if (DocumentProcessor.Progress.FAILED.equals(progress)) {
            logProcessingFailure(processing, null);
            requestContext.processingFailed(RequestContext.ErrorCode.ERROR_PROCESSING_FAILURE, progress.getReason().orElse("Document processing failed."));
            return progress;
        } else if (DocumentProcessor.Progress.PERMANENT_FAILURE.equals(progress)) {
            logProcessingFailure(processing, null);
            requestContext.processingFailed(RequestContext.ErrorCode.ERROR_PROCESSING_FAILURE, progress.getReason().orElse("Document processing failed."));
            return progress;
        }
    }
    if (!later.isEmpty()) {
        // Outdated comment:
        // "if this was a multioperationmessage and more than one of the processings returned LATER,
        // return the one with the lowest timeout:"
        // As multioperation is removed this can probably be simplified?
        DocumentProcessor.LaterProgress shortestDelay = (DocumentProcessor.LaterProgress) later.get(0).first;
        for (Tuple2<DocumentProcessor.Progress, Processing> tuple : later) {
            // re-add the LATER one to processings
            processings.add(tuple.second);
            // check to see if this one had a lower timeout than the previous one:
            if (((DocumentProcessor.LaterProgress) tuple.first).getDelay() < shortestDelay.getDelay()) {
                shortestDelay = (DocumentProcessor.LaterProgress) tuple.first;
            }
        }
        return shortestDelay;
    } else {
        requestContext.processingDone(processingsDone);
        return DocumentProcessor.Progress.DONE;
    }
}
Also used : Call(com.yahoo.docproc.Call) DocumentProcessor(com.yahoo.docproc.DocumentProcessor) CallStack(com.yahoo.docproc.CallStack) ArrayList(java.util.ArrayList) HandledProcessingException(com.yahoo.docproc.HandledProcessingException) TimeoutException(java.util.concurrent.TimeoutException) Processing(com.yahoo.docproc.Processing) Tuple2(com.yahoo.collections.Tuple2)

Aggregations

Call (com.yahoo.docproc.Call)3 DocumentProcessor (com.yahoo.docproc.DocumentProcessor)3 Pair (com.yahoo.collections.Pair)2 Document (com.yahoo.document.Document)2 DocumentPut (com.yahoo.document.DocumentPut)2 HashMap (java.util.HashMap)2 Tuple2 (com.yahoo.collections.Tuple2)1 CallStack (com.yahoo.docproc.CallStack)1 HandledProcessingException (com.yahoo.docproc.HandledProcessingException)1 Processing (com.yahoo.docproc.Processing)1 ArrayList (java.util.ArrayList)1 TimeoutException (java.util.concurrent.TimeoutException)1