Indices API: Fix wrong search stats groups
This provides a fix to issue #7644. A new Stats object must be created, and not a reference to the retrieved stats, before we can add stats to it. Otherwise, we would keep on adding to the same object on subsequent calls to IndicesStatsResponse#getPrimaries() or IndicesStatsResponse#getTotal(). Closes #7644 and #8950
This commit is contained in:
parent
54f2eae4d8
commit
dda33155d6
|
@ -60,6 +60,10 @@ public class SearchStats implements Streamable, ToXContent {
|
|||
this.fetchCurrent = fetchCurrent;
|
||||
}
|
||||
|
||||
public Stats(Stats stats) {
|
||||
this(stats.queryCount, stats.queryTimeInMillis, stats.queryCurrent, stats.fetchCount, stats.fetchTimeInMillis, stats.fetchCurrent);
|
||||
}
|
||||
|
||||
public void add(Stats stats) {
|
||||
queryCount += stats.queryCount;
|
||||
queryTimeInMillis += stats.queryTimeInMillis;
|
||||
|
@ -178,7 +182,7 @@ public class SearchStats implements Streamable, ToXContent {
|
|||
for (Map.Entry<String, Stats> entry : searchStats.groupStats.entrySet()) {
|
||||
Stats stats = groupStats.get(entry.getKey());
|
||||
if (stats == null) {
|
||||
groupStats.put(entry.getKey(), entry.getValue());
|
||||
groupStats.put(entry.getKey(), new Stats(entry.getValue()));
|
||||
} else {
|
||||
stats.add(entry.getValue());
|
||||
}
|
||||
|
|
|
@ -0,0 +1,66 @@
|
|||
/*
|
||||
* Licensed to Elasticsearch under one or more contributor
|
||||
* license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright
|
||||
* ownership. Elasticsearch licenses this file to you under
|
||||
* the Apache License, Version 2.0 (the "License"); you may
|
||||
* not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.elasticsearch.search.stats;
|
||||
|
||||
import org.elasticsearch.index.search.stats.SearchStats;
|
||||
import org.elasticsearch.index.search.stats.SearchStats.Stats;
|
||||
import org.elasticsearch.test.ElasticsearchTestCase;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class SearchStatsUnitTests extends ElasticsearchTestCase {
|
||||
|
||||
@Test
|
||||
// https://github.com/elasticsearch/elasticsearch/issues/7644
|
||||
public void testShardLevelSearchGroupStats() throws Exception {
|
||||
// let's create two dummy search stats with groups
|
||||
Map<String, Stats> groupStats1 = new HashMap<>();
|
||||
Map<String, Stats> groupStats2 = new HashMap<>();
|
||||
groupStats2.put("group1", new Stats(1, 1, 1, 1, 1, 1));
|
||||
SearchStats searchStats1 = new SearchStats(new Stats(1, 1, 1, 1, 1, 1), 0, groupStats1);
|
||||
SearchStats searchStats2 = new SearchStats(new Stats(1, 1, 1, 1, 1, 1), 0, groupStats2);
|
||||
|
||||
// adding these two search stats and checking group stats are correct
|
||||
searchStats1.add(searchStats2);
|
||||
assertStats(groupStats1.get("group1"), 1);
|
||||
|
||||
// another call, adding again ...
|
||||
searchStats1.add(searchStats2);
|
||||
assertStats(groupStats1.get("group1"), 2);
|
||||
|
||||
// making sure stats2 was not affected (this would previously return 2!)
|
||||
assertStats(groupStats2.get("group1"), 1);
|
||||
|
||||
// adding again would then return wrong search stats (would return 4! instead of 3)
|
||||
searchStats1.add(searchStats2);
|
||||
assertStats(groupStats1.get("group1"), 3);
|
||||
}
|
||||
|
||||
private void assertStats(Stats stats, long equalTo) {
|
||||
assertEquals(equalTo, stats.getQueryCount());
|
||||
assertEquals(equalTo, stats.getQueryTimeInMillis());
|
||||
assertEquals(equalTo, stats.getQueryCurrent());
|
||||
assertEquals(equalTo, stats.getFetchCount());
|
||||
assertEquals(equalTo, stats.getFetchTimeInMillis());
|
||||
assertEquals(equalTo, stats.getFetchCurrent());
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue