django-lambda-tasks 0.6.3__tar.gz → 0.6.5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/PKG-INFO +1 -1
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/lambda_tasks/handler.py +11 -3
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/lambda_tasks/local_executor.py +18 -6
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/pyproject.toml +1 -1
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/tests/test_local_executor.py +19 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/tests/test_memory_limit.py +52 -4
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.github/workflows/ci.yml +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.github/workflows/release.yml +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.gitignore +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/async-local-execution/.config.kiro +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/async-local-execution/design.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/async-local-execution/requirements.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/async-local-execution/tasks.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/deferred-task-enqueue/.config.kiro +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/deferred-task-enqueue/design.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/deferred-task-enqueue/requirements.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/deferred-task-enqueue/tasks.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/eager-mode-example-app/.config.kiro +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/eager-mode-example-app/design.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/eager-mode-example-app/requirements.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/eager-mode-example-app/tasks.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/ignore-errors-decorator-option/.config.kiro +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/ignore-errors-decorator-option/design.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/ignore-errors-decorator-option/requirements.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/ignore-errors-decorator-option/tasks.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/import-string-task-resolution/.config.kiro +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/import-string-task-resolution/design.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/import-string-task-resolution/requirements.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/import-string-task-resolution/tasks.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/retry-delay/.config.kiro +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/retry-delay/design.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/retry-delay/requirements.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/retry-delay/tasks.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/rse-background-tasks/.config.kiro +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/rse-background-tasks/design.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/rse-background-tasks/requirements.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/rse-background-tasks/tasks.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/rse-background-tasks-bugfix/.config.kiro +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/rse-background-tasks-bugfix/bugfix.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/rse-background-tasks-bugfix/design.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/rse-background-tasks-bugfix/tasks.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/singleton-task/.config.kiro +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/singleton-task/design.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/singleton-task/requirements.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/singleton-task/tasks.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/ssm-environment-loader/.config.kiro +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/ssm-environment-loader/design.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/ssm-environment-loader/requirements.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/ssm-environment-loader/tasks.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/task-retry/.config.kiro +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/task-retry/design.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/task-retry/requirements.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/task-retry/tasks.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/steering/product.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/steering/structure.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/steering/tech.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.pre-commit-config.yaml +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.vscode/settings.json +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/README.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/example/README.md +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/example/example_app/__init__.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/example/example_app/apps.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/example/example_app/tasks.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/example/example_app/urls.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/example/example_app/views.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/example/example_project/__init__.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/example/example_project/settings.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/example/example_project/urls.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/example/example_project/wsgi.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/example/manage.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/lambda_tasks/__init__.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/lambda_tasks/admin.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/lambda_tasks/apps.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/lambda_tasks/decorators.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/lambda_tasks/environment_loader.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/lambda_tasks/logging.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/lambda_tasks/migrations/0001_initial.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/lambda_tasks/migrations/0002_alter_taskrecord_status.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/lambda_tasks/migrations/__init__.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/lambda_tasks/models.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/lambda_tasks/secret_loader.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/lambda_tasks/settings.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/lambda_tasks/tasks.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/lambda_tasks/timeouts.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/tests/conftest.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/tests/settings.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/tests/test_admin.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/tests/test_batch.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/tests/test_batch_worker.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/tests/test_decorator.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/tests/test_decorators.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/tests/test_deferred_enqueue.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/tests/test_environment_loader.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/tests/test_handler.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/tests/test_kwargs_only.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/tests/test_logging.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/tests/test_models.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/tests/test_secret_loader.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/tests/test_serializer.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/tests/test_settings.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/tests/test_tasks.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/tests/test_timeout_validation.py +0 -0
- {django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/tests/test_timeouts.py +0 -0
|
@@ -32,19 +32,27 @@ _cold_start_done: bool = False
|
|
|
32
32
|
|
|
33
33
|
_MEMORY_RESERVED_MB = 128
|
|
34
34
|
_MEMORY_MINIMUM_LIMIT_MB = 64
|
|
35
|
-
|
|
35
|
+
_CGROUP_V2_MEMORY_MAX_PATH = Path("/sys/fs/cgroup/memory.max")
|
|
36
|
+
_CGROUP_V1_MEMORY_LIMIT_PATH = Path("/sys/fs/cgroup/memory/memory.limit_in_bytes")
|
|
36
37
|
|
|
37
38
|
|
|
38
39
|
def _get_memory_mb() -> int | None:
|
|
39
|
-
"""Get container memory limit from Lambda env var or cgroup
|
|
40
|
+
"""Get container memory limit from Lambda env var or cgroup."""
|
|
40
41
|
memory_mb_str = os.environ.get("AWS_LAMBDA_FUNCTION_MEMORY_SIZE")
|
|
41
42
|
if memory_mb_str is not None:
|
|
42
43
|
return int(memory_mb_str)
|
|
43
44
|
|
|
44
45
|
try:
|
|
45
|
-
value =
|
|
46
|
+
value = _CGROUP_V2_MEMORY_MAX_PATH.read_text().strip()
|
|
46
47
|
if value == "max":
|
|
47
48
|
return None
|
|
49
|
+
else:
|
|
50
|
+
return int(value) // (1024 * 1024)
|
|
51
|
+
except (FileNotFoundError, ValueError):
|
|
52
|
+
pass
|
|
53
|
+
|
|
54
|
+
try:
|
|
55
|
+
value = _CGROUP_V1_MEMORY_LIMIT_PATH.read_text().strip()
|
|
48
56
|
return int(value) // (1024 * 1024)
|
|
49
57
|
except (FileNotFoundError, ValueError):
|
|
50
58
|
return None
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import atexit
|
|
4
4
|
import logging
|
|
5
|
+
import multiprocessing
|
|
5
6
|
import signal
|
|
6
7
|
import threading
|
|
7
8
|
import uuid
|
|
@@ -23,9 +24,10 @@ def _pool_initializer() -> None:
|
|
|
23
24
|
atexit as a fallback). This prevents workers from being killed
|
|
24
25
|
mid-operation and leaking semaphores.
|
|
25
26
|
|
|
26
|
-
Closes all
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
Closes all database connections before setting up Django. With the
|
|
28
|
+
forkserver context, workers don't inherit the parent's connections,
|
|
29
|
+
but AppConfig.ready() hooks may open connections during django.setup()
|
|
30
|
+
that should be closed before task execution begins.
|
|
29
31
|
|
|
30
32
|
Then sets up Django for task execution.
|
|
31
33
|
"""
|
|
@@ -34,10 +36,10 @@ def _pool_initializer() -> None:
|
|
|
34
36
|
import django
|
|
35
37
|
from django.db import connections
|
|
36
38
|
|
|
37
|
-
connections.close_all()
|
|
38
|
-
|
|
39
39
|
django.setup()
|
|
40
40
|
|
|
41
|
+
connections.close_all()
|
|
42
|
+
|
|
41
43
|
|
|
42
44
|
def _shutdown_pool() -> None:
|
|
43
45
|
"""Shut down the pool, releasing its POSIX semaphores promptly.
|
|
@@ -118,12 +120,22 @@ def _install_shutdown_handlers() -> None:
|
|
|
118
120
|
|
|
119
121
|
|
|
120
122
|
def get_pool() -> ProcessPoolExecutor:
|
|
121
|
-
"""Return the shared ProcessPoolExecutor, creating it on first call.
|
|
123
|
+
"""Return the shared ProcessPoolExecutor, creating it on first call.
|
|
124
|
+
|
|
125
|
+
Uses the "forkserver" multiprocessing context so that worker processes
|
|
126
|
+
are forked from a clean server process rather than from the Django parent.
|
|
127
|
+
This prevents workers from inheriting the parent's open database
|
|
128
|
+
connections (and other file descriptors), which would otherwise cause
|
|
129
|
+
"server closed the connection unexpectedly" errors in containerized
|
|
130
|
+
environments where close() in the child tears down the shared socket.
|
|
131
|
+
"""
|
|
122
132
|
global _pool
|
|
123
133
|
if _pool is None:
|
|
124
134
|
conf = LambdaTasksSettings()
|
|
135
|
+
mp_context = multiprocessing.get_context("forkserver")
|
|
125
136
|
_pool = ProcessPoolExecutor(
|
|
126
137
|
max_workers=conf.LOCAL_WORKERS,
|
|
138
|
+
mp_context=mp_context,
|
|
127
139
|
initializer=_pool_initializer,
|
|
128
140
|
)
|
|
129
141
|
atexit.register(_shutdown_pool)
|
|
@@ -189,6 +189,25 @@ class TestGetPool:
|
|
|
189
189
|
|
|
190
190
|
assert lambda_tasks.local_executor._pool is pool
|
|
191
191
|
|
|
192
|
+
@pytest.mark.usefixtures("_reset_pool")
|
|
193
|
+
def test_get_pool_uses_forkserver_context(self, settings):
|
|
194
|
+
"""get_pool() uses the forkserver multiprocessing context.
|
|
195
|
+
|
|
196
|
+
This prevents workers from inheriting the parent's open database
|
|
197
|
+
connections, which would cause connection errors in containerized
|
|
198
|
+
environments.
|
|
199
|
+
"""
|
|
200
|
+
import lambda_tasks.local_executor
|
|
201
|
+
|
|
202
|
+
settings.LAMBDA_TASKS_LOCAL_WORKERS = 2
|
|
203
|
+
settings.LAMBDA_TASKS_EAGER = False
|
|
204
|
+
|
|
205
|
+
pool = lambda_tasks.local_executor.get_pool()
|
|
206
|
+
|
|
207
|
+
# ProcessPoolExecutor stores the context; forkserver processes
|
|
208
|
+
# use the ForkServerProcess type
|
|
209
|
+
assert pool._mp_context.get_start_method() == "forkserver"
|
|
210
|
+
|
|
192
211
|
|
|
193
212
|
# ---------------------------------------------------------------------------
|
|
194
213
|
# Property-based tests: get_pool() (Requirement 2)
|
|
@@ -56,7 +56,12 @@ class TestMemoryLimitSetDuringColdStart:
|
|
|
56
56
|
monkeypatch.setattr(
|
|
57
57
|
"lambda_tasks.handler.resolve_secrets_into_env", lambda: None
|
|
58
58
|
)
|
|
59
|
-
monkeypatch.setattr(
|
|
59
|
+
monkeypatch.setattr(
|
|
60
|
+
handler_module, "_CGROUP_V2_MEMORY_MAX_PATH", fake_path(None)
|
|
61
|
+
)
|
|
62
|
+
monkeypatch.setattr(
|
|
63
|
+
handler_module, "_CGROUP_V1_MEMORY_LIMIT_PATH", fake_path(None)
|
|
64
|
+
)
|
|
60
65
|
|
|
61
66
|
calls: list[tuple] = []
|
|
62
67
|
|
|
@@ -70,7 +75,7 @@ class TestMemoryLimitSetDuringColdStart:
|
|
|
70
75
|
|
|
71
76
|
assert calls == []
|
|
72
77
|
|
|
73
|
-
def
|
|
78
|
+
def test_rlimit_as_set_from_cgroup_v2(self, monkeypatch):
|
|
74
79
|
"""When AWS_LAMBDA_FUNCTION_MEMORY_SIZE is not set, falls back to cgroup v2."""
|
|
75
80
|
monkeypatch.delenv("DJANGO_SETTINGS_MODULE", raising=False)
|
|
76
81
|
monkeypatch.delenv("AWS_LAMBDA_FUNCTION_MEMORY_SIZE", raising=False)
|
|
@@ -81,9 +86,14 @@ class TestMemoryLimitSetDuringColdStart:
|
|
|
81
86
|
# 2 GB in bytes
|
|
82
87
|
monkeypatch.setattr(
|
|
83
88
|
handler_module,
|
|
84
|
-
"
|
|
89
|
+
"_CGROUP_V2_MEMORY_MAX_PATH",
|
|
85
90
|
fake_path(str(2048 * 1024 * 1024)),
|
|
86
91
|
)
|
|
92
|
+
monkeypatch.setattr(
|
|
93
|
+
handler_module,
|
|
94
|
+
"_CGROUP_V1_MEMORY_LIMIT_PATH",
|
|
95
|
+
fake_path(None),
|
|
96
|
+
)
|
|
87
97
|
|
|
88
98
|
calls: list[tuple] = []
|
|
89
99
|
|
|
@@ -106,7 +116,12 @@ class TestMemoryLimitSetDuringColdStart:
|
|
|
106
116
|
monkeypatch.setattr(
|
|
107
117
|
"lambda_tasks.handler.resolve_secrets_into_env", lambda: None
|
|
108
118
|
)
|
|
109
|
-
monkeypatch.setattr(
|
|
119
|
+
monkeypatch.setattr(
|
|
120
|
+
handler_module, "_CGROUP_V2_MEMORY_MAX_PATH", fake_path("max")
|
|
121
|
+
)
|
|
122
|
+
monkeypatch.setattr(
|
|
123
|
+
handler_module, "_CGROUP_V1_MEMORY_LIMIT_PATH", fake_path(None)
|
|
124
|
+
)
|
|
110
125
|
|
|
111
126
|
calls: list[tuple] = []
|
|
112
127
|
|
|
@@ -120,6 +135,39 @@ class TestMemoryLimitSetDuringColdStart:
|
|
|
120
135
|
|
|
121
136
|
assert calls == []
|
|
122
137
|
|
|
138
|
+
def test_rlimit_as_set_from_cgroup_v1(self, monkeypatch):
|
|
139
|
+
"""When cgroup v2 is unavailable, falls back to cgroup v1 (Fargate)."""
|
|
140
|
+
monkeypatch.delenv("DJANGO_SETTINGS_MODULE", raising=False)
|
|
141
|
+
monkeypatch.delenv("AWS_LAMBDA_FUNCTION_MEMORY_SIZE", raising=False)
|
|
142
|
+
monkeypatch.setattr("lambda_tasks.handler.resolve_environment", lambda: None)
|
|
143
|
+
monkeypatch.setattr(
|
|
144
|
+
"lambda_tasks.handler.resolve_secrets_into_env", lambda: None
|
|
145
|
+
)
|
|
146
|
+
monkeypatch.setattr(
|
|
147
|
+
handler_module,
|
|
148
|
+
"_CGROUP_V2_MEMORY_MAX_PATH",
|
|
149
|
+
fake_path(None),
|
|
150
|
+
)
|
|
151
|
+
# 4 GB in bytes
|
|
152
|
+
monkeypatch.setattr(
|
|
153
|
+
handler_module,
|
|
154
|
+
"_CGROUP_V1_MEMORY_LIMIT_PATH",
|
|
155
|
+
fake_path(str(4096 * 1024 * 1024)),
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
calls: list[tuple] = []
|
|
159
|
+
|
|
160
|
+
def fake_setrlimit(which: int, limits: tuple[int, int]) -> None:
|
|
161
|
+
calls.append((which, limits))
|
|
162
|
+
|
|
163
|
+
monkeypatch.setattr(resource, "setrlimit", fake_setrlimit)
|
|
164
|
+
|
|
165
|
+
handler_module._cold_start_done = False
|
|
166
|
+
handler_module.handler(event={"Records": []}, context=None)
|
|
167
|
+
|
|
168
|
+
expected = (4096 - 128) * 1024 * 1024
|
|
169
|
+
assert calls == [(resource.RLIMIT_AS, (expected, expected))]
|
|
170
|
+
|
|
123
171
|
def test_memory_limit_set_before_loaders(self, monkeypatch):
|
|
124
172
|
"""The memory limit is set before resolve_environment runs."""
|
|
125
173
|
monkeypatch.delenv("DJANGO_SETTINGS_MODULE", raising=False)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/async-local-execution/design.md
RENAMED
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/async-local-execution/tasks.md
RENAMED
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/deferred-task-enqueue/design.md
RENAMED
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/deferred-task-enqueue/tasks.md
RENAMED
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/eager-mode-example-app/design.md
RENAMED
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/eager-mode-example-app/tasks.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/retry-delay/.config.kiro
RENAMED
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/retry-delay/requirements.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/rse-background-tasks/design.md
RENAMED
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/rse-background-tasks/tasks.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/singleton-task/.config.kiro
RENAMED
|
File without changes
|
{django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/singleton-task/design.md
RENAMED
|
File without changes
|
{django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/singleton-task/requirements.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/ssm-environment-loader/design.md
RENAMED
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/ssm-environment-loader/tasks.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/.kiro/specs/task-retry/requirements.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.6.3 → django_lambda_tasks-0.6.5}/lambda_tasks/migrations/0001_initial.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|