Skip to content

Commit e66ea2c

Browse files
authored
Avoid logging duplicate deprecation warnings multiple times (#1660)
* Avoid logging duplicate deprecation warnings multiple times Signed-off-by: Vacha <vachshah@amazon.com> * Fixes test failures Signed-off-by: Vacha <vachshah@amazon.com> * Adding deprecation logger tests Signed-off-by: Vacha <vachshah@amazon.com> * Using ConcurrentHashMap keySet Signed-off-by: Vacha Shah <vachshah@amazon.com>
1 parent 10e51bb commit e66ea2c

84 files changed

Lines changed: 395 additions & 279 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

client/rest-high-level/src/test/java/org/opensearch/client/BulkProcessorIT.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,11 @@
8484

8585
public class BulkProcessorIT extends OpenSearchRestHighLevelClientTestCase {
8686

87+
@Override
88+
protected boolean enableWarningsCheck() {
89+
return false;
90+
}
91+
8792
private static BulkProcessor.Builder initBulkProcessorBuilder(BulkProcessor.Listener listener) {
8893
return BulkProcessor.builder(
8994
(request, bulkListener) -> highLevelClient().bulkAsync(request, RequestOptions.DEFAULT, bulkListener),
@@ -95,7 +100,7 @@ private static BulkProcessor.Builder initBulkProcessorBuilderUsingTypes(BulkProc
95100
return BulkProcessor.builder(
96101
(request, bulkListener) -> highLevelClient().bulkAsync(
97102
request,
98-
expectWarnings(RestBulkAction.TYPES_DEPRECATION_MESSAGE),
103+
expectWarningsOnce(RestBulkAction.TYPES_DEPRECATION_MESSAGE),
99104
bulkListener
100105
),
101106
listener
@@ -506,11 +511,6 @@ private MultiGetRequest indexDocs(
506511
} else {
507512
BytesArray data = bytesBulkRequest(localIndex, localType, i);
508513
processor.add(data, globalIndex, globalType, globalPipeline, XContentType.JSON);
509-
510-
if (localType != null) {
511-
// If the payload contains types, parsing it into a bulk request results in a warning.
512-
assertWarnings(RestBulkAction.TYPES_DEPRECATION_MESSAGE);
513-
}
514514
}
515515
multiGetRequest.add(localIndex, Integer.toString(i));
516516
}

client/rest-high-level/src/test/java/org/opensearch/client/BulkRequestWithGlobalParametersIT.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ private BulkResponse bulkWithTypes(BulkRequest request) throws IOException {
210210
request,
211211
highLevelClient()::bulk,
212212
highLevelClient()::bulkAsync,
213-
expectWarnings(RestBulkAction.TYPES_DEPRECATION_MESSAGE)
213+
expectWarningsOnce(RestBulkAction.TYPES_DEPRECATION_MESSAGE)
214214
);
215215
assertFalse(bulkResponse.hasFailures());
216216
return bulkResponse;

client/rest-high-level/src/test/java/org/opensearch/client/CrudIT.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -214,15 +214,15 @@ public void testDeleteWithTypes() throws IOException {
214214
indexRequest,
215215
highLevelClient()::index,
216216
highLevelClient()::indexAsync,
217-
expectWarnings(RestIndexAction.TYPES_DEPRECATION_MESSAGE)
217+
expectWarningsOnce(RestIndexAction.TYPES_DEPRECATION_MESSAGE)
218218
);
219219

220220
DeleteRequest deleteRequest = new DeleteRequest("index", "type", docId);
221221
DeleteResponse deleteResponse = execute(
222222
deleteRequest,
223223
highLevelClient()::delete,
224224
highLevelClient()::deleteAsync,
225-
expectWarnings(RestDeleteAction.TYPES_DEPRECATION_MESSAGE)
225+
expectWarningsOnce(RestDeleteAction.TYPES_DEPRECATION_MESSAGE)
226226
);
227227

228228
assertEquals("index", deleteResponse.getIndex());
@@ -425,15 +425,15 @@ public void testGetWithTypes() throws IOException {
425425
indexRequest,
426426
highLevelClient()::index,
427427
highLevelClient()::indexAsync,
428-
expectWarnings(RestIndexAction.TYPES_DEPRECATION_MESSAGE)
428+
expectWarningsOnce(RestIndexAction.TYPES_DEPRECATION_MESSAGE)
429429
);
430430

431431
GetRequest getRequest = new GetRequest("index", "type", "id");
432432
GetResponse getResponse = execute(
433433
getRequest,
434434
highLevelClient()::get,
435435
highLevelClient()::getAsync,
436-
expectWarnings(RestGetAction.TYPES_DEPRECATION_MESSAGE)
436+
expectWarningsOnce(RestGetAction.TYPES_DEPRECATION_MESSAGE)
437437
);
438438

439439
assertEquals("index", getResponse.getIndex());
@@ -512,7 +512,7 @@ public void testMultiGetWithTypes() throws IOException {
512512
bulk.add(new IndexRequest("index", "type", "id1").source("{\"field\":\"value1\"}", XContentType.JSON));
513513
bulk.add(new IndexRequest("index", "type", "id2").source("{\"field\":\"value2\"}", XContentType.JSON));
514514

515-
highLevelClient().bulk(bulk, expectWarnings(RestBulkAction.TYPES_DEPRECATION_MESSAGE));
515+
highLevelClient().bulk(bulk, expectWarningsOnce(RestBulkAction.TYPES_DEPRECATION_MESSAGE));
516516
MultiGetRequest multiGetRequest = new MultiGetRequest();
517517
multiGetRequest.add("index", "id1");
518518
multiGetRequest.add("index", "type", "id2");
@@ -521,7 +521,7 @@ public void testMultiGetWithTypes() throws IOException {
521521
multiGetRequest,
522522
highLevelClient()::mget,
523523
highLevelClient()::mgetAsync,
524-
expectWarnings(RestMultiGetAction.TYPES_DEPRECATION_MESSAGE)
524+
expectWarningsOnce(RestMultiGetAction.TYPES_DEPRECATION_MESSAGE)
525525
);
526526
assertEquals(2, response.getResponses().length);
527527

@@ -747,7 +747,7 @@ public void testIndexWithTypes() throws IOException {
747747
indexRequest,
748748
highLevelClient()::index,
749749
highLevelClient()::indexAsync,
750-
expectWarnings(RestIndexAction.TYPES_DEPRECATION_MESSAGE)
750+
expectWarningsOnce(RestIndexAction.TYPES_DEPRECATION_MESSAGE)
751751
);
752752
assertEquals(RestStatus.CREATED, indexResponse.status());
753753
assertEquals("index", indexResponse.getIndex());
@@ -962,7 +962,7 @@ public void testUpdateWithTypes() throws IOException {
962962
indexRequest,
963963
highLevelClient()::index,
964964
highLevelClient()::indexAsync,
965-
expectWarnings(RestIndexAction.TYPES_DEPRECATION_MESSAGE)
965+
expectWarningsOnce(RestIndexAction.TYPES_DEPRECATION_MESSAGE)
966966
);
967967

968968
UpdateRequest updateRequest = new UpdateRequest("index", "type", "id");
@@ -971,7 +971,7 @@ public void testUpdateWithTypes() throws IOException {
971971
updateRequest,
972972
highLevelClient()::update,
973973
highLevelClient()::updateAsync,
974-
expectWarnings(RestUpdateAction.TYPES_DEPRECATION_MESSAGE)
974+
expectWarningsOnce(RestUpdateAction.TYPES_DEPRECATION_MESSAGE)
975975
);
976976

977977
assertEquals(RestStatus.OK, updateResponse.status());

client/rest-high-level/src/test/java/org/opensearch/client/IndicesClientIT.java

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ public void testCreateIndexWithTypes() throws IOException {
293293
createIndexRequest,
294294
highLevelClient().indices()::create,
295295
highLevelClient().indices()::createAsync,
296-
expectWarnings(RestCreateIndexAction.TYPES_DEPRECATION_MESSAGE)
296+
expectWarningsOnce(RestCreateIndexAction.TYPES_DEPRECATION_MESSAGE)
297297
);
298298
assertTrue(createIndexResponse.isAcknowledged());
299299

@@ -326,7 +326,7 @@ public void testCreateIndexWithTypes() throws IOException {
326326
createIndexRequest,
327327
highLevelClient().indices()::create,
328328
highLevelClient().indices()::createAsync,
329-
expectWarnings(RestCreateIndexAction.TYPES_DEPRECATION_MESSAGE)
329+
expectWarningsOnce(RestCreateIndexAction.TYPES_DEPRECATION_MESSAGE)
330330
);
331331
assertTrue(createIndexResponse.isAcknowledged());
332332

@@ -505,7 +505,7 @@ public void testGetIndexWithTypes() throws IOException {
505505
getIndexRequest,
506506
highLevelClient().indices()::get,
507507
highLevelClient().indices()::getAsync,
508-
expectWarnings(RestGetIndicesAction.TYPES_DEPRECATION_MESSAGE)
508+
expectWarningsOnce(RestGetIndicesAction.TYPES_DEPRECATION_MESSAGE)
509509
);
510510

511511
// default settings should be null
@@ -601,7 +601,7 @@ public void testPutMappingWithTypes() throws IOException {
601601
putMappingRequest,
602602
highLevelClient().indices()::putMapping,
603603
highLevelClient().indices()::putMappingAsync,
604-
expectWarnings(RestPutMappingAction.TYPES_DEPRECATION_MESSAGE)
604+
expectWarningsOnce(RestPutMappingAction.TYPES_DEPRECATION_MESSAGE)
605605
);
606606
assertTrue(putMappingResponse.isAcknowledged());
607607

@@ -676,7 +676,7 @@ public void testGetMappingWithTypes() throws IOException {
676676
request,
677677
highLevelClient().indices()::getMapping,
678678
highLevelClient().indices()::getMappingAsync,
679-
expectWarnings(RestGetMappingAction.TYPES_DEPRECATION_MESSAGE)
679+
expectWarningsOnce(RestGetMappingAction.TYPES_DEPRECATION_MESSAGE)
680680
);
681681

682682
Map<String, Object> mappings = getMappingsResponse.getMappings().get(indexName).get("_doc").sourceAsMap();
@@ -750,7 +750,7 @@ public void testGetFieldMappingWithTypes() throws IOException {
750750
getFieldMappingsRequest,
751751
highLevelClient().indices()::getFieldMapping,
752752
highLevelClient().indices()::getFieldMappingAsync,
753-
expectWarnings(RestGetFieldMappingAction.TYPES_DEPRECATION_MESSAGE)
753+
expectWarningsOnce(RestGetFieldMappingAction.TYPES_DEPRECATION_MESSAGE)
754754
);
755755

756756
final Map<String, org.opensearch.action.admin.indices.mapping.get.GetFieldMappingsResponse.FieldMappingMetadata> fieldMappingMap =
@@ -1090,7 +1090,7 @@ public void testSyncedFlush() throws IOException {
10901090
syncedFlushRequest,
10911091
highLevelClient().indices()::flushSynced,
10921092
highLevelClient().indices()::flushSyncedAsync,
1093-
expectWarnings(SyncedFlushService.SYNCED_FLUSH_DEPRECATION_MESSAGE)
1093+
expectWarningsOnce(SyncedFlushService.SYNCED_FLUSH_DEPRECATION_MESSAGE)
10941094
);
10951095
assertThat(flushResponse.totalShards(), equalTo(1));
10961096
assertThat(flushResponse.successfulShards(), equalTo(1));
@@ -1106,7 +1106,7 @@ public void testSyncedFlush() throws IOException {
11061106
syncedFlushRequest,
11071107
highLevelClient().indices()::flushSynced,
11081108
highLevelClient().indices()::flushSyncedAsync,
1109-
expectWarnings(SyncedFlushService.SYNCED_FLUSH_DEPRECATION_MESSAGE)
1109+
expectWarningsOnce(SyncedFlushService.SYNCED_FLUSH_DEPRECATION_MESSAGE)
11101110
)
11111111
);
11121112
assertEquals(RestStatus.NOT_FOUND, exception.status());
@@ -1368,7 +1368,7 @@ public void testRolloverWithTypes() throws IOException {
13681368
rolloverRequest,
13691369
highLevelClient().indices()::rollover,
13701370
highLevelClient().indices()::rolloverAsync,
1371-
expectWarnings(RestRolloverIndexAction.TYPES_DEPRECATION_MESSAGE)
1371+
expectWarningsOnce(RestRolloverIndexAction.TYPES_DEPRECATION_MESSAGE)
13721372
);
13731373
assertTrue(rolloverResponse.isRolledOver());
13741374
assertFalse(rolloverResponse.isDryRun());
@@ -1782,7 +1782,7 @@ public void testPutTemplateWithTypes() throws Exception {
17821782
putTemplateRequest,
17831783
highLevelClient().indices()::putTemplate,
17841784
highLevelClient().indices()::putTemplateAsync,
1785-
expectWarnings(RestPutIndexTemplateAction.TYPES_DEPRECATION_MESSAGE)
1785+
expectWarningsOnce(RestPutIndexTemplateAction.TYPES_DEPRECATION_MESSAGE)
17861786
);
17871787
assertThat(putTemplateResponse.isAcknowledged(), equalTo(true));
17881788

@@ -1846,7 +1846,7 @@ public void testPutTemplateWithDeprecatedTemplateField() throws Exception {
18461846
putTemplateRequest,
18471847
highLevelClient().indices()::putTemplate,
18481848
highLevelClient().indices()::putTemplateAsync,
1849-
expectWarnings("Deprecated field [template] used, replaced by [index_patterns]")
1849+
expectWarningsOnce("Deprecated field [template] used, replaced by [index_patterns]")
18501850
);
18511851
assertThat(putTemplateResponse.isAcknowledged(), equalTo(true));
18521852

@@ -1916,7 +1916,7 @@ public void testPutTemplateWithNoTypesUsingTypedApi() throws Exception {
19161916
putTemplateRequest,
19171917
highLevelClient().indices()::putTemplate,
19181918
highLevelClient().indices()::putTemplateAsync,
1919-
expectWarnings(RestPutIndexTemplateAction.TYPES_DEPRECATION_MESSAGE)
1919+
expectWarningsOnce(RestPutIndexTemplateAction.TYPES_DEPRECATION_MESSAGE)
19201920
);
19211921
assertThat(putTemplateResponse.isAcknowledged(), equalTo(true));
19221922

@@ -2026,7 +2026,7 @@ public void testCRUDIndexTemplateWithTypes() throws Exception {
20262026
putTemplate1,
20272027
client.indices()::putTemplate,
20282028
client.indices()::putTemplateAsync,
2029-
expectWarnings(RestPutIndexTemplateAction.TYPES_DEPRECATION_MESSAGE)
2029+
expectWarningsOnce(RestPutIndexTemplateAction.TYPES_DEPRECATION_MESSAGE)
20302030
).isAcknowledged(),
20312031
equalTo(true)
20322032
);
@@ -2040,7 +2040,7 @@ public void testCRUDIndexTemplateWithTypes() throws Exception {
20402040
putTemplate2,
20412041
client.indices()::putTemplate,
20422042
client.indices()::putTemplateAsync,
2043-
expectWarnings(RestPutIndexTemplateAction.TYPES_DEPRECATION_MESSAGE)
2043+
expectWarningsOnce(RestPutIndexTemplateAction.TYPES_DEPRECATION_MESSAGE)
20442044
).isAcknowledged(),
20452045
equalTo(true)
20462046
);
@@ -2049,7 +2049,7 @@ public void testCRUDIndexTemplateWithTypes() throws Exception {
20492049
new GetIndexTemplatesRequest("template-1"),
20502050
client.indices()::getTemplate,
20512051
client.indices()::getTemplateAsync,
2052-
expectWarnings(RestGetIndexTemplateAction.TYPES_DEPRECATION_MESSAGE)
2052+
expectWarningsOnce(RestGetIndexTemplateAction.TYPES_DEPRECATION_MESSAGE)
20532053
);
20542054
assertThat(getTemplate1.getIndexTemplates(), hasSize(1));
20552055
org.opensearch.cluster.metadata.IndexTemplateMetadata template1 = getTemplate1.getIndexTemplates().get(0);
@@ -2062,7 +2062,7 @@ public void testCRUDIndexTemplateWithTypes() throws Exception {
20622062
new GetIndexTemplatesRequest("template-2"),
20632063
client.indices()::getTemplate,
20642064
client.indices()::getTemplateAsync,
2065-
expectWarnings(RestGetIndexTemplateAction.TYPES_DEPRECATION_MESSAGE)
2065+
expectWarningsOnce(RestGetIndexTemplateAction.TYPES_DEPRECATION_MESSAGE)
20662066
);
20672067
assertThat(getTemplate2.getIndexTemplates(), hasSize(1));
20682068
org.opensearch.cluster.metadata.IndexTemplateMetadata template2 = getTemplate2.getIndexTemplates().get(0);
@@ -2080,7 +2080,7 @@ public void testCRUDIndexTemplateWithTypes() throws Exception {
20802080
getBothRequest,
20812081
client.indices()::getTemplate,
20822082
client.indices()::getTemplateAsync,
2083-
expectWarnings(RestGetIndexTemplateAction.TYPES_DEPRECATION_MESSAGE)
2083+
expectWarningsOnce(RestGetIndexTemplateAction.TYPES_DEPRECATION_MESSAGE)
20842084
);
20852085
assertThat(getBoth.getIndexTemplates(), hasSize(2));
20862086
assertThat(
@@ -2093,7 +2093,7 @@ public void testCRUDIndexTemplateWithTypes() throws Exception {
20932093
getAllRequest,
20942094
client.indices()::getTemplate,
20952095
client.indices()::getTemplateAsync,
2096-
expectWarnings(RestGetIndexTemplateAction.TYPES_DEPRECATION_MESSAGE)
2096+
expectWarningsOnce(RestGetIndexTemplateAction.TYPES_DEPRECATION_MESSAGE)
20972097
);
20982098
assertThat(getAll.getIndexTemplates().size(), greaterThanOrEqualTo(2));
20992099
assertThat(
@@ -2132,7 +2132,7 @@ public void testCRUDIndexTemplateWithTypes() throws Exception {
21322132
new GetIndexTemplatesRequest("template-*"),
21332133
client.indices()::getTemplate,
21342134
client.indices()::getTemplateAsync,
2135-
expectWarnings(RestGetIndexTemplateAction.TYPES_DEPRECATION_MESSAGE)
2135+
expectWarningsOnce(RestGetIndexTemplateAction.TYPES_DEPRECATION_MESSAGE)
21362136
).getIndexTemplates(),
21372137
hasSize(1)
21382138
);
@@ -2141,7 +2141,7 @@ public void testCRUDIndexTemplateWithTypes() throws Exception {
21412141
new GetIndexTemplatesRequest("template-*"),
21422142
client.indices()::getTemplate,
21432143
client.indices()::getTemplateAsync,
2144-
expectWarnings(RestGetIndexTemplateAction.TYPES_DEPRECATION_MESSAGE)
2144+
expectWarningsOnce(RestGetIndexTemplateAction.TYPES_DEPRECATION_MESSAGE)
21452145
).getIndexTemplates().get(0).name(),
21462146
equalTo("template-2")
21472147
);
@@ -2157,7 +2157,7 @@ public void testCRUDIndexTemplateWithTypes() throws Exception {
21572157
new GetIndexTemplatesRequest("template-*"),
21582158
client.indices()::getTemplate,
21592159
client.indices()::getTemplateAsync,
2160-
expectWarnings(RestGetIndexTemplateAction.TYPES_DEPRECATION_MESSAGE)
2160+
expectWarningsOnce(RestGetIndexTemplateAction.TYPES_DEPRECATION_MESSAGE)
21612161
)
21622162
).status(),
21632163
equalTo(RestStatus.NOT_FOUND)

client/rest-high-level/src/test/java/org/opensearch/client/SearchIT.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -126,23 +126,23 @@ public class SearchIT extends OpenSearchRestHighLevelClientTestCase {
126126
public void indexDocuments() throws IOException {
127127
{
128128
Request doc1 = new Request(HttpPut.METHOD_NAME, "/index/type/1");
129-
doc1.setOptions(expectWarnings(RestIndexAction.TYPES_DEPRECATION_MESSAGE));
129+
doc1.setOptions(expectWarningsOnce(RestIndexAction.TYPES_DEPRECATION_MESSAGE));
130130
doc1.setJsonEntity("{\"type\":\"type1\", \"id\":1, \"num\":10, \"num2\":50}");
131131
client().performRequest(doc1);
132132
Request doc2 = new Request(HttpPut.METHOD_NAME, "/index/type/2");
133-
doc2.setOptions(expectWarnings(RestIndexAction.TYPES_DEPRECATION_MESSAGE));
133+
doc2.setOptions(expectWarningsOnce(RestIndexAction.TYPES_DEPRECATION_MESSAGE));
134134
doc2.setJsonEntity("{\"type\":\"type1\", \"id\":2, \"num\":20, \"num2\":40}");
135135
client().performRequest(doc2);
136136
Request doc3 = new Request(HttpPut.METHOD_NAME, "/index/type/3");
137-
doc3.setOptions(expectWarnings(RestIndexAction.TYPES_DEPRECATION_MESSAGE));
137+
doc3.setOptions(expectWarningsOnce(RestIndexAction.TYPES_DEPRECATION_MESSAGE));
138138
doc3.setJsonEntity("{\"type\":\"type1\", \"id\":3, \"num\":50, \"num2\":35}");
139139
client().performRequest(doc3);
140140
Request doc4 = new Request(HttpPut.METHOD_NAME, "/index/type/4");
141-
doc4.setOptions(expectWarnings(RestIndexAction.TYPES_DEPRECATION_MESSAGE));
141+
doc4.setOptions(expectWarningsOnce(RestIndexAction.TYPES_DEPRECATION_MESSAGE));
142142
doc4.setJsonEntity("{\"type\":\"type2\", \"id\":4, \"num\":100, \"num2\":10}");
143143
client().performRequest(doc4);
144144
Request doc5 = new Request(HttpPut.METHOD_NAME, "/index/type/5");
145-
doc5.setOptions(expectWarnings(RestIndexAction.TYPES_DEPRECATION_MESSAGE));
145+
doc5.setOptions(expectWarningsOnce(RestIndexAction.TYPES_DEPRECATION_MESSAGE));
146146
doc5.setJsonEntity("{\"type\":\"type2\", \"id\":5, \"num\":100, \"num2\":10}");
147147
client().performRequest(doc5);
148148
}
@@ -1445,7 +1445,6 @@ public void testCountMultipleIndicesMatchQuery() throws IOException {
14451445
}
14461446

14471447
public void testCountAllIndicesMatchQuery() throws IOException {
1448-
14491448
CountRequest countRequest = new CountRequest();
14501449
countRequest.source(new SearchSourceBuilder().query(new MatchQueryBuilder("field", "value1")));
14511450
CountResponse countResponse = execute(countRequest, highLevelClient()::count, highLevelClient()::countAsync);

modules/analysis-common/src/main/java/org/opensearch/analysis/common/CJKBigramFilterFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ public TokenFilterFactory getSynonymFilter() {
114114
throw new IllegalArgumentException("Token filter [" + name() + "] cannot be used to parse synonyms");
115115
} else {
116116
DEPRECATION_LOGGER.deprecate(
117-
"synonym_tokenfilters",
117+
name() + "_synonym_tokenfilters",
118118
"Token filter [" + name() + "] will not be usable to parse synonyms after v7.0"
119119
);
120120
}

modules/analysis-common/src/main/java/org/opensearch/analysis/common/CommonGramsTokenFilterFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public TokenFilterFactory getSynonymFilter() {
8484
throw new IllegalArgumentException("Token filter [" + name() + "] cannot be used to parse synonyms");
8585
} else {
8686
DEPRECATION_LOGGER.deprecate(
87-
"synonym_tokenfilters",
87+
name() + "_synonym_tokenfilters",
8888
"Token filter [" + name() + "] will not be usable to parse synonyms after v7.0"
8989
);
9090
}

0 commit comments

Comments
 (0)