You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@beam.apache.org by jr...@apache.org on 2024/09/20 16:50:31 UTC
(beam) branch master updated: [Python] Fix bug where WorkerHandlerManager.close_all re-initialized state with incorrect dict type (#32517)
This is an automated email from the ASF dual-hosted git repository.
jrmccluskey pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/beam.git
The following commit(s) were added to refs/heads/master by this push:
new f2d0558ad58 [Python] Fix bug where WorkerHandlerManager.close_all re-initialized state with incorrect dict type (#32517)
f2d0558ad58 is described below
commit f2d0558ad580a0091e4efb1c8a8d71c2185222d5
Author: Hai Joey Tran <jo...@schrodinger.com>
AuthorDate: Fri Sep 20 12:50:25 2024 -0400
[Python] Fix bug where WorkerHandlerManager.close_all re-initialized state with incorrect dict type (#32517)
* Add test case
* Fix close_all so it uses defaultdict for _cached_handlers
* Fix lint issue with unittest main
---
.../portability/fn_api_runner/worker_handlers.py | 2 +-
.../fn_api_runner/worker_handlers_test.py | 52 ++++++++++++++++++++++
2 files changed, 53 insertions(+), 1 deletion(-)
diff --git a/sdks/python/apache_beam/runners/portability/fn_api_runner/worker_handlers.py b/sdks/python/apache_beam/runners/portability/fn_api_runner/worker_handlers.py
index eb40ced2da0..bcfa965c046 100644
--- a/sdks/python/apache_beam/runners/portability/fn_api_runner/worker_handlers.py
+++ b/sdks/python/apache_beam/runners/portability/fn_api_runner/worker_handlers.py
@@ -939,7 +939,7 @@ class WorkerHandlerManager(object):
except Exception:
_LOGGER.error(
"Error closing worker_handler %s" % worker_handler, exc_info=True)
- self._cached_handlers = {} # type: ignore[assignment]
+ self._cached_handlers = collections.defaultdict(list)
self._workers_by_id = {}
if self._grpc_server is not None:
self._grpc_server.close()
diff --git a/sdks/python/apache_beam/runners/portability/fn_api_runner/worker_handlers_test.py b/sdks/python/apache_beam/runners/portability/fn_api_runner/worker_handlers_test.py
new file mode 100644
index 00000000000..832e7ecee80
--- /dev/null
+++ b/sdks/python/apache_beam/runners/portability/fn_api_runner/worker_handlers_test.py
@@ -0,0 +1,52 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# pytype: skip-file
+import logging
+import unittest
+
+from apache_beam.portability.api import beam_provision_api_pb2
+from apache_beam.runners.portability.fn_api_runner.fn_runner import ExtendedProvisionInfo
+from apache_beam.runners.portability.fn_api_runner.worker_handlers import WorkerHandlerManager
+from apache_beam.transforms import environments
+
+_LOGGER = logging.getLogger(__name__)
+
+
+class WorkerHandlerManagerTest(unittest.TestCase):
+ def test_close_all(self):
+ inprocess_env = environments.EmbeddedPythonEnvironment(
+ capabilities=environments.python_sdk_capabilities(),
+ artifacts=(),
+ resource_hints={}).to_runner_api(None)
+ envs = {
+ 'inprocess': inprocess_env,
+ }
+ prov_info = ExtendedProvisionInfo(
+ beam_provision_api_pb2.ProvisionInfo(
+ retrieval_token='unused-retrieval-token'))
+
+ manager = WorkerHandlerManager(envs, job_provision_info=prov_info)
+ first_workers = manager.get_worker_handlers('inprocess', 1)
+ manager.close_all()
+ second_workers = manager.get_worker_handlers('inprocess', 1)
+ assert len(first_workers) == len(second_workers) == 1
+ assert first_workers != second_workers
+
+
+if __name__ == '__main__':
+ logging.getLogger().setLevel(logging.INFO)
+ unittest.main()