Skip to content

Conversation

martin-gaievski
Copy link
Member

Description

Enable smoke tests for search-relevance plugin

Issues Resolved

N/A

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.

@martin-gaievski martin-gaievski force-pushed the onboard_search_relevance_on_smoke_testing branch from 30c7c91 to e868477 Compare June 12, 2025 01:09
@martin-gaievski
Copy link
Member Author

tried to test spec against latest 3.1.0 build, got following errors. Looks like some specifications are not correct:

./test.sh smoke-test manifests/3.1.0/opensearch-3.1.0-test.yml --component search-relevance --paths opensearch=https://ci.opensearch.org/ci/dbc/distribution-build-opensearch/3.1.0/11164/linux/x64/tar
Installing dependencies in . ...
Installing dependencies from Pipfile.lock (6b7adf)...
To activate this project's virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv run.
Running ./src/run_smoke_test.py manifests/3.1.0/opensearch-3.1.0-test.yml --component search-relevance --paths opensearch=https://ci.opensearch.org/ci/dbc/distribution-build-opensearch/3.1.0/11164/linux/x64/tar ...
2025-06-12 01:10:07 INFO     Loading /home/ci-runner/dev/opensearch-build/manifests/3.1.0/opensearch-3.1.0-test.yml
2025-06-12 01:10:07 INFO     TestRecorder recording logs in /home/ci-runner/dev/opensearch-build/test-results/23671ef82de64aecbb412904e9148d8b/smoke-test
2025-06-12 01:10:07 INFO     Entering Smoke test for OpenSearch Bundle.
2025-06-12 01:10:08 INFO     Downloaded latest spec from https://github.com/opensearch-project/opensearch-api-specification/releases/download/main-latest/opensearch-openapi.yaml
2025-06-12 01:10:09 INFO     Initiating smoke tests.
2025-06-12 01:10:09 INFO     Loading /home/ci-runner/dev/opensearch-build/manifests/3.1.0/opensearch-3.1.0-test.yml
2025-06-12 01:10:37 INFO     Installing opensearch-3.1.0-linux-x64.tar.gz in /tmp/tmpsk_5qw0d/opensearch-3.1.0
2025-06-12 01:10:45 INFO     Cluster is installed and ready to be start.
2025-06-12 01:10:45 INFO     Started OpenSearch with parent PID 1821
2025-06-12 01:11:15 INFO     Cluster is started.
2025-06-12 01:11:15 INFO     Attempt 1 of 10 to check cluster.
2025-06-12 01:11:15 INFO     Pinging https://localhost:9200/
/home/ci-runner/.local/share/virtualenvs/opensearch-build-_9FOMupj/lib/python3.9/site-packages/urllib3/connectionpool.py:1099: InsecureRequestWarning: Unverified HTTPS request is being made to host 'localhost'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings
  warnings.warn(
2025-06-12 01:11:15 INFO     Cluster response is {
  "name" : "290947788de8",
  "cluster_name" : "opensearch",
  "cluster_uuid" : "l8OvgpkARPiAkKYjRz2x6g",
  "version" : {
    "distribution" : "opensearch",
    "number" : "3.1.0",
    "build_type" : "tar",
    "build_hash" : "f7ebe22b39f8c2ccae6f22f9b7776995a2c19be1",
    "build_date" : "2025-06-11T18:15:18.105583606Z",
    "build_snapshot" : false,
    "lucene_version" : "10.2.1",
    "minimum_wire_compatibility_version" : "2.19.0",
    "minimum_index_compatibility_version" : "2.0.0"
  },
  "tagline" : "The OpenSearch Project: https://opensearch.org/"
}

2025-06-12 01:11:15 INFO     Skipping OpenSearch
2025-06-12 01:11:15 INFO     Skipping alerting
2025-06-12 01:11:15 INFO     Skipping anomaly-detection
2025-06-12 01:11:15 INFO     Skipping flow-framework
2025-06-12 01:11:15 INFO     Skipping asynchronous-search
2025-06-12 01:11:15 INFO     Skipping cross-cluster-replication
2025-06-12 01:11:15 INFO     Skipping geospatial
2025-06-12 01:11:15 INFO     Skipping index-management
2025-06-12 01:11:15 INFO     Skipping k-NN
2025-06-12 01:11:15 INFO     Skipping ml-commons
2025-06-12 01:11:15 INFO     Skipping opensearch-learning-to-rank-base
2025-06-12 01:11:15 INFO     Skipping neural-search
2025-06-12 01:11:15 INFO     Skipping notifications
2025-06-12 01:11:15 INFO     Skipping opensearch-observability
2025-06-12 01:11:15 INFO     Skipping opensearch-reports
2025-06-12 01:11:15 INFO     Skipping security
2025-06-12 01:11:15 INFO     Skipping security-analytics
2025-06-12 01:11:15 INFO     Skipping sql
2025-06-12 01:11:15 INFO     Skipping custom-codecs
2025-06-12 01:11:15 INFO     Skipping skills
2025-06-12 01:11:15 INFO     Skipping query-insights
2025-06-12 01:11:15 INFO     Skipping opensearch-system-templates
2025-06-12 01:11:15 INFO     Skipping user-behavior-insights
2025-06-12 01:11:15 INFO     Running smoke test on search-relevance component.
2025-06-12 01:11:15 INFO     No spec found at f/home/ci-runner/dev/opensearch-build/src/test_workflow/smoke_test/smoke_tests_spec/3.x/search-relevance.yml
2025-06-12 01:11:15 INFO     Component spec for search-relevance with path /home/ci-runner/dev/opensearch-build/src/test_workflow/smoke_test/smoke_tests_spec/default/search-relevance.yml is found.
2025-06-12 01:11:15 INFO     component spec is {'/_cluster/settings': {'PUT': {'parameters': [{'transient': {'plugins.search_relevance.workbench_enabled': True}}]}}, '/_plugins/_search_relevance/search_configurations': {'PUT': {'parameters': [{'name': 'test_search_config', 'index': 'test_index', 'query': '{\\"query\\": {\\"match_all\\": {}}}', 'searchPipeline': 'test_pipeline'}]}}, '/_plugins/_search_relevance/query_sets': {'PUT': {'parameters': [{'name': 'query_set', 'description': 'Test query set', 'sampling': 'manual', 'querySetQueries': [{'queryText': 'phone'}, {'queryText': 'iphone'}, {'queryText': 'steel'}, {'queryText': 'keyboard'}, {'queryText': 'diamond wheel'}, {'queryText': 'button'}, {'queryText': 'metal frame'}, {'queryText': 'giangentic form'}]}]}}, '/_plugins/_search_relevance/judgments': {'PUT': {'parameters': [{'name': 'ESCI Judgments', 'description': 'Judgments generated outside SRW', 'type': 'IMPORT_JUDGMENT', 'judgmentRatings': [{'query': 'button', 'ratings': [{'docId': 'B07D29PHFY', 'rating': '0.6'}, {'docId': 'B06Y1L1YJD', 'rating': '0.7'}, {'docId': 'B01M3XBRRX', 'rating': '0.9'}]}, {'query': 'keyboard', 'ratings': [{'docId': 'B01D8YNJH0', 'rating': '1.0'}]}, {'query': 'giangentic form', 'ratings': [{'docId': 'B08KH3GFXL', 'rating': '0.4'}]}, {'query': 'metal frame', 'ratings': [{'docId': 'B07MBG53JD', 'rating': '0.6'}, {'docId': 'B097Q69V1B', 'rating': '0.9'}, {'docId': 'B07H81Z91C', 'rating': '0.7'}, {'docId': 'B00TLYRBMG', 'rating': '0.2'}, {'docId': 'B08G46SS1T', 'rating': '0.7'}]}]}]}}, '/_plugins/_search_relevance/stats': {'GET': {'parameters': []}}}
2025-06-12 01:11:15 INFO     Validating api request /_cluster/settings
2025-06-12 01:11:15 INFO     API request URL is https://localhost:9200/_cluster/settings
2025-06-12 01:11:15 INFO     Parameter is {"transient": {"plugins.search_relevance.workbench_enabled": true}}
 and type is <class 'str'>
2025-06-12 01:11:15 INFO     header is {'Content-Type': 'application/json'}
/home/ci-runner/.local/share/virtualenvs/opensearch-build-_9FOMupj/lib/python3.9/site-packages/urllib3/connectionpool.py:1099: InsecureRequestWarning: Unverified HTTPS request is being made to host 'localhost'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings
  warnings.warn(
2025-06-12 01:11:15 INFO     Response is
{"acknowledged":true,"persistent":{},"transient":{"plugins":{"search_relevance":{"workbench_enabled":"true"}}}}
2025-06-12 01:11:27 INFO     Response is validated.
2025-06-12 01:11:27 INFO     Recording test result for search-relevance component, config PUT___cluster_settings
2025-06-12 01:11:27 INFO     Walking tree from /home/ci-runner/dev/opensearch-build/test-results/23671ef82de64aecbb412904e9148d8b/smoke-test/search-relevance/PUT___cluster_settings
2025-06-12 01:11:27 INFO     Validating api request /_plugins/_search_relevance/search_configurations
2025-06-12 01:11:27 INFO     API request URL is https://localhost:9200/_plugins/_search_relevance/search_configurations
2025-06-12 01:11:27 INFO     Parameter is {"name": "test_search_config", "index": "test_index", "query": "{\\\"query\\\": {\\\"match_all\\\": {}}}", "searchPipeline": "test_pipeline"}
 and type is <class 'str'>
2025-06-12 01:11:27 INFO     header is {'Content-Type': 'application/json'}
/home/ci-runner/.local/share/virtualenvs/opensearch-build-_9FOMupj/lib/python3.9/site-packages/urllib3/connectionpool.py:1099: InsecureRequestWarning: Unverified HTTPS request is being made to host 'localhost'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings
  warnings.warn(
2025-06-12 01:11:27 INFO     Response is
{"search_configuration_id":"82184c91-56b0-4d7b-a5bb-26ee7e6f531d","search_configuration_result":"CREATED"}
2025-06-12 01:11:38 ERROR    Unexpected Error type is <class 'openapi_core.templating.paths.exceptions.ServerNotFound'>
2025-06-12 01:11:38 ERROR    Server not found for https://localhost:9200/_plugins/_search_relevance/search_configurations
2025-06-12 01:11:38 INFO     Response is not validated. Please check the response output text above.
2025-06-12 01:11:38 INFO     Recording test result for search-relevance component, config PUT___plugins__search_relevance_search_configurations
2025-06-12 01:11:38 INFO     Walking tree from /home/ci-runner/dev/opensearch-build/test-results/23671ef82de64aecbb412904e9148d8b/smoke-test/search-relevance/PUT___plugins__search_relevance_search_configurations
2025-06-12 01:11:38 INFO     Validating api request /_plugins/_search_relevance/query_sets
2025-06-12 01:11:38 INFO     API request URL is https://localhost:9200/_plugins/_search_relevance/query_sets
2025-06-12 01:11:38 INFO     Parameter is {"name": "query_set", "description": "Test query set", "sampling": "manual", "querySetQueries": [{"queryText": "phone"}, {"queryText": "iphone"}, {"queryText": "steel"}, {"queryText": "keyboard"}, {"queryText": "diamond wheel"}, {"queryText": "button"}, {"queryText": "metal frame"}, {"queryText": "giangentic form"}]}
 and type is <class 'str'>
2025-06-12 01:11:38 INFO     header is {'Content-Type': 'application/json'}
/home/ci-runner/.local/share/virtualenvs/opensearch-build-_9FOMupj/lib/python3.9/site-packages/urllib3/connectionpool.py:1099: InsecureRequestWarning: Unverified HTTPS request is being made to host 'localhost'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings
  warnings.warn(
2025-06-12 01:11:39 INFO     Response is
{"query_set_id":"fe6a9da1-2fe6-4c9f-bea5-3ef7164fe413","query_set_result":"CREATED"}
2025-06-12 01:11:50 ERROR    Unexpected Error type is <class 'openapi_core.templating.paths.exceptions.ServerNotFound'>
2025-06-12 01:11:50 ERROR    Server not found for https://localhost:9200/_plugins/_search_relevance/query_sets
2025-06-12 01:11:50 INFO     Response is not validated. Please check the response output text above.
2025-06-12 01:11:50 INFO     Recording test result for search-relevance component, config PUT___plugins__search_relevance_query_sets
2025-06-12 01:11:50 INFO     Walking tree from /home/ci-runner/dev/opensearch-build/test-results/23671ef82de64aecbb412904e9148d8b/smoke-test/search-relevance/PUT___plugins__search_relevance_query_sets
2025-06-12 01:11:50 INFO     Validating api request /_plugins/_search_relevance/judgments
2025-06-12 01:11:50 INFO     API request URL is https://localhost:9200/_plugins/_search_relevance/judgments
2025-06-12 01:11:50 INFO     Parameter is {"name": "ESCI Judgments", "description": "Judgments generated outside SRW", "type": "IMPORT_JUDGMENT", "judgmentRatings": [{"query": "button", "ratings": [{"docId": "B07D29PHFY", "rating": "0.6"}, {"docId": "B06Y1L1YJD", "rating": "0.7"}, {"docId": "B01M3XBRRX", "rating": "0.9"}]}, {"query": "keyboard", "ratings": [{"docId": "B01D8YNJH0", "rating": "1.0"}]}, {"query": "giangentic form", "ratings": [{"docId": "B08KH3GFXL", "rating": "0.4"}]}, {"query": "metal frame", "ratings": [{"docId": "B07MBG53JD", "rating": "0.6"}, {"docId": "B097Q69V1B", "rating": "0.9"}, {"docId": "B07H81Z91C", "rating": "0.7"}, {"docId": "B00TLYRBMG", "rating": "0.2"}, {"docId": "B08G46SS1T", "rating": "0.7"}]}]}
 and type is <class 'str'>
2025-06-12 01:11:50 INFO     header is {'Content-Type': 'application/json'}
/home/ci-runner/.local/share/virtualenvs/opensearch-build-_9FOMupj/lib/python3.9/site-packages/urllib3/connectionpool.py:1099: InsecureRequestWarning: Unverified HTTPS request is being made to host 'localhost'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings
  warnings.warn(
2025-06-12 01:11:50 INFO     Response is
{"judgment_id":"3af0ad98-5edd-41bf-a49d-8d90c030f08c"}
2025-06-12 01:12:02 ERROR    Unexpected Error type is <class 'openapi_core.templating.paths.exceptions.ServerNotFound'>
2025-06-12 01:12:02 ERROR    Server not found for https://localhost:9200/_plugins/_search_relevance/judgments
2025-06-12 01:12:02 INFO     Response is not validated. Please check the response output text above.
2025-06-12 01:12:02 INFO     Recording test result for search-relevance component, config PUT___plugins__search_relevance_judgments
2025-06-12 01:12:02 INFO     Walking tree from /home/ci-runner/dev/opensearch-build/test-results/23671ef82de64aecbb412904e9148d8b/smoke-test/search-relevance/PUT___plugins__search_relevance_judgments
2025-06-12 01:12:02 INFO     Validating api request /_plugins/_search_relevance/stats
2025-06-12 01:12:02 INFO     API request URL is https://localhost:9200/_plugins/_search_relevance/stats
2025-06-12 01:12:02 INFO     Parameter is  and type is <class 'str'>
2025-06-12 01:12:02 INFO     header is {'Content-Type': 'application/json'}
/home/ci-runner/.local/share/virtualenvs/opensearch-build-_9FOMupj/lib/python3.9/site-packages/urllib3/connectionpool.py:1099: InsecureRequestWarning: Unverified HTTPS request is being made to host 'localhost'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings
  warnings.warn(
2025-06-12 01:12:02 INFO     Response is
{"_nodes":{"total":1,"successful":1,"failed":0},"cluster_name":"opensearch","info":{"cluster_version":"3.1.0"},"all_nodes":{"judgments":{"import_judgment_rating_generations":1,"llm_judgment_rating_generations":0,"ubi_judgment_rating_generations":0},"experiments":{"experiment_hybrid_optimizer_executions":0,"experiment_pairwise_comparison_executions":0,"experiment_executions":0,"experiment_pointwise_evaluation_executions":0}},"nodes":{"bfrIDCJgTY2dzjaFBure7g":{"judgments":{"import_judgment_rating_generations":1,"llm_judgment_rating_generations":0,"ubi_judgment_rating_generations":0},"experiments":{"experiment_hybrid_optimizer_executions":0,"experiment_pairwise_comparison_executions":0,"experiment_executions":0,"experiment_pointwise_evaluation_executions":0}}}}
2025-06-12 01:12:13 ERROR    Unexpected Error type is <class 'openapi_core.templating.paths.exceptions.ServerNotFound'>
2025-06-12 01:12:13 ERROR    Server not found for https://localhost:9200/_plugins/_search_relevance/stats
2025-06-12 01:12:13 INFO     Response is not validated. Please check the response output text above.
2025-06-12 01:12:13 INFO     Recording test result for search-relevance component, config GET___plugins__search_relevance_stats
2025-06-12 01:12:13 INFO     Walking tree from /home/ci-runner/dev/opensearch-build/test-results/23671ef82de64aecbb412904e9148d8b/smoke-test/search-relevance/GET___plugins__search_relevance_stats
2025-06-12 01:12:13 INFO     Terminating and uninstalling the cluster.
2025-06-12 01:12:13 INFO     Sending SIGKILL to PID 1821
2025-06-12 01:12:13 INFO     Process killed with exit code None
2025-06-12 01:12:13 INFO     Recording local cluster logs for at /home/ci-runner/dev/opensearch-build/test-results/23671ef82de64aecbb412904e9148d8b/smoke-test/local-cluster-logs
2025-06-12 01:12:13 INFO     Cluster is terminated.
2025-06-12 01:12:13 INFO     Removing /tmp/tmpsk_5qw0d
2025-06-12 01:12:13 INFO     | search-relevance     | /_cluster/settings PUT | PASS  |
2025-06-12 01:12:13 ERROR    | search-relevance     | /_plugins/_search_relevance/judgments PUT | FAIL  |
2025-06-12 01:12:13 ERROR    | search-relevance     | /_plugins/_search_relevance/query_sets PUT | FAIL  |
2025-06-12 01:12:13 ERROR    | search-relevance     | /_plugins/_search_relevance/search_configurations PUT | FAIL  |
2025-06-12 01:12:13 ERROR    | search-relevance     | /_plugins/_search_relevance/stats GET | FAIL  |

@martin-gaievski martin-gaievski force-pushed the onboard_search_relevance_on_smoke_testing branch from 56a5882 to 932fb1b Compare June 12, 2025 18:07
@martin-gaievski martin-gaievski marked this pull request as ready for review June 12, 2025 18:25
Copy link
Member

@zelinh zelinh left a comment

Choose a reason for hiding this comment

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

Thanks for the PR here. Are we still waiting for the updates in the API specification repo?

@martin-gaievski
Copy link
Member Author

[FEATURE] Update the search relevance workbench api opensearch-project/opensearch-api-specification#919

PR from @ajleong623 for spec updates is still open, but looks like we're getting responses from all APIs even without that PR.

@zelinh
Copy link
Member

zelinh commented Jun 12, 2025

[FEATURE] Update the search relevance workbench api opensearch-project/opensearch-api-specification#919

PR from @ajleong623 for spec updates is still open, but looks like we're getting responses from all APIs even without that PR.

Yeah the responses come from the plugin itself while this smoke tests framework relies on the API spec as source of truth to validate. Even the responses were expected but not fully align with api spec, this smoke tests validation would fail.

@ajleong623
Copy link

@zelinh would the changes in the api specification affect the manifests CI check? I have been working on understanding how the changes in the api spec actually affect the smoke tests. The only other changes I made were creating the dockerfile/docker-compose.yml in the plugin test and adding to the workflow (https://github.com/opensearch-project/opensearch-api-specification/blob/main/.github/workflows/test-spec.yml). I am not sure if those other changes actually affect the build tool or the verification.

@zelinh
Copy link
Member

zelinh commented Jun 12, 2025

@zelinh would the changes in the api specification affect the manifests CI check? I have been working on understanding how the changes in the api spec actually affect the smoke tests. The only other changes I made were creating the dockerfile/docker-compose.yml in the plugin test and adding to the workflow (https://github.com/opensearch-project/opensearch-api-specification/blob/main/.github/workflows/test-spec.yml). I am not sure if those other changes actually affect the build tool or the verification.

No it shouldn't affect the manifest CI check in this PR. I took a quick look and seems like the env setup for the manifest CI check failed. Just triggered re-run and now it's good.

The smoke tests relies on api-spec and it's not checked on this CI level; it would failed when it's not validated with api-spec when triggering such workflow for example ./test.sh smoke-test manifests/3.1.0/opensearch-3.1.0-test.yml --component search-relevance --paths opensearch=https://ci.opensearch.org/ci/dbc/distribution-build-opensearch/3.1.0/11164/linux/x64/tar as @martin-gaievski posted above.

@ajleong623
Copy link

@zelinh Got it. So the solution would be to push the updated specification to the repository?

@zelinh
Copy link
Member

zelinh commented Jun 13, 2025

@zelinh Got it. So the solution would be to push the updated specification to the repository?

Yes. All changes should be made to api-spec repo. You only provide API path and any parameters here in opensearch-build repo.

@ajleong623
Copy link

ajleong623 commented Jun 13, 2025

@zelinh just to confirm, the GitHub workflow folder in the api spec repository and the docker compose in the test folder of the api spec repository are not being used in the verification process? It’s only the spec/namespace folder? I looked at the code, and it looks like the test runner only compares with a static file of the specification.

@zelinh
Copy link
Member

zelinh commented Jun 13, 2025

@zelinh just to confirm, the GitHub workflow folder in the api spec repository and the docker compose in the test folder of the api spec repository are not being used in the verification process? It’s only the spec/namespace folder? I looked at the code, and it looks like the test runner only compares with a static file of the specification.

Workflow or CI tests in api-spec repo has nothing to do with the smoke test framework here. Smoke test will only consume opensearch-openapi.yaml file from this link which compiled from all plugins OpenAPI.

@zelinh
Copy link
Member

zelinh commented Jun 17, 2025

Seems like we have everything updated.
Do we have anything left or we could move forward with this PR?
@martin-gaievski @ajleong623

@ajleong623
Copy link

@zelinh I believe the api specs work now. I did run it on my end.

Copy link
Member

@zelinh zelinh left a comment

Choose a reason for hiding this comment

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

2025-06-17 14:35:47 INFO     | search-relevance     | /_cluster/settings PUT | PASS  |
2025-06-17 14:35:47 INFO     | search-relevance     | /_plugins/_search_relevance/judgments PUT | PASS  |
2025-06-17 14:35:47 INFO     | search-relevance     | /_plugins/_search_relevance/query_sets PUT | PASS  |
2025-06-17 14:35:47 INFO     | search-relevance     | /_plugins/_search_relevance/search_configurations PUT | PASS  |
2025-06-17 14:35:47 INFO     | search-relevance     | /_plugins/_search_relevance/stats GET | PASS  |

LGTM! Thanks!

@zelinh zelinh merged commit d2ac2e7 into opensearch-project:main Jun 18, 2025
16 of 18 checks passed
@github-project-automation github-project-automation bot moved this from 👀 In Review to ✅ Done in Engineering Effectiveness Board Jun 18, 2025
@martin-gaievski
Copy link
Member Author

@zelinh will this change be reflected in test runs for 3.1 version or only in future releases?

@zelinh
Copy link
Member

zelinh commented Jun 18, 2025

@zelinh will this change be reflected in test runs for 3.1 version or only in future releases?

We have a cron job that triggered by our build job for running these tests. https://build.ci.opensearch.org/job/smoke-test/
It should be reflected to all 3.x releases.

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.

3 participants