Skip to content

Date Histogram Optimization with Date Rounding utility refactoring#19088

Merged
jainankitk merged 5 commits intoopensearch-project:mainfrom
sandeshkr419:rounding
Sep 17, 2025
Merged

Date Histogram Optimization with Date Rounding utility refactoring#19088
jainankitk merged 5 commits intoopensearch-project:mainfrom
sandeshkr419:rounding

Conversation

@sandeshkr419
Copy link
Copy Markdown
Member

@sandeshkr419 sandeshkr419 commented Aug 15, 2025

Signed-off-by: Sandesh Kumar sandeshkr419@gmail.com

TLDR

  • Rounding object re-use to speed up utility rounding time for each matching document
  • Refactoring for better instance checks by using switch instead of multiple if-else
  • Minor documentation improvement

Description

Re-using some rounding util objects to prevent unnecessary memory allocations. Classes like JavaTimeToMidnightRounding do not contain any state objects and only expose utils for time rounding. Creating a new object of this class for each call does not make sense therefore, changing this to a final single object to be re-used later on.

Difficult to establish results from pre-existing queries since a lot of queries do use pre-computations, which was evident as I profiled the results.
So, I created a date-histogram aggregation with sub-aggregation query which could not use pre-computations and I could hit the utils as intended.

This might not help speed up any non time-related aggregation request, because the benefits are seen only when the utils need to be called multiple times which is true only in cases of aggregation requests.

Query used to benchmark:

{
    "size": 0,
    "aggs": {
        "by_day": {
            "date_histogram": {
                "field": "@timestamp",
                "calendar_interval": "day"
            },
            "aggs": {
                "max_status": {
                    "sum": {
                        "field": "size"
                    }
                }
            }
        }
    }
}

Compared query results manually and also gradle checks do have appropriate coverage for various query shapes that will consume these utils.

Could see good ~1.5-2x latency improvements in this case.

Before:

|                                                  Segment count |                           |         362 |        |
|                                                 Min Throughput | date_histogram_minute_agg |        2.01 |  ops/s |
|                                                Mean Throughput | date_histogram_minute_agg |        2.01 |  ops/s |
|                                              Median Throughput | date_histogram_minute_agg |        2.01 |  ops/s |
|                                                 Max Throughput | date_histogram_minute_agg |        2.01 |  ops/s |
|                                        50th percentile latency | date_histogram_minute_agg |     26.4864 |     ms |
|                                        90th percentile latency | date_histogram_minute_agg |     31.2364 |     ms |
|                                        99th percentile latency | date_histogram_minute_agg |     36.5001 |     ms |
|                                       100th percentile latency | date_histogram_minute_agg |     38.7082 |     ms |
|                                   50th percentile service time | date_histogram_minute_agg |     24.4205 |     ms |
|                                   90th percentile service time | date_histogram_minute_agg |      28.503 |     ms |
|                                   99th percentile service time | date_histogram_minute_agg |     34.1655 |     ms |
|                                  100th percentile service time | date_histogram_minute_agg |     35.8721 |     ms |
|                                                     error rate | date_histogram_minute_agg |           0 |      % |

After:

|                                                  Segment count |                           |         362 |        |
|                                                 Min Throughput | date_histogram_minute_agg |           2 |  ops/s |
|                                                Mean Throughput | date_histogram_minute_agg |           2 |  ops/s |
|                                              Median Throughput | date_histogram_minute_agg |           2 |  ops/s |
|                                                 Max Throughput | date_histogram_minute_agg |        2.01 |  ops/s |
|                                        50th percentile latency | date_histogram_minute_agg |     12.2386 |     ms |
|                                        90th percentile latency | date_histogram_minute_agg |     16.2409 |     ms |
|                                        99th percentile latency | date_histogram_minute_agg |     27.0666 |     ms |
|                                       100th percentile latency | date_histogram_minute_agg |     29.2631 |     ms |
|                                   50th percentile service time | date_histogram_minute_agg |     9.62002 |     ms |
|                                   90th percentile service time | date_histogram_minute_agg |     12.8855 |     ms |
|                                   99th percentile service time | date_histogram_minute_agg |      23.928 |     ms |
|                                  100th percentile service time | date_histogram_minute_agg |     24.7337 |     ms |
|                                                     error rate | date_histogram_minute_agg |           0 |      % |

Related Issues

Resolves #[Issue number to be closed when this PR is merged]

Check List

  • Functionality includes testing.
  • API changes companion pull request created, if applicable.
  • Public documentation issue/PR created, if applicable.

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.
For more information on following Developer Certificate of Origin and signing off your commits, please check here.
Signed-off-by: Sandesh Kumar sandeshkr419@gmail.com

@sandeshkr419
Copy link
Copy Markdown
Member Author

{"run-benchmark-test": "id_4"}

@github-actions
Copy link
Copy Markdown
Contributor

The Jenkins job url is https://build.ci.opensearch.org/job/benchmark-pull-request/4100/ . Final results will be published once the job is completed.

@github-actions
Copy link
Copy Markdown
Contributor

❕ Gradle check result for 3e59154: UNSTABLE

Please review all flaky tests that succeeded after retry and create an issue if one does not already exist to track the flaky failure.

@codecov
Copy link
Copy Markdown

codecov bot commented Aug 15, 2025

Codecov Report

❌ Patch coverage is 88.13559% with 7 lines in your changes missing coverage. Please review.
✅ Project coverage is 72.95%. Comparing base (6c4f3d8) to head (e6beff8).
⚠️ Report is 2 commits behind head on main.

Files with missing lines Patch % Lines
.../src/main/java/org/opensearch/common/Rounding.java 88.13% 4 Missing and 3 partials ⚠️
Additional details and impacted files
@@             Coverage Diff              @@
##               main   #19088      +/-   ##
============================================
+ Coverage     72.88%   72.95%   +0.06%     
- Complexity    69841    69848       +7     
============================================
  Files          5673     5673              
  Lines        320756   320750       -6     
  Branches      46370    46368       -2     
============================================
+ Hits         233796   233993     +197     
+ Misses        68102    67816     -286     
- Partials      18858    18941      +83     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@opensearch-ci-bot
Copy link
Copy Markdown
Collaborator

Benchmark Results

Benchmark Results for Job: https://build.ci.opensearch.org/job/benchmark-pull-request/4100/

