summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2024-04-03 13:52:24 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2024-04-03 14:13:18 +0200
commit24ac29674068851453b9519299d59904c4395d74 (patch)
tree86bdf901ee948358a9935b1e914522b5916bb929
parenta009cdd704f427282c3c9ed3b70a7caf9d536c7e (diff)
Add 'sleep' and 'busy_wait' as index expressions for testing of feed throttling.
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ExpressionOptimizer.java19
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/BusyWaitExpression.java43
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/EchoExpression.java13
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SleepExpression.java36
-rw-r--r--indexinglanguage/src/main/javacc/IndexingParser.jj18
5 files changed, 118 insertions, 11 deletions
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ExpressionOptimizer.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ExpressionOptimizer.java
index bad8b94d074..a66c47caa85 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ExpressionOptimizer.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/ExpressionOptimizer.java
@@ -1,7 +1,22 @@
// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.indexinglanguage;
-import com.yahoo.vespa.indexinglanguage.expressions.*;
+
+import com.yahoo.vespa.indexinglanguage.expressions.CompositeExpression;
+import com.yahoo.vespa.indexinglanguage.expressions.ConstantExpression;
+import com.yahoo.vespa.indexinglanguage.expressions.EchoExpression;
+import com.yahoo.vespa.indexinglanguage.expressions.Expression;
+import com.yahoo.vespa.indexinglanguage.expressions.ForEachExpression;
+import com.yahoo.vespa.indexinglanguage.expressions.GetVarExpression;
+import com.yahoo.vespa.indexinglanguage.expressions.HostNameExpression;
+import com.yahoo.vespa.indexinglanguage.expressions.InputExpression;
+import com.yahoo.vespa.indexinglanguage.expressions.NowExpression;
+import com.yahoo.vespa.indexinglanguage.expressions.OutputExpression;
+import com.yahoo.vespa.indexinglanguage.expressions.RandomExpression;
+import com.yahoo.vespa.indexinglanguage.expressions.ScriptExpression;
+import com.yahoo.vespa.indexinglanguage.expressions.SetVarExpression;
+import com.yahoo.vespa.indexinglanguage.expressions.StatementExpression;
+import com.yahoo.vespa.indexinglanguage.expressions.SwitchExpression;
import java.util.ArrayList;
import java.util.List;
@@ -59,7 +74,7 @@ public class ExpressionOptimizer extends ExpressionConverter {
}
static boolean ignoresInput(Expression exp) {
- if (exp instanceof SwitchExpression || exp instanceof ScriptExpression || exp instanceof ForEachExpression ) {
+ if (exp instanceof SwitchExpression || exp instanceof ScriptExpression || exp instanceof ForEachExpression) {
return false; // Switch and script never ignores input.
}
if (exp instanceof CompositeExpression) {
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/BusyWaitExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/BusyWaitExpression.java
new file mode 100644
index 00000000000..068aa1421f7
--- /dev/null
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/BusyWaitExpression.java
@@ -0,0 +1,43 @@
+package com.yahoo.vespa.indexinglanguage.expressions;
+
+import com.yahoo.document.DataType;
+import com.yahoo.document.datatypes.FieldValue;
+import com.yahoo.document.datatypes.NumericFieldValue;
+
+/**
+ * Utility expression that will sleep the amount of time given in the numeric field.
+ * Non-numeric fields will be ignored
+ * @author baldersheim
+ */
+public final class BusyWaitExpression extends Expression {
+ public BusyWaitExpression() {
+ super(UnresolvedDataType.INSTANCE);
+ }
+
+ private static double nihlakanta(int i) {
+ long a = 2 + i * 4L;
+ return (24 * (a+2))/(double)(a*(a+1)*(a+2)*(a+3));
+ }
+
+ @Override
+ protected void doExecute(ExecutionContext context) {
+ FieldValue value = context.getValue();
+ if (value instanceof NumericFieldValue num) {
+ double napSecs = num.getNumber().doubleValue();
+ long doom = System.nanoTime() + (long)(1_000_000_000.0 * napSecs);
+ while (doom > System.nanoTime()) {
+ double pi = 3;
+ for (int i = 0; i < 1000; i++) {
+ pi += nihlakanta(i);
+ }
+ context.getCache().put("Busy wait computing pi and store it to avoid jit optiming it away", pi);
+ }
+ }
+ }
+
+ @Override protected void doVerify(VerificationContext context) { }
+ @Override public DataType createdOutputType() { return null; }
+ @Override public String toString() { return "sleep"; }
+ @Override public boolean equals(Object obj) { return obj instanceof BusyWaitExpression; }
+ @Override public int hashCode() { return getClass().hashCode(); }
+}
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/EchoExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/EchoExpression.java
index 690e7415801..4001e2a6fd0 100644
--- a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/EchoExpression.java
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/EchoExpression.java
@@ -27,7 +27,7 @@ public final class EchoExpression extends Expression {
@Override
protected void doExecute(ExecutionContext context) {
- out.println(String.valueOf(context.getValue()));
+ out.println(context.getValue());
}
@Override
@@ -47,14 +47,9 @@ public final class EchoExpression extends Expression {
@Override
public boolean equals(Object obj) {
- if (!(obj instanceof EchoExpression)) {
- return false;
- }
- EchoExpression rhs = (EchoExpression)obj;
- if (out != rhs.out) {
- return false;
- }
- return true;
+ if (!(obj instanceof EchoExpression rhs)) return false;
+
+ return out == rhs.out;
}
@Override
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SleepExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SleepExpression.java
new file mode 100644
index 00000000000..f7216fc1c97
--- /dev/null
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/SleepExpression.java
@@ -0,0 +1,36 @@
+package com.yahoo.vespa.indexinglanguage.expressions;
+
+import com.yahoo.document.DataType;
+import com.yahoo.document.datatypes.FieldValue;
+import com.yahoo.document.datatypes.NumericFieldValue;
+
+/**
+ * Utility expression that will sleep the amount of time given in the numeric field.
+ * Non-numeric fields will be ignored
+ * @author baldersheim
+ */
+public final class SleepExpression extends Expression {
+ public SleepExpression() {
+ super(UnresolvedDataType.INSTANCE);
+ }
+
+ @Override
+ protected void doExecute(ExecutionContext context) {
+ FieldValue value = context.getValue();
+ if (value instanceof NumericFieldValue num) {
+ double napSecs = num.getNumber().doubleValue();
+ long nanos = (long)(napSecs*1_000_000_000.0);
+ try {
+ Thread.sleep(nanos / 1_000_000, (int) (nanos % 1_000_000));
+ } catch (InterruptedException e) {
+ // Do nothing
+ }
+ }
+ }
+
+ @Override protected void doVerify(VerificationContext context) { }
+ @Override public DataType createdOutputType() { return null; }
+ @Override public String toString() { return "sleep"; }
+ @Override public boolean equals(Object obj) { return obj instanceof SleepExpression; }
+ @Override public int hashCode() { return getClass().hashCode(); }
+}
diff --git a/indexinglanguage/src/main/javacc/IndexingParser.jj b/indexinglanguage/src/main/javacc/IndexingParser.jj
index a3b4039408a..469d96ead60 100644
--- a/indexinglanguage/src/main/javacc/IndexingParser.jj
+++ b/indexinglanguage/src/main/javacc/IndexingParser.jj
@@ -149,6 +149,7 @@ TOKEN :
<ATTRIBUTE: "attribute"> |
<BASE64_DECODE: "base64decode"> |
<BASE64_ENCODE: "base64encode"> |
+ <BUSY_WAIT: "busy_wait"> |
<CASE: "case"> |
<CASE_DEFAULT: "default"> |
<CLEAR_STATE: "clear_state"> |
@@ -183,6 +184,7 @@ TOKEN :
<SELECT_INPUT: "select_input"> |
<SET_LANGUAGE: "set_language"> |
<SET_VAR: "set_var"> |
+ <SLEEP: "sleep"> |
<SPLIT: "split"> |
<STEM: "stem"> |
<SUBSTRING: "substring"> |
@@ -296,6 +298,7 @@ Expression value() :
( val = attributeExp() |
val = base64DecodeExp() |
val = base64EncodeExp() |
+ val = busy_waitExp() |
val = clearStateExp() |
val = echoExp() |
val = embedExp() |
@@ -325,6 +328,7 @@ Expression value() :
val = setLanguageExp() |
val = setValueExp() |
val = setVarExp() |
+ val = sleepExp() |
val = splitExp() |
val = substringExp() |
val = summaryExp() |
@@ -371,6 +375,12 @@ Expression base64EncodeExp() : { }
{ return new Base64EncodeExpression(); }
}
+Expression busy_waitExp() : { }
+{
+ ( <BUSY_WAIT> )
+ { return new BusyWaitExpression(); }
+}
+
Expression clearStateExp() : { }
{
( <CLEAR_STATE> )
@@ -608,6 +618,12 @@ Expression setVarExp() :
{ return new SetVarExpression(val); }
}
+Expression sleepExp() : { }
+{
+ ( <SLEEP> )
+ { return new SleepExpression(); }
+}
+
Expression splitExp() :
{
String val;
@@ -783,6 +799,7 @@ String identifier() :
( <ATTRIBUTE> |
<BASE64_DECODE> |
<BASE64_ENCODE> |
+ <BUSY_WAIT> |
<CASE> |
<CASE_DEFAULT> |
<CLEAR_STATE> |
@@ -817,6 +834,7 @@ String identifier() :
<SELECT_INPUT> |
<SET_LANGUAGE> |
<SET_VAR> |
+ <SLEEP> |
<SPLIT> |
<STEM> |
<SUBSTRING> |