Skip to content

fix: close cross-validation executor pools - #2745

Merged
tcuongd merged 2 commits into
facebook:mainfrom
mameikagou:fix/cross-validation-pool-cleanup
Aug 27, 2026
Merged

tcuongd merged 2 commits into
facebook:mainfrom
mameikagou:fix/cross-validation-pool-cleanup

Conversation

@mameikagou

@mameikagou mameikagou commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Fixes #2355.

This applies the executor cleanup proposed in #2738 and adds focused regression coverage.

What changed

  • Shut down internally created thread and process executors after cross-validation, including error paths.
  • Preserve caller-owned executors and Dask clients.
  • Cover repeated runs, mapping failures, and caller-owned executors.

Verification

  • Focused diagnostics tests: 5 passed
  • Python compile check
  • git diff --check
  • Pyrefly 0.50.0: 0 errors (18 existing suppressions), all 9 configured modules checked. The local hidden-directory exclusion heuristic was disabled; project includes/excludes were unchanged.

@meta-cla

meta-cla Bot commented Aug 27, 2026

Copy link
Copy Markdown

Hi @mameikagou!

Thank you for your pull request and welcome to our community.

Action Required

In order to merge any pull request (code, docs, etc.), we require contributors to sign our Contributor License Agreement, and we don't seem to have one on file for you.

Process

In order for us to review and merge your suggested changes, please sign at https://code.facebook.com/cla. If you are contributing on behalf of someone else (eg your employer), the individual CLA may not be sufficient and your employer may need to sign the corporate CLA.

Once the CLA is signed, our tooling will perform checks and validations. Afterwards, the pull request will be tagged with CLA signed. The tagging process may take up to 1 hour after signing. Please give it that time before contacting us about it.

If you have received this in error or have any questions, please contact us at cla@meta.com. Thanks!

@tcuongd tcuongd left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM but with a couple of suggestions. Type checking is also failing, PTAL. Thank you!

Comment thread python/prophet/diagnostics.py Outdated
# convert Futures to DataFrames
predicts = cast("dd.Client", pool).gather(predicts)
finally:
if _owns_pool:

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

At this stage it probably makes more sense to check whether pool is an instance of concurrent.futures.Executor rather than manually assign _owns_pool.

def shutdown(self, wait=True):
self.shutdown_calls += 1

monkeypatch.setattr(

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Maybe it's easier to just subclass concurrent.futures.ThreadPoolExecutor?

@mameikagou

Copy link
Copy Markdown
Contributor Author

Thanks, updated in 2cd2510. Cleanup now uses the Executor type guard while remaining limited to internally created pools. The tests subclass ThreadPoolExecutor and confirm that a caller-owned executor remains usable after cross-validation. All five focused tests and the configured Pyrefly 0.50.0 check pass locally.

@tcuongd
tcuongd merged commit 79ef5ec into facebook:main Aug 27, 2026
7 of 8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Using cross_validation results in OSError: [Errno 24] Too many open files

2 participants