Metric Task Value Unit
Cumulative indexing time of primary shards 0 min
Min cumulative indexing time across primary shards 0 min
Median cumulative indexing time across primary shards 0 min
Max cumulative indexing time across primary shards 0 min
Cumulative indexing throttle time of primary shards 0 min
Min cumulative indexing throttle time across primary shards 0 min
Median cumulative indexing throttle time across primary shards 0 min
Max cumulative indexing throttle time across primary shards 0 min
Cumulative merge time of primary shards 0 min
Cumulative merge count of primary shards 0
Min cumulative merge time across primary shards 0 min
Median cumulative merge time across primary shards 0 min
Max cumulative merge time across primary shards 0 min
Cumulative merge throttle time of primary shards 0 min
Min cumulative merge throttle time across primary shards 0 min
Median cumulative merge throttle time across primary shards 0 min
Max cumulative merge throttle time across primary shards 0 min
Cumulative refresh time of primary shards 0 min
Cumulative refresh count of primary shards 4
Min cumulative refresh time across primary shards 0 min
Median cumulative refresh time across primary shards 0 min
Max cumulative refresh time across primary shards 0 min
Cumulative flush time of primary shards 0 min
Cumulative flush count of primary shards 1
Min cumulative flush time across primary shards 0 min
Median cumulative flush time across primary shards 0 min
Max cumulative flush time across primary shards 0 min
Total Young Gen GC time 1.54 s
Total Young Gen GC count 68
Total Old Gen GC time 0 s
Total Old Gen GC count 0
Store size 22.1056 GB
Translog size 5.12227e-08 GB
Heap used for segments 0 MB
Heap used for doc values 0 MB
Heap used for terms 0 MB
Heap used for norms 0 MB
Heap used for points 0 MB
Heap used for stored fields 0 MB
Segment count 18
Min Throughput wait-for-snapshot-recovery 4.17995e+07 byte/s
Mean Throughput wait-for-snapshot-recovery 4.17995e+07 byte/s
Median Throughput wait-for-snapshot-recovery 4.17995e+07 byte/s
Max Throughput wait-for-snapshot-recovery 4.17995e+07 byte/s
100th percentile latency wait-for-snapshot-recovery 562350 ms
100th percentile service time wait-for-snapshot-recovery 562350 ms
error rate wait-for-snapshot-recovery 0 %
Min Throughput wait-until-merges-finish 109.81 ops/s
Mean Throughput wait-until-merges-finish 109.81 ops/s
Median Throughput wait-until-merges-finish 109.81 ops/s
Max Throughput wait-until-merges-finish 109.81 ops/s
100th percentile latency wait-until-merges-finish 8.65684 ms
100th percentile service time wait-until-merges-finish 8.65684 ms
error rate wait-until-merges-finish 0 %
Min Throughput default 2 ops/s
Mean Throughput default 2.01 ops/s
Median Throughput default 2.01 ops/s
Max Throughput default 2.01 ops/s
50th percentile latency default 7.46367 ms
90th percentile latency default 8.09535 ms
99th percentile latency default 28.744 ms
100th percentile latency default 47.6502 ms
50th percentile service time default 6.212 ms
90th percentile service time default 6.58619 ms
99th percentile service time default 27.473 ms
100th percentile service time default 46.8242 ms
error rate default 0 %
Min Throughput desc_sort_timestamp 2 ops/s
Mean Throughput desc_sort_timestamp 2.01 ops/s
Median Throughput desc_sort_timestamp 2.01 ops/s
Max Throughput desc_sort_timestamp 2.01 ops/s
50th percentile latency desc_sort_timestamp 9.54021 ms
90th percentile latency desc_sort_timestamp 10.0271 ms
99th percentile latency desc_sort_timestamp 11.079 ms
100th percentile latency desc_sort_timestamp 11.8439 ms
50th percentile service time desc_sort_timestamp 8.17711 ms
90th percentile service time desc_sort_timestamp 8.47276 ms
99th percentile service time desc_sort_timestamp 9.85536 ms
100th percentile service time desc_sort_timestamp 10.8771 ms
error rate desc_sort_timestamp 0 %
Min Throughput asc_sort_timestamp 2.01 ops/s
Mean Throughput asc_sort_timestamp 2.01 ops/s
Median Throughput asc_sort_timestamp 2.01 ops/s
Max Throughput asc_sort_timestamp 2.01 ops/s
50th percentile latency asc_sort_timestamp 9.25351 ms
90th percentile latency asc_sort_timestamp 9.66526 ms
99th percentile latency asc_sort_timestamp 31.0219 ms
100th percentile latency asc_sort_timestamp 50.3238 ms
50th percentile service time asc_sort_timestamp 8.02366 ms
90th percentile service time asc_sort_timestamp 8.28891 ms
99th percentile service time asc_sort_timestamp 30.1431 ms
100th percentile service time asc_sort_timestamp 49.4423 ms
error rate asc_sort_timestamp 0 %
Min Throughput desc_sort_with_after_timestamp 2.01 ops/s
Mean Throughput desc_sort_with_after_timestamp 2.01 ops/s
Median Throughput desc_sort_with_after_timestamp 2.01 ops/s
Max Throughput desc_sort_with_after_timestamp 2.01 ops/s
50th percentile latency desc_sort_with_after_timestamp 7.16502 ms
90th percentile latency desc_sort_with_after_timestamp 7.72768 ms
99th percentile latency desc_sort_with_after_timestamp 8.10201 ms
100th percentile latency desc_sort_with_after_timestamp 8.14468 ms
50th percentile service time desc_sort_with_after_timestamp 5.90134 ms
90th percentile service time desc_sort_with_after_timestamp 6.24479 ms
99th percentile service time desc_sort_with_after_timestamp 7.01925 ms
100th percentile service time desc_sort_with_after_timestamp 7.04119 ms
error rate desc_sort_with_after_timestamp 0 %
Min Throughput asc_sort_with_after_timestamp 2.01 ops/s
Mean Throughput asc_sort_with_after_timestamp 2.01 ops/s
Median Throughput asc_sort_with_after_timestamp 2.01 ops/s
Max Throughput asc_sort_with_after_timestamp 2.01 ops/s
50th percentile latency asc_sort_with_after_timestamp 6.73994 ms
90th percentile latency asc_sort_with_after_timestamp 7.2399 ms
99th percentile latency asc_sort_with_after_timestamp 27.9159 ms
100th percentile latency asc_sort_with_after_timestamp 48.0416 ms
50th percentile service time asc_sort_with_after_timestamp 5.47827 ms
90th percentile service time asc_sort_with_after_timestamp 5.72408 ms
99th percentile service time asc_sort_with_after_timestamp 26.6794 ms
100th percentile service time asc_sort_with_after_timestamp 47.0133 ms
error rate asc_sort_with_after_timestamp 0 %
Min Throughput desc_sort_timestamp_can_match_shortcut 2 ops/s
Mean Throughput desc_sort_timestamp_can_match_shortcut 2.01 ops/s
Median Throughput desc_sort_timestamp_can_match_shortcut 2.01 ops/s
Max Throughput desc_sort_timestamp_can_match_shortcut 2.01 ops/s
50th percentile latency desc_sort_timestamp_can_match_shortcut 8.29351 ms
90th percentile latency desc_sort_timestamp_can_match_shortcut 8.90736 ms
99th percentile latency desc_sort_timestamp_can_match_shortcut 10.3487 ms
100th percentile latency desc_sort_timestamp_can_match_shortcut 10.4379 ms
50th percentile service time desc_sort_timestamp_can_match_shortcut 7.111 ms
90th percentile service time desc_sort_timestamp_can_match_shortcut 7.44073 ms
99th percentile service time desc_sort_timestamp_can_match_shortcut 9.08029 ms
100th percentile service time desc_sort_timestamp_can_match_shortcut 9.11555 ms
error rate desc_sort_timestamp_can_match_shortcut 0 %
Min Throughput desc_sort_timestamp_no_can_match_shortcut 2.01 ops/s
Mean Throughput desc_sort_timestamp_no_can_match_shortcut 2.01 ops/s
Median Throughput desc_sort_timestamp_no_can_match_shortcut 2.01 ops/s
Max Throughput desc_sort_timestamp_no_can_match_shortcut 2.01 ops/s
50th percentile latency desc_sort_timestamp_no_can_match_shortcut 8.00941 ms
90th percentile latency desc_sort_timestamp_no_can_match_shortcut 8.39742 ms
99th percentile latency desc_sort_timestamp_no_can_match_shortcut 9.44633 ms
100th percentile latency desc_sort_timestamp_no_can_match_shortcut 9.98398 ms
50th percentile service time desc_sort_timestamp_no_can_match_shortcut 6.72295 ms
90th percentile service time desc_sort_timestamp_no_can_match_shortcut 6.97559 ms
99th percentile service time desc_sort_timestamp_no_can_match_shortcut 7.89246 ms
100th percentile service time desc_sort_timestamp_no_can_match_shortcut 8.57677 ms
error rate desc_sort_timestamp_no_can_match_shortcut 0 %
Min Throughput asc_sort_timestamp_can_match_shortcut 2.01 ops/s
Mean Throughput asc_sort_timestamp_can_match_shortcut 2.01 ops/s
Median Throughput asc_sort_timestamp_can_match_shortcut 2.01 ops/s
Max Throughput asc_sort_timestamp_can_match_shortcut 2.01 ops/s
50th percentile latency asc_sort_timestamp_can_match_shortcut 8.93592 ms
90th percentile latency asc_sort_timestamp_can_match_shortcut 9.37835 ms
99th percentile latency asc_sort_timestamp_can_match_shortcut 10.1078 ms
100th percentile latency asc_sort_timestamp_can_match_shortcut 10.2279 ms
50th percentile service time asc_sort_timestamp_can_match_shortcut 7.68681 ms
90th percentile service time asc_sort_timestamp_can_match_shortcut 7.84782 ms
99th percentile service time asc_sort_timestamp_can_match_shortcut 8.89797 ms
100th percentile service time asc_sort_timestamp_can_match_shortcut 9.10057 ms
error rate asc_sort_timestamp_can_match_shortcut 0 %
Min Throughput asc_sort_timestamp_no_can_match_shortcut 2.01 ops/s
Mean Throughput asc_sort_timestamp_no_can_match_shortcut 2.01 ops/s
Median Throughput asc_sort_timestamp_no_can_match_shortcut 2.01 ops/s
Max Throughput asc_sort_timestamp_no_can_match_shortcut 2.01 ops/s
50th percentile latency asc_sort_timestamp_no_can_match_shortcut 8.90559 ms
90th percentile latency asc_sort_timestamp_no_can_match_shortcut 9.36072 ms
99th percentile latency asc_sort_timestamp_no_can_match_shortcut 10.992 ms
100th percentile latency asc_sort_timestamp_no_can_match_shortcut 11.1488 ms
50th percentile service time asc_sort_timestamp_no_can_match_shortcut 7.62564 ms
90th percentile service time asc_sort_timestamp_no_can_match_shortcut 7.93881 ms
99th percentile service time asc_sort_timestamp_no_can_match_shortcut 9.62119 ms
100th percentile service time asc_sort_timestamp_no_can_match_shortcut 9.77565 ms
error rate asc_sort_timestamp_no_can_match_shortcut 0 %
Min Throughput term 2.01 ops/s
Mean Throughput term 2.01 ops/s
Median Throughput term 2.01 ops/s
Max Throughput term 2.01 ops/s
50th percentile latency term 3.97167 ms
90th percentile latency term 4.36517 ms
99th percentile latency term 4.83484 ms
100th percentile latency term 5.00499 ms
50th percentile service time term 2.72995 ms
90th percentile service time term 2.82444 ms
99th percentile service time term 3.21741 ms
100th percentile service time term 3.44109 ms
error rate term 0 %
Min Throughput multi_terms-keyword 1.42 ops/s
Mean Throughput multi_terms-keyword 1.43 ops/s
Median Throughput multi_terms-keyword 1.42 ops/s
Max Throughput multi_terms-keyword 1.43 ops/s
50th percentile latency multi_terms-keyword 50753.4 ms
90th percentile latency multi_terms-keyword 59219.8 ms
99th percentile latency multi_terms-keyword 61137.6 ms
100th percentile latency multi_terms-keyword 61243.6 ms
50th percentile service time multi_terms-keyword 711.494 ms
90th percentile service time multi_terms-keyword 718.079 ms
99th percentile service time multi_terms-keyword 777.476 ms
100th percentile service time multi_terms-keyword 818.778 ms
error rate multi_terms-keyword 0 %
Min Throughput keyword-terms 2 ops/s
Mean Throughput keyword-terms 2 ops/s
Median Throughput keyword-terms 2 ops/s
Max Throughput keyword-terms 2 ops/s
50th percentile latency keyword-terms 30.7066 ms
90th percentile latency keyword-terms 40.4211 ms
99th percentile latency keyword-terms 41.9214 ms
100th percentile latency keyword-terms 42.8382 ms
50th percentile service time keyword-terms 29.3422 ms
90th percentile service time keyword-terms 39.1165 ms
99th percentile service time keyword-terms 40.4252 ms
100th percentile service time keyword-terms 41.2755 ms
error rate keyword-terms 0 %
Min Throughput keyword-terms-low-cardinality 2.01 ops/s
Mean Throughput keyword-terms-low-cardinality 2.01 ops/s
Median Throughput keyword-terms-low-cardinality 2.01 ops/s
Max Throughput keyword-terms-low-cardinality 2.01 ops/s
50th percentile latency keyword-terms-low-cardinality 28.2915 ms
90th percentile latency keyword-terms-low-cardinality 37.4458 ms
99th percentile latency keyword-terms-low-cardinality 45.3198 ms
100th percentile latency keyword-terms-low-cardinality 45.4473 ms
50th percentile service time keyword-terms-low-cardinality 26.1903 ms
90th percentile service time keyword-terms-low-cardinality 35.2323 ms
99th percentile service time keyword-terms-low-cardinality 43.0372 ms
100th percentile service time keyword-terms-low-cardinality 43.2428 ms
error rate keyword-terms-low-cardinality 0 %
Min Throughput composite-terms 2 ops/s
Mean Throughput composite-terms 2 ops/s
Median Throughput composite-terms 2 ops/s
Max Throughput composite-terms 2 ops/s
50th percentile latency composite-terms 180.461 ms
90th percentile latency composite-terms 184.854 ms
99th percentile latency composite-terms 211.123 ms
100th percentile latency composite-terms 213.934 ms
50th percentile service time composite-terms 179.22 ms
90th percentile service time composite-terms 183.586 ms
99th percentile service time composite-terms 210.32 ms
100th percentile service time composite-terms 213.205 ms
error rate composite-terms 0 %
Min Throughput composite_terms-keyword 2 ops/s
Mean Throughput composite_terms-keyword 2 ops/s
Median Throughput composite_terms-keyword 2 ops/s
Max Throughput composite_terms-keyword 2 ops/s
50th percentile latency composite_terms-keyword 323.436 ms
90th percentile latency composite_terms-keyword 331.545 ms
99th percentile latency composite_terms-keyword 346.093 ms
100th percentile latency composite_terms-keyword 348.855 ms
50th percentile service time composite_terms-keyword 322.127 ms
90th percentile service time composite_terms-keyword 330.661 ms
99th percentile service time composite_terms-keyword 344.884 ms
100th percentile service time composite_terms-keyword 347.887 ms
error rate composite_terms-keyword 0 %
Min Throughput composite-date_histogram-daily 2.01 ops/s
Mean Throughput composite-date_histogram-daily 2.01 ops/s
Median Throughput composite-date_histogram-daily 2.01 ops/s
Max Throughput composite-date_histogram-daily 2.01 ops/s
50th percentile latency composite-date_histogram-daily 4.6052 ms
90th percentile latency composite-date_histogram-daily 5.05972 ms
99th percentile latency composite-date_histogram-daily 5.22149 ms
100th percentile latency composite-date_histogram-daily 5.26399 ms
50th percentile service time composite-date_histogram-daily 3.3235 ms
90th percentile service time composite-date_histogram-daily 3.45548 ms
99th percentile service time composite-date_histogram-daily 3.79146 ms
100th percentile service time composite-date_histogram-daily 3.86349 ms
error rate composite-date_histogram-daily 0 %
Min Throughput range 2.01 ops/s
Mean Throughput range 2.01 ops/s
Median Throughput range 2.01 ops/s
Max Throughput range 2.01 ops/s
50th percentile latency range 5.58894 ms
90th percentile latency range 5.9636 ms
99th percentile latency range 6.12804 ms
100th percentile latency range 6.12862 ms
50th percentile service time range 4.26234 ms
90th percentile service time range 4.43993 ms
99th percentile service time range 4.67555 ms
100th percentile service time range 4.67861 ms
error rate range 0 %
Min Throughput range-numeric 2.01 ops/s
Mean Throughput range-numeric 2.01 ops/s
Median Throughput range-numeric 2.01 ops/s
Max Throughput range-numeric 2.01 ops/s
50th percentile latency range-numeric 3.82249 ms
90th percentile latency range-numeric 4.24913 ms
99th percentile latency range-numeric 4.46659 ms
100th percentile latency range-numeric 4.53442 ms
50th percentile service time range-numeric 2.56005 ms
90th percentile service time range-numeric 2.67686 ms
99th percentile service time range-numeric 2.77142 ms
100th percentile service time range-numeric 2.79833 ms
error rate range-numeric 0 %
Min Throughput keyword-in-range 2.01 ops/s
Mean Throughput keyword-in-range 2.01 ops/s
Median Throughput keyword-in-range 2.01 ops/s
Max Throughput keyword-in-range 2.01 ops/s
50th percentile latency keyword-in-range 13.5886 ms
90th percentile latency keyword-in-range 14.1052 ms
99th percentile latency keyword-in-range 22.0527 ms
100th percentile latency keyword-in-range 25.1691 ms
50th percentile service time keyword-in-range 12.3411 ms
90th percentile service time keyword-in-range 12.5639 ms
99th percentile service time keyword-in-range 21.2035 ms
100th percentile service time keyword-in-range 24.334 ms
error rate keyword-in-range 0 %
Min Throughput date_histogram_hourly_agg 2.01 ops/s
Mean Throughput date_histogram_hourly_agg 2.01 ops/s
Median Throughput date_histogram_hourly_agg 2.01 ops/s
Max Throughput date_histogram_hourly_agg 2.01 ops/s
50th percentile latency date_histogram_hourly_agg 7.03546 ms
90th percentile latency date_histogram_hourly_agg 8.42221 ms
99th percentile latency date_histogram_hourly_agg 8.76745 ms
100th percentile latency date_histogram_hourly_agg 8.81484 ms
50th percentile service time date_histogram_hourly_agg 5.63869 ms
90th percentile service time date_histogram_hourly_agg 6.86829 ms
99th percentile service time date_histogram_hourly_agg 7.31918 ms
100th percentile service time date_histogram_hourly_agg 7.34611 ms
error rate date_histogram_hourly_agg 0 %
Min Throughput date_histogram_minute_agg 2.01 ops/s
Mean Throughput date_histogram_minute_agg 2.01 ops/s
Median Throughput date_histogram_minute_agg 2.01 ops/s
Max Throughput date_histogram_minute_agg 2.01 ops/s
50th percentile latency date_histogram_minute_agg 41.03 ms
90th percentile latency date_histogram_minute_agg 41.7606 ms
99th percentile latency date_histogram_minute_agg 44.1604 ms
100th percentile latency date_histogram_minute_agg 44.6193 ms
50th percentile service time date_histogram_minute_agg 39.7274 ms
90th percentile service time date_histogram_minute_agg 40.4264 ms
99th percentile service time date_histogram_minute_agg 43.2791 ms
100th percentile service time date_histogram_minute_agg 43.7951 ms
error rate date_histogram_minute_agg 0 %
Min Throughput scroll 47.89 pages/s
Mean Throughput scroll 48.28 pages/s
Median Throughput scroll 48.38 pages/s
Max Throughput scroll 48.43 pages/s
50th percentile latency scroll 4468.8 ms
90th percentile latency scroll 4942.09 ms
99th percentile latency scroll 5155.59 ms
100th percentile latency scroll 5167.43 ms
50th percentile service time scroll 490.766 ms
90th percentile service time scroll 515.645 ms
99th percentile service time scroll 532.387 ms
100th percentile service time scroll 532.503 ms
error rate scroll 0 %
Min Throughput query-string-on-message 2.01 ops/s
Mean Throughput query-string-on-message 2.01 ops/s
Median Throughput query-string-on-message 2.01 ops/s
Max Throughput query-string-on-message 2.01 ops/s
50th percentile latency query-string-on-message 6.66887 ms
90th percentile latency query-string-on-message 7.14462 ms
99th percentile latency query-string-on-message 7.73545 ms
100th percentile latency query-string-on-message 7.93374 ms
50th percentile service time query-string-on-message 5.37428 ms
90th percentile service time query-string-on-message 5.52167 ms
99th percentile service time query-string-on-message 6.90143 ms
100th percentile service time query-string-on-message 7.13257 ms
error rate query-string-on-message 0 %
Min Throughput query-string-on-message-filtered 2.01 ops/s
Mean Throughput query-string-on-message-filtered 2.01 ops/s
Median Throughput query-string-on-message-filtered 2.01 ops/s
Max Throughput query-string-on-message-filtered 2.01 ops/s
50th percentile latency query-string-on-message-filtered 13.0311 ms
90th percentile latency query-string-on-message-filtered 13.4922 ms
99th percentile latency query-string-on-message-filtered 16.0638 ms
100th percentile latency query-string-on-message-filtered 18.1701 ms
50th percentile service time query-string-on-message-filtered 11.7568 ms
90th percentile service time query-string-on-message-filtered 11.9787 ms
99th percentile service time query-string-on-message-filtered 14.6466 ms
100th percentile service time query-string-on-message-filtered 16.9661 ms
error rate query-string-on-message-filtered 0 %
Min Throughput query-string-on-message-filtered-sorted-num 2.01 ops/s
Mean Throughput query-string-on-message-filtered-sorted-num 2.01 ops/s
Median Throughput query-string-on-message-filtered-sorted-num 2.01 ops/s
Max Throughput query-string-on-message-filtered-sorted-num 2.01 ops/s
50th percentile latency query-string-on-message-filtered-sorted-num 22.3636 ms
90th percentile latency query-string-on-message-filtered-sorted-num 22.8348 ms
99th percentile latency query-string-on-message-filtered-sorted-num 28.6615 ms
100th percentile latency query-string-on-message-filtered-sorted-num 32.4352 ms
50th percentile service time query-string-on-message-filtered-sorted-num 20.0902 ms
90th percentile service time query-string-on-message-filtered-sorted-num 20.3941 ms
99th percentile service time query-string-on-message-filtered-sorted-num 26.3099 ms
100th percentile service time query-string-on-message-filtered-sorted-num 30.4294 ms
error rate query-string-on-message-filtered-sorted-num 0 %
Min Throughput sort_keyword_can_match_shortcut 2.01 ops/s
Mean Throughput sort_keyword_can_match_shortcut 2.01 ops/s
Median Throughput sort_keyword_can_match_shortcut 2.01 ops/s
Max Throughput sort_keyword_can_match_shortcut 2.01 ops/s
50th percentile latency sort_keyword_can_match_shortcut 6.11881 ms
90th percentile latency sort_keyword_can_match_shortcut 6.5488 ms
99th percentile latency sort_keyword_can_match_shortcut 6.80707 ms
100th percentile latency sort_keyword_can_match_shortcut 6.91621 ms
50th percentile service time sort_keyword_can_match_shortcut 4.88123 ms
90th percentile service time sort_keyword_can_match_shortcut 4.98768 ms
99th percentile service time sort_keyword_can_match_shortcut 5.28607 ms
100th percentile service time sort_keyword_can_match_shortcut 5.43165 ms
error rate sort_keyword_can_match_shortcut 0 %
Min Throughput sort_keyword_no_can_match_shortcut 2.01 ops/s
Mean Throughput sort_keyword_no_can_match_shortcut 2.01 ops/s
Median Throughput sort_keyword_no_can_match_shortcut 2.01 ops/s
Max Throughput sort_keyword_no_can_match_shortcut 2.01 ops/s
50th percentile latency sort_keyword_no_can_match_shortcut 6.14647 ms
90th percentile latency sort_keyword_no_can_match_shortcut 6.52716 ms
99th percentile latency sort_keyword_no_can_match_shortcut 6.68767 ms
100th percentile latency sort_keyword_no_can_match_shortcut 6.6929 ms
50th percentile service time sort_keyword_no_can_match_shortcut 4.85903 ms
90th percentile service time sort_keyword_no_can_match_shortcut 4.98491 ms
99th percentile service time sort_keyword_no_can_match_shortcut 5.24665 ms
100th percentile service time sort_keyword_no_can_match_shortcut 5.30066 ms
error rate sort_keyword_no_can_match_shortcut 0 %
Min Throughput sort_numeric_desc 2.01 ops/s
Mean Throughput sort_numeric_desc 2.01 ops/s
Median Throughput sort_numeric_desc 2.01 ops/s
Max Throughput sort_numeric_desc 2.01 ops/s
50th percentile latency sort_numeric_desc 5.54894 ms
90th percentile latency sort_numeric_desc 5.98028 ms
99th percentile latency sort_numeric_desc 11.6713 ms
100th percentile latency sort_numeric_desc 17.2819 ms
50th percentile service time sort_numeric_desc 4.29026 ms
90th percentile service time sort_numeric_desc 4.39634 ms
99th percentile service time sort_numeric_desc 10.3466 ms
100th percentile service time sort_numeric_desc 16.2065 ms
error rate sort_numeric_desc 0 %
Min Throughput sort_numeric_asc 2.01 ops/s
Mean Throughput sort_numeric_asc 2.01 ops/s
Median Throughput sort_numeric_asc 2.01 ops/s
Max Throughput sort_numeric_asc 2.01 ops/s
50th percentile latency sort_numeric_asc 5.19313 ms
90th percentile latency sort_numeric_asc 5.58979 ms
99th percentile latency sort_numeric_asc 5.73707 ms
100th percentile latency sort_numeric_asc 5.77683 ms
50th percentile service time sort_numeric_asc 3.90056 ms
90th percentile service time sort_numeric_asc 3.99326 ms
99th percentile service time sort_numeric_asc 4.30458 ms
100th percentile service time sort_numeric_asc 4.57606 ms
error rate sort_numeric_asc 0 %
Min Throughput sort_numeric_desc_with_match 2.01 ops/s
Mean Throughput sort_numeric_desc_with_match 2.01 ops/s
Median Throughput sort_numeric_desc_with_match 2.01 ops/s
Max Throughput sort_numeric_desc_with_match 2.01 ops/s
50th percentile latency sort_numeric_desc_with_match 3.65403 ms
90th percentile latency sort_numeric_desc_with_match 4.05182 ms
99th percentile latency sort_numeric_desc_with_match 4.18488 ms
100th percentile latency sort_numeric_desc_with_match 4.19866 ms
50th percentile service time sort_numeric_desc_with_match 2.38444 ms
90th percentile service time sort_numeric_desc_with_match 2.43575 ms
99th percentile service time sort_numeric_desc_with_match 2.51988 ms
100th percentile service time sort_numeric_desc_with_match 2.5208 ms
error rate sort_numeric_desc_with_match 0 %
Min Throughput sort_numeric_asc_with_match 2.01 ops/s
Mean Throughput sort_numeric_asc_with_match 2.01 ops/s
Median Throughput sort_numeric_asc_with_match 2.01 ops/s
Max Throughput sort_numeric_asc_with_match 2.01 ops/s
50th percentile latency sort_numeric_asc_with_match 3.61271 ms
90th percentile latency sort_numeric_asc_with_match 4.0413 ms
99th percentile latency sort_numeric_asc_with_match 4.27079 ms
100th percentile latency sort_numeric_asc_with_match 4.38197 ms
50th percentile service time sort_numeric_asc_with_match 2.39844 ms
90th percentile service time sort_numeric_asc_with_match 2.46011 ms
99th percentile service time sort_numeric_asc_with_match 2.57722 ms
100th percentile service time sort_numeric_asc_with_match 2.61282 ms
error rate sort_numeric_asc_with_match 0 %
Min Throughput range_field_conjunction_big_range_big_term_query 2.01 ops/s
Mean Throughput range_field_conjunction_big_range_big_term_query 2.01 ops/s
Median Throughput range_field_conjunction_big_range_big_term_query 2.01 ops/s
Max Throughput range_field_conjunction_big_range_big_term_query 2.01 ops/s
50th percentile latency range_field_conjunction_big_range_big_term_query 3.74726 ms
90th percentile latency range_field_conjunction_big_range_big_term_query 4.14096 ms
99th percentile latency range_field_conjunction_big_range_big_term_query 4.2699 ms
100th percentile latency range_field_conjunction_big_range_big_term_query 4.27245 ms
50th percentile service time range_field_conjunction_big_range_big_term_query 2.48919 ms
90th percentile service time range_field_conjunction_big_range_big_term_query 2.61325 ms
99th percentile service time range_field_conjunction_big_range_big_term_query 2.88189 ms
100th percentile service time range_field_conjunction_big_range_big_term_query 2.89932 ms
error rate range_field_conjunction_big_range_big_term_query 0 %
Min Throughput range_field_disjunction_big_range_small_term_query 2.01 ops/s
Mean Throughput range_field_disjunction_big_range_small_term_query 2.01 ops/s
Median Throughput range_field_disjunction_big_range_small_term_query 2.01 ops/s
Max Throughput range_field_disjunction_big_range_small_term_query 2.01 ops/s
50th percentile latency range_field_disjunction_big_range_small_term_query 4.01069 ms
90th percentile latency range_field_disjunction_big_range_small_term_query 4.38903 ms
99th percentile latency range_field_disjunction_big_range_small_term_query 4.65042 ms
100th percentile latency range_field_disjunction_big_range_small_term_query 4.68367 ms
50th percentile service time range_field_disjunction_big_range_small_term_query 2.72991 ms
90th percentile service time range_field_disjunction_big_range_small_term_query 2.82739 ms
99th percentile service time range_field_disjunction_big_range_small_term_query 2.99424 ms
100th percentile service time range_field_disjunction_big_range_small_term_query 3.01157 ms
error rate range_field_disjunction_big_range_small_term_query 0 %
Min Throughput range_field_conjunction_small_range_small_term_query 2.01 ops/s
Mean Throughput range_field_conjunction_small_range_small_term_query 2.01 ops/s
Median Throughput range_field_conjunction_small_range_small_term_query 2.01 ops/s
Max Throughput range_field_conjunction_small_range_small_term_query 2.01 ops/s
50th percentile latency range_field_conjunction_small_range_small_term_query 3.64668 ms
90th percentile latency range_field_conjunction_small_range_small_term_query 4.04873 ms
99th percentile latency range_field_conjunction_small_range_small_term_query 4.15202 ms
100th percentile latency range_field_conjunction_small_range_small_term_query 4.16125 ms
50th percentile service time range_field_conjunction_small_range_small_term_query 2.37329 ms
90th percentile service time range_field_conjunction_small_range_small_term_query 2.42838 ms
99th percentile service time range_field_conjunction_small_range_small_term_query 2.47235 ms
100th percentile service time range_field_conjunction_small_range_small_term_query 2.47282 ms
error rate range_field_conjunction_small_range_small_term_query 0 %
Min Throughput range_field_conjunction_small_range_big_term_query 2.01 ops/s
Mean Throughput range_field_conjunction_small_range_big_term_query 2.01 ops/s
Median Throughput range_field_conjunction_small_range_big_term_query 2.01 ops/s
Max Throughput range_field_conjunction_small_range_big_term_query 2.01 ops/s
50th percentile latency range_field_conjunction_small_range_big_term_query 3.47981 ms
90th percentile latency range_field_conjunction_small_range_big_term_query 3.88223 ms
99th percentile latency range_field_conjunction_small_range_big_term_query 4.03642 ms
100th percentile latency range_field_conjunction_small_range_big_term_query 4.09156 ms
50th percentile service time range_field_conjunction_small_range_big_term_query 2.21063 ms
90th percentile service time range_field_conjunction_small_range_big_term_query 2.29302 ms
99th percentile service time range_field_conjunction_small_range_big_term_query 2.35134 ms
100th percentile service time range_field_conjunction_small_range_big_term_query 2.36288 ms
error rate range_field_conjunction_small_range_big_term_query 0 %
Min Throughput range-auto-date-histo 0.28 ops/s
Mean Throughput range-auto-date-histo 0.28 ops/s
Median Throughput range-auto-date-histo 0.28 ops/s
Max Throughput range-auto-date-histo 0.28 ops/s
50th percentile latency range-auto-date-histo 769938 ms
90th percentile latency range-auto-date-histo 892509 ms
99th percentile latency range-auto-date-histo 920022 ms
100th percentile latency range-auto-date-histo 921566 ms
50th percentile service time range-auto-date-histo 3551.03 ms
90th percentile service time range-auto-date-histo 3637.15 ms
99th percentile service time range-auto-date-histo 3863.76 ms
100th percentile service time range-auto-date-histo 3914.23 ms
error rate range-auto-date-histo 0 %
Min Throughput range-auto-date-histo-with-metrics 0.11 ops/s
Mean Throughput range-auto-date-histo-with-metrics 0.11 ops/s
Median Throughput range-auto-date-histo-with-metrics 0.11 ops/s
Max Throughput range-auto-date-histo-with-metrics 0.11 ops/s
50th percentile latency range-auto-date-histo-with-metrics 2.12835e+06 ms
90th percentile latency range-auto-date-histo-with-metrics 2.48422e+06 ms
99th percentile latency range-auto-date-histo-with-metrics 2.56476e+06 ms
100th percentile latency range-auto-date-histo-with-metrics 2.5692e+06 ms
50th percentile service time range-auto-date-histo-with-metrics 9311.96 ms
90th percentile service time range-auto-date-histo-with-metrics 9495.28 ms
99th percentile service time range-auto-date-histo-with-metrics 9580.86 ms
100th percentile service time range-auto-date-histo-with-metrics 9586.14 ms
error rate range-auto-date-histo-with-metrics 0 %
Min Throughput range-agg-1 2.01 ops/s
Mean Throughput range-agg-1 2.01 ops/s
Median Throughput range-agg-1 2.01 ops/s
Max Throughput range-agg-1 2.01 ops/s
50th percentile latency range-agg-1 3.97114 ms
90th percentile latency range-agg-1 4.41218 ms
99th percentile latency range-agg-1 4.54744 ms
100th percentile latency range-agg-1 4.58034 ms
50th percentile service time range-agg-1 2.67699 ms
90th percentile service time range-agg-1 2.83256 ms
99th percentile service time range-agg-1 3.16167 ms
100th percentile service time range-agg-1 3.30797 ms
error rate range-agg-1 0 %
Min Throughput range-agg-2 2.01 ops/s
Mean Throughput range-agg-2 2.01 ops/s
Median Throughput range-agg-2 2.01 ops/s
Max Throughput range-agg-2 2.01 ops/s
50th percentile latency range-agg-2 3.75744 ms
90th percentile latency range-agg-2 4.21384 ms
99th percentile latency range-agg-2 4.53914 ms
100th percentile latency range-agg-2 4.60162 ms
50th percentile service time range-agg-2 2.54803 ms
90th percentile service time range-agg-2 2.70013 ms
99th percentile service time range-agg-2 2.85761 ms
100th percentile service time range-agg-2 2.86701 ms
error rate range-agg-2 0 %
Min Throughput cardinality-agg-low 2.01 ops/s
Mean Throughput cardinality-agg-low 2.01 ops/s
Median Throughput cardinality-agg-low 2.01 ops/s
Max Throughput cardinality-agg-low 2.01 ops/s
50th percentile latency cardinality-agg-low 5.90138 ms
90th percentile latency cardinality-agg-low 6.663 ms
99th percentile latency cardinality-agg-low 6.99849 ms
100th percentile latency cardinality-agg-low 7.04478 ms
50th percentile service time cardinality-agg-low 4.49077 ms
90th percentile service time cardinality-agg-low 5.20119 ms
99th percentile service time cardinality-agg-low 5.43115 ms
100th percentile service time cardinality-agg-low 5.46601 ms
error rate cardinality-agg-low 0 %
Min Throughput cardinality-agg-high 0.79 ops/s
Mean Throughput cardinality-agg-high 0.79 ops/s
Median Throughput cardinality-agg-high 0.79 ops/s
Max Throughput cardinality-agg-high 0.79 ops/s
50th percentile latency cardinality-agg-high 191963 ms
90th percentile latency cardinality-agg-high 222345 ms
99th percentile latency cardinality-agg-high 229252 ms
100th percentile latency cardinality-agg-high 229660 ms
50th percentile service time cardinality-agg-high 1253.84 ms
90th percentile service time cardinality-agg-high 1311.68 ms
99th percentile service time cardinality-agg-high 1344.9 ms
100th percentile service time cardinality-agg-high 1352.33 ms
error rate cardinality-agg-high 0 %
Min Throughput cardinality-agg-very-high 0.59 ops/s
Mean Throughput cardinality-agg-very-high 0.6 ops/s
Median Throughput cardinality-agg-very-high 0.6 ops/s
Max Throughput cardinality-agg-very-high 0.6 ops/s
50th percentile latency cardinality-agg-very-high 118661 ms
90th percentile latency cardinality-agg-very-high 165315 ms
99th percentile latency cardinality-agg-very-high 175798 ms
100th percentile latency cardinality-agg-very-high 176378 ms
50th percentile service time cardinality-agg-very-high 1658.08 ms
90th percentile service time cardinality-agg-very-high 1706.36 ms
99th percentile service time cardinality-agg-very-high 1758 ms
100th percentile service time cardinality-agg-very-high 1762.55 ms
error rate cardinality-agg-very-high 0 %
Min Throughput range_with_asc_sort 2.01 ops/s
Mean Throughput range_with_asc_sort 2.01 ops/s
Median Throughput range_with_asc_sort 2.01 ops/s
Max Throughput range_with_asc_sort 2.01 ops/s
50th percentile latency range_with_asc_sort 7.79372 ms
90th percentile latency range_with_asc_sort 8.25727 ms
99th percentile latency range_with_asc_sort 13.9282 ms
100th percentile latency range_with_asc_sort 17.8776 ms
50th percentile service time range_with_asc_sort 6.52761 ms
90th percentile service time range_with_asc_sort 6.65235 ms
99th percentile service time range_with_asc_sort 12.4378 ms
100th percentile service time range_with_asc_sort 16.4021 ms
error rate range_with_asc_sort 0 %
Min Throughput range_with_desc_sort 2.01 ops/s
Mean Throughput range_with_desc_sort 2.01 ops/s
Median Throughput range_with_desc_sort 2.01 ops/s
Max Throughput range_with_desc_sort 2.01 ops/s
50th percentile latency range_with_desc_sort 8.09747 ms
90th percentile latency range_with_desc_sort 8.52856 ms
99th percentile latency range_with_desc_sort 8.76442 ms
100th percentile latency range_with_desc_sort 8.78842 ms
50th percentile service time range_with_desc_sort 6.77996 ms
90th percentile service time range_with_desc_sort 6.91445 ms
99th percentile service time range_with_desc_sort 7.16437 ms
100th percentile service time range_with_desc_sort 7.18052 ms
error rate range_with_desc_sort 0 %

