diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2017-08-17 12:02:54 +0200 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2017-08-17 12:02:54 +0200 |
commit | 5c02907d07d6f1fad744979fc9a36a79b1d80650 (patch) | |
tree | 27d79302aa398e8bd931f64e34d4a2156aae2cbd /container-search | |
parent | 490cdebe067f598055648009327a463e68bdfc44 (diff) |
Use your own rankprofile, and avoid breaking public API.
Diffstat (limited to 'container-search')
8 files changed, 60 insertions, 37 deletions
diff --git a/container-search/src/main/java/com/yahoo/fs4/GetDocSumsPacket.java b/container-search/src/main/java/com/yahoo/fs4/GetDocSumsPacket.java index 3bfa2ebe3af..a40f5d55317 100644 --- a/container-search/src/main/java/com/yahoo/fs4/GetDocSumsPacket.java +++ b/container-search/src/main/java/com/yahoo/fs4/GetDocSumsPacket.java @@ -77,7 +77,7 @@ public class GetDocSumsPacket extends Packet { boolean useQueryCache = query.getRanking().getQueryCache(); // If feature cache is used we need to include the sessionId as key. if (useQueryCache) { // TODO: Move this decision (and the key) to ranking - query.getRanking().getProperties().put(sessionIdKey, query.getSessionId(query.getRanking().getProfile(), false).toString()); + query.getRanking().getProperties().put(sessionIdKey, query.getSessionId(false).toString()); } // always allow slime docsums diff --git a/container-search/src/main/java/com/yahoo/fs4/QueryPacket.java b/container-search/src/main/java/com/yahoo/fs4/QueryPacket.java index 07b8f03fe15..4901647be65 100644 --- a/container-search/src/main/java/com/yahoo/fs4/QueryPacket.java +++ b/container-search/src/main/java/com/yahoo/fs4/QueryPacket.java @@ -149,7 +149,7 @@ public class QueryPacket extends Packet { } if (sendSessionKey) { - Utf8String key = query.getSessionId(query.getRanking().getProfile(), true); + Utf8String key = query.getSessionId(true).asUtf8String(); buffer.putInt(key.getByteLength()); buffer.put(key.getBytes()); } diff --git a/container-search/src/main/java/com/yahoo/search/Query.java b/container-search/src/main/java/com/yahoo/search/Query.java index 2692cd824c1..555044f66d0 100644 --- a/container-search/src/main/java/com/yahoo/search/Query.java +++ b/container-search/src/main/java/com/yahoo/search/Query.java @@ -12,15 +12,9 @@ import com.yahoo.prelude.query.Highlight; import com.yahoo.prelude.query.QueryException; import com.yahoo.prelude.query.textualrepresentation.TextualQueryRepresentation; import com.yahoo.processing.request.CompoundName; +import com.yahoo.search.query.*; import com.yahoo.search.query.profile.types.FieldType; import com.yahoo.search.query.properties.PropertyMap; -import com.yahoo.search.query.Model; -import com.yahoo.search.query.ParameterParser; -import com.yahoo.search.query.Presentation; -import com.yahoo.search.query.QueryTree; -import com.yahoo.search.query.Ranking; -import com.yahoo.search.query.SessionId; -import com.yahoo.search.query.Sorting; import com.yahoo.search.query.profile.compiled.CompiledQueryProfileRegistry; import com.yahoo.search.query.profile.types.FieldDescription; import com.yahoo.search.query.profile.types.QueryProfileFieldType; @@ -33,7 +27,6 @@ import com.yahoo.search.query.properties.RequestContextProperties; import com.yahoo.text.Utf8String; import com.yahoo.yolean.Exceptions; import com.yahoo.search.federation.FederationSearcher; -import com.yahoo.search.query.Properties; import com.yahoo.search.query.Sorting.AttributeSorter; import com.yahoo.search.query.Sorting.FieldOrder; import com.yahoo.search.query.Sorting.Order; @@ -56,6 +49,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.atomic.AtomicReference; import java.util.logging.Logger; /** @@ -163,7 +157,7 @@ public class Query extends com.yahoo.processing.Request implements Cloneable { private QueryContext context = null; /** Used for downstream session caches */ - private SessionId sessionId = null; + private final AtomicReference<UniqueRequestId> sessionId = new AtomicReference<>(); //--------------- Owned sub-objects containing query properties ---------------- @@ -971,12 +965,19 @@ public class Query extends com.yahoo.processing.Request implements Cloneable { * @param create if true this is created if not already set * @return the session id of this query, or null if not set and create is false */ - public Utf8String getSessionId(String rankProfile, boolean create) { - if (sessionId == null && create) - this.sessionId = SessionId.next(); - return sessionId != null - ? new Utf8String(sessionId.toString() + "." + ((rankProfile != null) ? rankProfile : "")) - : null; + public SessionId getSessionId(boolean create) { + UniqueRequestId uniqId = sessionId.get(); + if (uniqId == null && ! create) return null; + + if (uniqId == null && create) { + uniqId = UniqueRequestId.next(); + sessionId.compareAndSet(null, uniqId); + uniqId = sessionId.get(); + } + + String rankProfile = getRanking().getProfile(); + + return new SessionId(uniqId, rankProfile); } public boolean hasEncodableProperties() { diff --git a/container-search/src/main/java/com/yahoo/search/dispatch/Dispatcher.java b/container-search/src/main/java/com/yahoo/search/dispatch/Dispatcher.java index 1ff7757733b..003ba9a5261 100644 --- a/container-search/src/main/java/com/yahoo/search/dispatch/Dispatcher.java +++ b/container-search/src/main/java/com/yahoo/search/dispatch/Dispatcher.java @@ -119,21 +119,21 @@ public class Dispatcher extends AbstractComponent { Query query = result.getQuery(); String rankProfile = query.getRanking().getProfile(); - byte[] serializedSlime = BinaryFormat.encode(toSlime(rankProfile, summaryClass, query.getSessionId(rankProfile, false), hits)); + byte[] serializedSlime = BinaryFormat.encode(toSlime(rankProfile, summaryClass, query.getSessionId(false), hits)); double timeoutSeconds = ((double)query.getTimeLeft()-3.0)/1000.0; Compressor.Compression compressionResult = compressor.compress(compression, serializedSlime); client.getDocsums(hits, node, compressionResult.type(), serializedSlime.length, compressionResult.data(), responseReceiver, timeoutSeconds); } - static private Slime toSlime(String rankProfile, String summaryClass, Utf8String sessionId, List<FastHit> hits) { + static private Slime toSlime(String rankProfile, String summaryClass, SessionId sessionId, List<FastHit> hits) { Slime slime = new Slime(); Cursor root = slime.setObject(); if (summaryClass != null) { root.setString("class", summaryClass); } if (sessionId != null) { - root.setData("sessionid", sessionId.getBytes()); + root.setData("sessionid", sessionId.asUtf8String().getBytes()); } if (rankProfile != null) { root.setString("ranking", rankProfile); diff --git a/container-search/src/main/java/com/yahoo/search/grouping/vespa/GroupingExecutor.java b/container-search/src/main/java/com/yahoo/search/grouping/vespa/GroupingExecutor.java index ceba6e506b5..1661283f060 100644 --- a/container-search/src/main/java/com/yahoo/search/grouping/vespa/GroupingExecutor.java +++ b/container-search/src/main/java/com/yahoo/search/grouping/vespa/GroupingExecutor.java @@ -225,7 +225,7 @@ public class GroupingExecutor extends Searcher { baseRoot = origRoot.clone(); } if (query.isTraceable(3) && query.getGroupingSessionCache()) { - query.trace("Grouping in " + (lastPass + 1) + " passes. SessionId='" + query.getSessionId(query.getRanking().getProfile(), true) + "'.", 3); + query.trace("Grouping in " + (lastPass + 1) + " passes. SessionId='" + query.getSessionId(true) + "'.", 3); } for (int pass = 0; pass <= lastPass; ++pass) { boolean firstPass = (pass == 0); diff --git a/container-search/src/main/java/com/yahoo/search/query/SessionId.java b/container-search/src/main/java/com/yahoo/search/query/SessionId.java index b4b844961f6..38fdadd7c59 100644 --- a/container-search/src/main/java/com/yahoo/search/query/SessionId.java +++ b/container-search/src/main/java/com/yahoo/search/query/SessionId.java @@ -1,7 +1,8 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.search.query; -import com.yahoo.container.Server; +import com.yahoo.text.Utf8String; + import java.util.concurrent.atomic.AtomicLong; /** @@ -12,23 +13,16 @@ import java.util.concurrent.atomic.AtomicLong; */ public class SessionId { - private static final String serverId = Server.get().getServerDiscriminator(); - private static final AtomicLong sequenceCounter = new AtomicLong(); - - private final String id; + private final Utf8String id; - private SessionId(String serverId, long timestamp, long sequence) { - this.id = serverId + "." + timestamp + "." + sequence; + public SessionId(UniqueRequestId requestId, String extraDifferentiator) { + this.id = new Utf8String(requestId.toString() + "." + extraDifferentiator); } - public String toString() { return id; } - - /** - * Creates a session id which is unique across the cluster this runtime is a member of each time this is called. - * Calling this causes synchronization. - */ - public static SessionId next() { - return new SessionId(serverId, System.currentTimeMillis(), sequenceCounter.getAndIncrement()); + @Override + public String toString() { + return id.toString(); } + public Utf8String asUtf8String() { return id; } } diff --git a/container-search/src/main/java/com/yahoo/search/query/UniqueRequestId.java b/container-search/src/main/java/com/yahoo/search/query/UniqueRequestId.java new file mode 100644 index 00000000000..2d29edb818d --- /dev/null +++ b/container-search/src/main/java/com/yahoo/search/query/UniqueRequestId.java @@ -0,0 +1,28 @@ +package com.yahoo.search.query; + +import com.yahoo.container.Server; + +import java.util.concurrent.atomic.AtomicLong; + +public class UniqueRequestId { + + private static final String serverId = Server.get().getServerDiscriminator(); + private static final AtomicLong sequenceCounter = new AtomicLong(); + + private final String id; + + private UniqueRequestId(String serverId, long timestamp, long sequence) { + this.id = serverId + "." + timestamp + "." + sequence; + } + + @Override + public String toString() { return id; } + + /** + * Creates a session id which is unique across the cluster this runtime is a member of each time this is called. + * Calling this causes synchronization. + */ + public static UniqueRequestId next() { + return new UniqueRequestId(serverId, System.currentTimeMillis(), sequenceCounter.getAndIncrement()); + } +} diff --git a/container-search/src/test/java/com/yahoo/fs4/test/GetDocSumsPacketTestCase.java b/container-search/src/test/java/com/yahoo/fs4/test/GetDocSumsPacketTestCase.java index 6455e54d92b..ef77d19cdf6 100644 --- a/container-search/src/test/java/com/yahoo/fs4/test/GetDocSumsPacketTestCase.java +++ b/container-search/src/test/java/com/yahoo/fs4/test/GetDocSumsPacketTestCase.java @@ -65,7 +65,7 @@ public class GetDocSumsPacketTestCase { @Test public void requireThatSessionIdIsEncodedAsPropertyWhenUsingSearchSession() throws BufferTooSmallException { Result result = new Result(new Query("?query=foo")); - result.getQuery().getSessionId("",true); // create session id. + result.getQuery().getSessionId(true); // create session id. result.getQuery().getRanking().setQueryCache(true); FastHit hit = new FastHit(); result.hits().add(hit); |