summaryrefslogtreecommitdiffstats
path: root/container-search
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2017-08-17 12:02:54 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2017-08-17 12:02:54 +0200
commit5c02907d07d6f1fad744979fc9a36a79b1d80650 (patch)
tree27d79302aa398e8bd931f64e34d4a2156aae2cbd /container-search
parent490cdebe067f598055648009327a463e68bdfc44 (diff)
Use your own rankprofile, and avoid breaking public API.
Diffstat (limited to 'container-search')
-rw-r--r--container-search/src/main/java/com/yahoo/fs4/GetDocSumsPacket.java2
-rw-r--r--container-search/src/main/java/com/yahoo/fs4/QueryPacket.java2
-rw-r--r--container-search/src/main/java/com/yahoo/search/Query.java31
-rw-r--r--container-search/src/main/java/com/yahoo/search/dispatch/Dispatcher.java6
-rw-r--r--container-search/src/main/java/com/yahoo/search/grouping/vespa/GroupingExecutor.java2
-rw-r--r--container-search/src/main/java/com/yahoo/search/query/SessionId.java24
-rw-r--r--container-search/src/main/java/com/yahoo/search/query/UniqueRequestId.java28
-rw-r--r--container-search/src/test/java/com/yahoo/fs4/test/GetDocSumsPacketTestCase.java2
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);