@sandeshkr419 sandeshkr419 moved this from Todo to In Progress in Performance Roadmap Aug 18, 2025
@sandeshkr419 sandeshkr419 marked this pull request as ready for review August 18, 2025 20:30
@sandeshkr419 sandeshkr419 requested a review from a team as a code owner August 18, 2025 20:30
@sandeshkr419 sandeshkr419 changed the title Micro-optimization & Code Cleanup in Date Rounding Utils Micro-optimization & Code Cleanup in Date Rounding Util Aug 18, 2025
@github-actions
Copy link
Copy Markdown
Contributor

Hello!
We have added a performance benchmark workflow that runs by adding a comment on the PR.
Please refer https://github.com/opensearch-project/OpenSearch/blob/main/PERFORMANCE_BENCHMARKS.md on how to run benchmarks on pull requests.

Copy link
Copy Markdown
Contributor

@jainankitk jainankitk left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @sandeshkr419 for this change. The improvement looks impressive, but does make given the sheer number of times, nextRoundingValue gets invoked. Also going forward, it will be better to raise separate PRs for refactoring change and the proposed improvement.

Signed-off-by: Sandesh Kumar <sandeshkr419@gmail.com>
Signed-off-by: Sandesh Kumar <sandeshkr419@gmail.com>
Signed-off-by: Sandesh Kumar <sandeshkr419@gmail.com>
@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Sep 2, 2025

