Skip to content

Commit 16a9dce

Browse files
szachovyCopilot
andcommitted
Parallelize MySQL server startup across nodes
Use ThreadPoolExecutor to start all 3 MySQL nodes concurrently. Pre-compute shared cert chain. Failure on any node propagates via future.result(). Reduces MySQL startup from ~5 min to ~2 min. Closes #44 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 0ab8ce7 commit 16a9dce

2 files changed

Lines changed: 15 additions & 4 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1515
* Dependabot updates for `github-actions` and `terraform` ecosystems. (#29)
1616
* CI workflow to build and push service images to GitHub Container Registry on master merge. (#97)
1717
* Pull-first with local build fallback for container images during deployment. (#97)
18+
* Parallelize MySQL server startup across all 3 nodes with ThreadPoolExecutor. (#44)
1819

1920
### Changed
2021

src/initialize.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
import sys
5757
import re
5858
import socket
59+
from concurrent.futures import ThreadPoolExecutor, as_completed
5960

6061
import crypto
6162
import decorators
@@ -160,7 +161,12 @@ def get_mylogin_cnf(self, node: remote.RemoteConnection) -> bytes:
160161
raise ValueError("Fetched MYSQL_TEST_LOGIN_FILE invalid")
161162

162163
def start_mysql_servers(self) -> None:
163-
for node in self.mysql_nodes:
164+
ca_key_pem = self.cert_manager.deserialization(self.ca_key)
165+
ca_chain_pem = "".join(
166+
self.cert_manager.deserialization(node.certificate) for node in self.mysql_nodes
167+
) + self.cert_manager.deserialization(self.ca_certificate)
168+
169+
def start_single_node(node: remote.RemoteConnection) -> None:
164170
node.upload_directory(
165171
local_directory_path="./services/mysql-server",
166172
remote_directory_path="/opt/superset-cluster/mysql-server"
@@ -170,11 +176,10 @@ def start_mysql_servers(self) -> None:
170176
remote_file_path="/opt/superset-cluster/mysql-server/mysql_root_password"
171177
)
172178
node.upload_file(
173-
content=self.cert_manager.deserialization(self.ca_key),
179+
content=ca_key_pem,
174180
remote_file_path="/opt/superset-cluster/mysql-server/superset_cluster_ca_key.pem")
175181
node.upload_file(
176-
content="".join(self.cert_manager.deserialization(node.certificate) for node in self.mysql_nodes)
177-
+ self.cert_manager.deserialization(self.ca_certificate),
182+
content=ca_chain_pem,
178183
remote_file_path="/opt/superset-cluster/mysql-server/superset_cluster_ca_certificate.pem"
179184
)
180185
node.upload_file(
@@ -191,6 +196,11 @@ def start_mysql_servers(self) -> None:
191196
).run_mysql_server()"
192197
)
193198

199+
with ThreadPoolExecutor(max_workers=3) as executor:
200+
futures = {executor.submit(start_single_node, node): node for node in self.mysql_nodes}
201+
for future in as_completed(futures):
202+
future.result()
203+
194204
def start_mysql_mgmt(self, node: remote.RemoteConnection, state: str, priority: int) -> None:
195205
node.upload_directory(
196206
local_directory_path="./services/mysql-mgmt",

0 commit comments

Comments
 (0)