Skip to content

Commit c0559ec

Browse files
authored
Treat big changes in searchCount as significant and persist the document after such changes (#44413)
1 parent 0f7abd8 commit c0559ec

File tree

3 files changed

+36
-12
lines changed

3 files changed

+36
-12
lines changed

x-pack/plugin/ml/qa/native-multi-node-tests/src/test/java/org/elasticsearch/xpack/ml/integration/DatafeedJobsIT.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,6 @@
3939
import java.util.concurrent.TimeUnit;
4040
import java.util.concurrent.atomic.AtomicReference;
4141

42-
import org.apache.lucene.util.LuceneTestCase.AwaitsFix;
43-
4442
import static org.elasticsearch.xpack.ml.support.BaseMlIntegTestCase.createDatafeed;
4543
import static org.elasticsearch.xpack.ml.support.BaseMlIntegTestCase.createDatafeedBuilder;
4644
import static org.elasticsearch.xpack.ml.support.BaseMlIntegTestCase.createScheduledJob;
@@ -102,7 +100,6 @@ public void testLookbackOnly() throws Exception {
102100
waitUntilJobIsClosed(job.getId());
103101
}
104102

105-
@AwaitsFix(bugUrl = "https://github.com/elastic/elasticsearch/issues/44335")
106103
public void testDatafeedTimingStats_DatafeedRecreated() throws Exception {
107104
client().admin().indices().prepareCreate("data")
108105
.addMapping("type", "time", "type=date")

x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/datafeed/DatafeedTimingStatsReporter.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,20 @@ private void flush() {
7777
* Returns true if given stats objects differ from each other by more than 10% for at least one of the statistics.
7878
*/
7979
public static boolean differSignificantly(DatafeedTimingStats stats1, DatafeedTimingStats stats2) {
80-
return differSignificantly(stats1.getTotalSearchTimeMs(), stats2.getTotalSearchTimeMs())
80+
return countsDifferSignificantly(stats1.getSearchCount(), stats2.getSearchCount())
81+
|| differSignificantly(stats1.getTotalSearchTimeMs(), stats2.getTotalSearchTimeMs())
8182
|| differSignificantly(stats1.getAvgSearchTimePerBucketMs(), stats2.getAvgSearchTimePerBucketMs());
8283
}
8384

85+
/**
86+
* Returns {@code true} if one of the ratios { value1 / value2, value2 / value1 } is smaller than MIN_VALID_RATIO.
87+
* This can be interpreted as values { value1, value2 } differing significantly from each other.
88+
*/
89+
private static boolean countsDifferSignificantly(long value1, long value2) {
90+
return (((double) value2) / value1 < MIN_VALID_RATIO)
91+
|| (((double) value1) / value2 < MIN_VALID_RATIO);
92+
}
93+
8494
/**
8595
* Returns {@code true} if one of the ratios { value1 / value2, value2 / value1 } is smaller than MIN_VALID_RATIO or
8696
* the absolute difference |value1 - value2| is greater than MAX_VALID_ABS_DIFFERENCE_MS.

x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/datafeed/DatafeedTimingStatsReporterTests.java

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import static org.hamcrest.Matchers.is;
1919
import static org.mockito.Mockito.inOrder;
2020
import static org.mockito.Mockito.mock;
21+
import static org.mockito.Mockito.verify;
2122
import static org.mockito.Mockito.verifyNoMoreInteractions;
2223
import static org.mockito.Mockito.verifyZeroInteractions;
2324

@@ -44,28 +45,40 @@ public void testReportSearchDuration_Null() {
4445
verifyZeroInteractions(jobResultsPersister);
4546
}
4647

48+
public void testReportSearchDuration_Zero() {
49+
DatafeedTimingStatsReporter timingStatsReporter =
50+
new DatafeedTimingStatsReporter(new DatafeedTimingStats(JOB_ID), jobResultsPersister);
51+
assertThat(timingStatsReporter.getCurrentTimingStats(), equalTo(new DatafeedTimingStats(JOB_ID, 0, 0, 0.0)));
52+
53+
timingStatsReporter.reportSearchDuration(TimeValue.ZERO);
54+
assertThat(timingStatsReporter.getCurrentTimingStats(), equalTo(new DatafeedTimingStats(JOB_ID, 1, 0, 0.0)));
55+
56+
verify(jobResultsPersister).persistDatafeedTimingStats(new DatafeedTimingStats(JOB_ID, 1, 0, 0.0), RefreshPolicy.IMMEDIATE);
57+
verifyNoMoreInteractions(jobResultsPersister);
58+
}
59+
4760
public void testReportSearchDuration() {
4861
DatafeedTimingStatsReporter timingStatsReporter =
49-
new DatafeedTimingStatsReporter(new DatafeedTimingStats(JOB_ID, 3, 10, 10000.0), jobResultsPersister);
50-
assertThat(timingStatsReporter.getCurrentTimingStats(), equalTo(new DatafeedTimingStats(JOB_ID, 3, 10, 10000.0)));
62+
new DatafeedTimingStatsReporter(new DatafeedTimingStats(JOB_ID, 13, 10, 10000.0), jobResultsPersister);
63+
assertThat(timingStatsReporter.getCurrentTimingStats(), equalTo(new DatafeedTimingStats(JOB_ID, 13, 10, 10000.0)));
5164

5265
timingStatsReporter.reportSearchDuration(ONE_SECOND);
53-
assertThat(timingStatsReporter.getCurrentTimingStats(), equalTo(new DatafeedTimingStats(JOB_ID, 4, 10, 11000.0)));
66+
assertThat(timingStatsReporter.getCurrentTimingStats(), equalTo(new DatafeedTimingStats(JOB_ID, 14, 10, 11000.0)));
5467

5568
timingStatsReporter.reportSearchDuration(ONE_SECOND);
56-
assertThat(timingStatsReporter.getCurrentTimingStats(), equalTo(new DatafeedTimingStats(JOB_ID, 5, 10, 12000.0)));
69+
assertThat(timingStatsReporter.getCurrentTimingStats(), equalTo(new DatafeedTimingStats(JOB_ID, 15, 10, 12000.0)));
5770

5871
timingStatsReporter.reportSearchDuration(ONE_SECOND);
59-
assertThat(timingStatsReporter.getCurrentTimingStats(), equalTo(new DatafeedTimingStats(JOB_ID, 6, 10, 13000.0)));
72+
assertThat(timingStatsReporter.getCurrentTimingStats(), equalTo(new DatafeedTimingStats(JOB_ID, 16, 10, 13000.0)));
6073

6174
timingStatsReporter.reportSearchDuration(ONE_SECOND);
62-
assertThat(timingStatsReporter.getCurrentTimingStats(), equalTo(new DatafeedTimingStats(JOB_ID, 7, 10, 14000.0)));
75+
assertThat(timingStatsReporter.getCurrentTimingStats(), equalTo(new DatafeedTimingStats(JOB_ID, 17, 10, 14000.0)));
6376

6477
InOrder inOrder = inOrder(jobResultsPersister);
6578
inOrder.verify(jobResultsPersister).persistDatafeedTimingStats(
66-
new DatafeedTimingStats(JOB_ID, 5, 10, 12000.0), RefreshPolicy.IMMEDIATE);
79+
new DatafeedTimingStats(JOB_ID, 15, 10, 12000.0), RefreshPolicy.IMMEDIATE);
6780
inOrder.verify(jobResultsPersister).persistDatafeedTimingStats(
68-
new DatafeedTimingStats(JOB_ID, 7, 10, 14000.0), RefreshPolicy.IMMEDIATE);
81+
new DatafeedTimingStats(JOB_ID, 17, 10, 14000.0), RefreshPolicy.IMMEDIATE);
6982
verifyNoMoreInteractions(jobResultsPersister);
7083
}
7184

@@ -134,5 +147,9 @@ public void testTimingStatsDifferSignificantly() {
134147
DatafeedTimingStatsReporter.differSignificantly(
135148
new DatafeedTimingStats(JOB_ID, 5, 10, 100000.0), new DatafeedTimingStats(JOB_ID, 5, 10, 110001.0)),
136149
is(true));
150+
assertThat(
151+
DatafeedTimingStatsReporter.differSignificantly(
152+
new DatafeedTimingStats(JOB_ID, 5, 10, 100000.0), new DatafeedTimingStats(JOB_ID, 50, 10, 100000.0)),
153+
is(true));
137154
}
138155
}

0 commit comments

Comments
 (0)