✅ Gradle check result for 28207d8: SUCCESS

@sandeshkr419 sandeshkr419 changed the title Micro-optimization & Code Cleanup in Date Rounding Util Date Histogram Optimization with Date Rounding utility refactoring Sep 4, 2025
Copy link
Copy Markdown
Contributor

@asimmahmood1 asimmahmood1 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

@sandeshkr419 sandeshkr419 moved this from In Progress to In-Review in Performance Roadmap Sep 15, 2025
Signed-off-by: Sandesh Kumar <sandeshkr419@gmail.com>
@github-actions
Copy link
Copy Markdown
Contributor

✅ Gradle check result for c8226d4: SUCCESS

Signed-off-by: Sandesh Kumar <sandeshkr419@gmail.com>
@github-project-automation github-project-automation bot moved this from In-Review to In Progress in Performance Roadmap Sep 17, 2025
@github-actions
Copy link
Copy Markdown
Contributor

✅ Gradle check result for e6beff8: SUCCESS

@jainankitk jainankitk merged commit e82cd9e into opensearch-project:main Sep 17, 2025
31 checks passed
@github-project-automation github-project-automation bot moved this from In Progress to Done in Performance Roadmap Sep 17, 2025
@sandeshkr419 sandeshkr419 deleted the rounding branch September 17, 2025 20:23
jainankitk pushed a commit to jainankitk/OpenSearch that referenced this pull request Sep 22, 2025
jainankitk pushed a commit to jainankitk/OpenSearch that referenced this pull request Sep 22, 2025
…pensearch-project#19088)

---------

Signed-off-by: Sandesh Kumar <sandeshkr419@gmail.com>
Signed-off-by: Ankit Jain <jainankitk@apache.org>
jainankitk pushed a commit to jainankitk/OpenSearch that referenced this pull request Sep 22, 2025
…pensearch-project#19088)

---------

Signed-off-by: Sandesh Kumar <sandeshkr419@gmail.com>
Signed-off-by: Ankit Jain <jainankitk@apache.org>
asimmahmood1 pushed a commit to jainankitk/OpenSearch that referenced this pull request Sep 23, 2025
pranikum pushed a commit to pranikum/OpenSearch that referenced this pull request Sep 23, 2025
vinaykpud pushed a commit to vinaykpud/OpenSearch that referenced this pull request Sep 26, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

4 participants