From 094b9d8647b8ca7ff8478973c3cc14814606fdf1 Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Fri, 2 Feb 2018 13:21:08 +0100 Subject: Use a ResultObject to avoid using Exception for value passing. --- .../com/yahoo/prelude/fastsearch/FastSearcher.java | 7 ++- .../prelude/fastsearch/VespaBackEndSearcher.java | 60 +++++++++++++--------- .../streamingvisitors/VdsStreamingSearcher.java | 7 ++- 3 files changed, 47 insertions(+), 27 deletions(-) (limited to 'container-search') diff --git a/container-search/src/main/java/com/yahoo/prelude/fastsearch/FastSearcher.java b/container-search/src/main/java/com/yahoo/prelude/fastsearch/FastSearcher.java index 52650279ad5..6ce08c75dd4 100644 --- a/container-search/src/main/java/com/yahoo/prelude/fastsearch/FastSearcher.java +++ b/container-search/src/main/java/com/yahoo/prelude/fastsearch/FastSearcher.java @@ -317,7 +317,12 @@ public class FastSearcher extends VespaBackEndSearcher { int skippedHits; try { - skippedHits = fillHits(result, 0, receivedPackets, summaryClass); + FillHitsResult fillHitsResult = fillHits(result, 0, receivedPackets, summaryClass); + skippedHits = fillHitsResult.skippedHits; + if (fillHitsResult.error != null) { + result.hits().addError(ErrorMessage.createTimeout(fillHitsResult.error)); + return; + } } catch (TimeoutException e) { result.hits().addError(ErrorMessage.createTimeout(e.getMessage())); return; diff --git a/container-search/src/main/java/com/yahoo/prelude/fastsearch/VespaBackEndSearcher.java b/container-search/src/main/java/com/yahoo/prelude/fastsearch/VespaBackEndSearcher.java index 51d50230ddc..4c0f3003981 100644 --- a/container-search/src/main/java/com/yahoo/prelude/fastsearch/VespaBackEndSearcher.java +++ b/container-search/src/main/java/com/yahoo/prelude/fastsearch/VespaBackEndSearcher.java @@ -471,29 +471,44 @@ public abstract class VespaBackEndSearcher extends PingableSearcher { } } - private boolean fillHit(FastHit hit, DocsumPacket packet, String summaryClass) throws TimeoutException { + static private class FillHitResult { + final boolean ok; + final String error; + FillHitResult(boolean ok) { + this(ok, null); + } + FillHitResult(boolean ok, String error) { + this.ok = ok; + this.error = error; + } + } + private FillHitResult fillHit(FastHit hit, DocsumPacket packet, String summaryClass) { if (packet != null) { byte[] docsumdata = packet.getData(); if (docsumdata.length > 0) { - String error = decodeSummary(summaryClass, hit, docsumdata); - if (error != null) { - throw new TimeoutException(error); - } - return true; + return new FillHitResult(true, decodeSummary(summaryClass, hit, docsumdata)); } } - return false; + return new FillHitResult(false); } + static protected class FillHitsResult { + public final int skippedHits; + public final String error; + FillHitsResult(int skippedHits, String error) { + this.skippedHits = skippedHits; + this.error = error; + } + } /** * Fills the hits. * * @return the number of hits that we did not return data for, i.e * when things are working normally we return 0. */ - protected int fillHits(Result result, int packetIndex, Packet[] packets, String summaryClass) throws IOException { + protected FillHitsResult fillHits(Result result, int packetIndex, Packet[] packets, String summaryClass) throws IOException { int skippedHits=0; - TimeoutException lastException = null; + String lastError = null; for (Iterator i = hitIterator(result); i.hasNext();) { Hit hit = i.next(); @@ -504,22 +519,19 @@ public abstract class VespaBackEndSearcher extends PingableSearcher { DocsumPacket docsum = (DocsumPacket) packets[packetIndex]; packetIndex++; - try { - if (!fillHit(fastHit, docsum, summaryClass)) - skippedHits++; - } catch (TimeoutException e) { - result.hits().addError(ErrorMessage.createTimeout(e.getMessage())); + FillHitResult fr = fillHit(fastHit, docsum, summaryClass); + if ( ! fr.ok ) { + skippedHits++; + } + if (fr.error != null) { + result.hits().addError(ErrorMessage.createTimeout(fr.error)); skippedHits++; - lastException = e; + lastError = fr.error; } } } result.hits().setSorted(false); - if (lastException != null) { - throw lastException; - } - - return skippedHits; + return new FillHitsResult(skippedHits, lastError); } /** @@ -612,11 +624,9 @@ public abstract class VespaBackEndSearcher extends PingableSearcher { FastHit fastHit = (FastHit) hit; DocsumPacketKey key = new DocsumPacketKey(fastHit.getGlobalId(), fastHit.getPartId(), summaryClass); - try { - if (fillHit(fastHit, (DocsumPacket) packetWrapper.getPacket(key), summaryClass)) { - fastHit.setCached(true); - } - } catch (TimeoutException e) { } + if (fillHit(fastHit, (DocsumPacket) packetWrapper.getPacket(key), summaryClass).ok) { + fastHit.setCached(true); + } } } diff --git a/container-search/src/main/java/com/yahoo/vespa/streamingvisitors/VdsStreamingSearcher.java b/container-search/src/main/java/com/yahoo/vespa/streamingvisitors/VdsStreamingSearcher.java index fbdb4511964..4ebe29cdacd 100644 --- a/container-search/src/main/java/com/yahoo/vespa/streamingvisitors/VdsStreamingSearcher.java +++ b/container-search/src/main/java/com/yahoo/vespa/streamingvisitors/VdsStreamingSearcher.java @@ -194,7 +194,12 @@ public class VdsStreamingSearcher extends VespaBackEndSearcher { int skippedHits; try { - skippedHits = fillHits(result, 0, summaryPackets, query.getPresentation().getSummary()); + FillHitsResult fillHitsResult = fillHits(result, 0, summaryPackets, query.getPresentation().getSummary()); + skippedHits = fillHitsResult.skippedHits; + if (fillHitsResult.error != null) { + result.hits().addError(ErrorMessage.createTimeout(fillHitsResult.error)); + return result; + } } catch (TimeoutException e) { result.hits().addError(ErrorMessage.createTimeout(e.getMessage())); return result; -- cgit v1.2.3