Skip to content

Commit 4035bab

Browse files
committed
Fix worker isolation problems
1 parent 5966ed4 commit 4035bab

File tree

1 file changed

+95
-40
lines changed

1 file changed

+95
-40
lines changed

worker/src/memory_tracker_worker/processing.py

Lines changed: 95 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -28,42 +28,10 @@ def process_commits(
2828
try:
2929
repo = git.Repo(repo_path)
3030

31-
# Clean the repository first
32-
logger.info("Cleaning repository with git clean -fxd")
33-
repo.git.clean("-fxd")
34-
35-
# Configure once at the beginning
36-
logger.info("Running configure once for local checkout mode")
37-
logger.debug(f"Configure flags: {configure_flags}")
38-
39-
configure_cmd = [str(repo_path / "configure"), *configure_flags.split()]
40-
logger.debug(f"Configure command: {' '.join(configure_cmd)}")
41-
42-
result = subprocess.run(
43-
configure_cmd, cwd=repo_path, check=True, capture_output=verbose < 3
44-
)
45-
if verbose >= 3:
46-
if result.stdout:
47-
print(
48-
result.stdout.decode()
49-
if isinstance(result.stdout, bytes)
50-
else result.stdout
51-
)
52-
if result.stderr:
53-
print(
54-
result.stderr.decode()
55-
if isinstance(result.stderr, bytes)
56-
else result.stderr
57-
)
58-
5931
# Process each commit
6032
for commit in commits:
6133
logger.info(f"Processing commit {commit.hexsha[:8]} in local checkout mode")
6234

63-
# Checkout the commit
64-
logger.info(f"Checking out commit {commit.hexsha[:8]}")
65-
repo.git.checkout(commit.hexsha)
66-
6735
# Create unique directory for this run
6836
run_dir = output_dir / commit.hexsha
6937

@@ -90,6 +58,69 @@ def process_commits(
9058
logger.debug(f"Created run directory: {run_dir}")
9159

9260
try:
61+
# Create parent temp directory for this commit
62+
parent_temp_dir = Path(tempfile.mkdtemp(prefix="cpython_build_"))
63+
logger.debug(f"Parent temp directory: {parent_temp_dir}")
64+
65+
# Clone CPython repo into temp directory
66+
cpython_repo_dir = parent_temp_dir / "cpython"
67+
logger.info(f"Cloning CPython repo to temp directory for commit {commit.hexsha[:8]}")
68+
cloned_repo = git.Repo.clone_from(str(repo_path), str(cpython_repo_dir))
69+
cloned_repo.git.checkout(commit.hexsha)
70+
logger.debug(f"CPython cloned to: {cpython_repo_dir}")
71+
72+
# Create install directory within parent temp dir
73+
install_dir = parent_temp_dir / "install"
74+
install_dir.mkdir(parents=True, exist_ok=True)
75+
logger.debug(f"Install directory: {install_dir}")
76+
77+
# Configure for this commit with prefix
78+
logger.info(f"Running configure for commit {commit.hexsha[:8]}")
79+
logger.debug(f"Configure flags: {configure_flags}")
80+
81+
configure_cmd = [str(cpython_repo_dir / "configure"), f"--prefix={install_dir}", *configure_flags.split()]
82+
logger.debug(f"Configure command: {' '.join(configure_cmd)}")
83+
84+
result = subprocess.run(
85+
configure_cmd, cwd=cpython_repo_dir, check=True, capture_output=verbose < 3
86+
)
87+
if verbose >= 3:
88+
if result.stdout:
89+
print(
90+
result.stdout.decode()
91+
if isinstance(result.stdout, bytes)
92+
else result.stdout
93+
)
94+
if result.stderr:
95+
print(
96+
result.stderr.decode()
97+
if isinstance(result.stderr, bytes)
98+
else result.stderr
99+
)
100+
101+
# Clean before building
102+
logger.info(f"Running make clean for commit {commit.hexsha[:8]}")
103+
104+
clean_cmd = ["make", "clean"]
105+
logger.debug(f"Clean command: {' '.join(clean_cmd)}")
106+
107+
result = subprocess.run(
108+
clean_cmd, cwd=cpython_repo_dir, check=True, capture_output=verbose < 3
109+
)
110+
if verbose >= 3:
111+
if result.stdout:
112+
print(
113+
result.stdout.decode()
114+
if isinstance(result.stdout, bytes)
115+
else result.stdout
116+
)
117+
if result.stderr:
118+
print(
119+
result.stderr.decode()
120+
if isinstance(result.stderr, bytes)
121+
else result.stderr
122+
)
123+
93124
# Build Python using make (no make install)
94125
logger.info(f"Running make for commit {commit.hexsha[:8]}")
95126
logger.debug(f"Make flags: {make_flags}")
@@ -98,7 +129,30 @@ def process_commits(
98129
logger.debug(f"Make command: {' '.join(make_cmd)}")
99130

100131
result = subprocess.run(
101-
make_cmd, cwd=repo_path, check=True, capture_output=verbose < 3
132+
make_cmd, cwd=cpython_repo_dir, check=True, capture_output=verbose < 3
133+
)
134+
if verbose >= 3:
135+
if result.stdout:
136+
print(
137+
result.stdout.decode()
138+
if isinstance(result.stdout, bytes)
139+
else result.stdout
140+
)
141+
if result.stderr:
142+
print(
143+
result.stderr.decode()
144+
if isinstance(result.stderr, bytes)
145+
else result.stderr
146+
)
147+
148+
# Install Python
149+
logger.info(f"Running make install for commit {commit.hexsha[:8]}")
150+
151+
install_cmd = ["make", "install"]
152+
logger.debug(f"Install command: {' '.join(install_cmd)}")
153+
154+
result = subprocess.run(
155+
install_cmd, cwd=cpython_repo_dir, check=True, capture_output=verbose < 3
102156
)
103157
if verbose >= 3:
104158
if result.stdout:
@@ -114,19 +168,19 @@ def process_commits(
114168
else result.stderr
115169
)
116170

117-
# Create virtual environment using local python binary
171+
# Create virtual environment using installed python binary
118172
logger.info(
119173
f"Creating virtual environment for commit {commit.hexsha[:8]}"
120174
)
121-
venv_dir = Path(tempfile.mkdtemp(prefix="cpython_venv_"))
175+
venv_dir = parent_temp_dir / "venv"
122176
logger.debug(f"Creating virtual environment in {venv_dir}")
123177

124-
python_binary = repo_path / "python"
178+
python_binary = install_dir / "bin" / "python3"
125179
venv_cmd = [str(python_binary), "-m", "venv", str(venv_dir)]
126180
logger.debug(f"Venv command: {' '.join(venv_cmd)}")
127181

128182
result = subprocess.run(
129-
venv_cmd, check=True, capture_output=verbose < 3
183+
venv_cmd, cwd=cpython_repo_dir, check=True, capture_output=verbose < 3
130184
)
131185
if verbose >= 3:
132186
if result.stdout:
@@ -209,11 +263,12 @@ def process_commits(
209263
f"Successfully completed processing commit {commit.hexsha[:8]}"
210264
)
211265

212-
# Clean up venv directory
266+
# Clean up parent temp directory
213267
try:
214-
shutil.rmtree(venv_dir, ignore_errors=True)
268+
shutil.rmtree(parent_temp_dir, ignore_errors=True)
269+
logger.debug(f"Cleaned up parent temp directory: {parent_temp_dir}")
215270
except Exception as e:
216-
logger.warning(f"Failed to clean up venv directory {venv_dir}: {e}")
271+
logger.warning(f"Failed to clean up parent temp directory {parent_temp_dir}: {e}")
217272

218273
except subprocess.CalledProcessError as e:
219274
error_msg = f"Error processing commit {commit.hexsha}: {e}"

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy