• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

kobotoolbox / kpi / 37768324112
83%
master: 76%

Build:
Build:
LAST BUILD BRANCH: dev-3144-pytest-ci-speedup
DEFAULT BRANCH: master
Ran 08 Oct 2026 11:14AM UTC
Jobs 10
Files 914
Run time 2min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

08 Oct 2026 11:10AM UTC coverage: 82.995% (+0.02%) from 82.98%
37768324112

push

github

web-flow
fix(trashBin): throttle attachment auto-deletion and stop locking the Celery Beat schedule row DEV-2999 (#7663)

### 📣 Summary
This PR stops trash bin operations from locking Celery Beat's schedule
row, makes attachment auto-deletion run in small batches, and keeps
storage counters and trash clean-up correct under load.

### 👷 Description for instance maintainers

New optional settings (environment variables):
- `AUTO_DELETE_ATTACHMENTS_MAX_PER_USER` (default `100`)
- `AUTO_DELETE_ATTACHMENTS_USERS_PER_RUN` (default `5`)
Each trashed attachment keeps its own Beat task until it is
hard-deleted, so raising these values grows the number of tasks Celery
Beat has to scan.
Migration `logger.0055` adds a partial index on `logger_attachment`.
When `SKIP_HEAVY_MIGRATIONS` is set, create it manually with the SQL the
migration prints.
Trash bin tasks may now start up to 5 minutes after their due time.

### 💭 Notes
1. **No Beat row update from the trash bin** (`utils/signals.py`):
`temporarily_disconnect_signals()` no longer calls
`PeriodicTasks.update_changed()`, which locked Beat's single
`PeriodicTasks` row until the caller's transaction committed, so
concurrent callers waited on each other. It is not needed:
django-celery-beat 2.9.0 reloads its schedule every 5 minutes and only
loads clocked tasks due within 5 minutes. Covers `move_to_trash()`,
`put_back()` and `garbage_collector()`.
2. **`auto_delete_excess_attachments`**:
- returns early when `AUTO_DELETE_ATTACHMENTS` is off, so tasks already
queued do nothing;
- the per-user lock now covers the work (it was released before the work
started);
- trashes at most `AUTO_DELETE_ATTACHMENTS_MAX_PER_USER` attachments per
run, oldest first, and the next run continues;
   - no more queries per attachment (3 → 0).
3. **`schedule_auto_attachment_cleanup_for_users`**: queues at most
`AUTO_DELETE_ATTACHMENTS_USERS_PER_RUN` users per run. Users take turns
through a cursor on `ExceededLimitCounter.id` kept in the cache.
4... (continued)

10334 of 13680 branches covered (75.54%)

27 of 136 new or added lines in 9 files covered. (19.85%)

5136 existing lines in 154 files now uncovered.

33042 of 39812 relevant lines covered (83.0%)

5.49 hits per line

Uncovered Changes

Lines Coverage ∆ File
58
27.34
-10.16% kobo/apps/trash_bin/tasks/attachment.py
24
52.34
-41.6% kpi/utils/django_orm_helper.py
20
23.4
-56.6% kobo/apps/openrosa/apps/logger/utils/attachment.py
3
50.98
0.98% kobo/apps/trash_bin/tasks/__init__.py
2
44.9
-24.49% kobo/apps/openrosa/apps/logger/utils/counters.py
2
55.88
8.16% kobo/apps/trash_bin/models/attachment.py

Coverage Regressions

Lines Coverage ∆ File
667
5.22
-74.11% kpi/utils/query_parser/canopy_autogenerated_parser/__init__.py
336
24.66
-45.28% kpi/models/import_export_task.py
312
0.0
-91.23% kobo/apps/openrosa/apps/viewer/pandas_mongo_bridge.py
192
34.58
-29.91% kpi/serializers/v2/asset.py
177
61.5
-30.15% kpi/models/asset.py
127
25.26
-66.84% kpi/utils/query_parser/query_parser.py
123
28.84
-33.15% kpi/views/v2/asset.py
122
25.27
-67.03% kobo/apps/openrosa/apps/logger/utils/attachment_restore.py
97
30.58
-47.09% kobo/apps/project_ownership/models/transfer.py
80
71.12
-21.8% kpi/mixins/object_permission.py
77
35.77
-62.6% kpi/utils/usage_calculator.py
73
0.0
-96.05% kobo/apps/openrosa/apps/logger/utils/suspension.py
71
43.7
-52.59% kpi/utils/mailer.py
70
64.46
-24.39% kobo/apps/openrosa/apps/logger/xform_instance_parser.py
70
23.4
-74.47% kpi/utils/xlsform_preprocessors/kobomatrix_handler.py
67
31.76
-45.27% kobo/apps/accounts/forms.py
67
25.35
-31.46% kpi/filters.py
66
33.33
-59.46% kobo/apps/openrosa/apps/viewer/views.py
64
12.36
-71.91% kobo/apps/reports/report_data.py
59
53.33
-14.05% kpi/deployment_backends/base_backend.py
58
0.0
-90.63% kobo/apps/openrosa/libs/data/query.py
54
35.34
-40.6% kpi/paginators.py
53
43.6
-11.91% kobo/apps/audit_log/models.py
53
38.56
-8.66% kpi/deployment_backends/openrosa_backend.py
49
51.59
-38.89% kobo/apps/openrosa/apps/logger/signals.py
49
0.0
-57.65% kobo/apps/openrosa/apps/logger/tasks.py
49
23.85
-37.69% kobo/apps/openrosa/apps/logger/utils/instance.py
49
28.57
-43.75% kobo/apps/openrosa/apps/logger/views.py
49
28.28
-49.49% kpi/password_validation.py
48
59.0
-24.0% kpi/utils/xml.py
44
0.0
-67.69% kobo/apps/accounts/adapter.py
44
45.72
-16.36% kobo/apps/openrosa/apps/viewer/models/data_dictionary.py
44
37.61
-37.61% kpi/models/asset_snapshot.py
41
57.5
-17.08% kobo/apps/openrosa/apps/viewer/models/parsed_instance.py
40
0.0
-40.82% kobo/apps/openrosa/apps/viewer/xls_writer.py
39
33.33
-46.43% kobo/apps/audit_log/base_views.py
39
35.2
-31.2% kpi/models/paired_data.py
38
24.14
-32.76% kobo/apps/openrosa/apps/viewer/tasks.py
38
41.18
-27.94% kpi/utils/autoname.py
36
24.49
-73.47% kobo/apps/openrosa/apps/logger/import_tools.py
35
18.75
-72.92% kpi/utils/xlsform_preprocessors/koborank_handler.py
34
37.14
-48.57% kpi/utils/cache.py
33
49.02
-32.35% kobo/apps/openrosa/apps/viewer/models/export.py
32
53.57
-16.33% kpi/mixins/formpack_xlsform_utils.py
32
53.92
-31.37% kpi/models/asset_file.py
31
52.34
-41.6% kpi/utils/django_orm_helper.py
30
59.68
-23.66% kobo/apps/openrosa/apps/logger/models/attachment.py
29
47.62
-17.26% kobo/apps/openrosa/apps/main/models/meta_data.py
29
47.89
-40.85% kpi/utils/hash.py
29
21.95
-70.73% kpi/utils/xlsform_preprocessors/koboscore_handler.py
28
17.07
-68.29% kpi/utils/submission.py
27
15.52
-15.52% kobo/apps/project_ownership/utils.py
27
33.96
-50.94% kpi/fields/file.py
24
40.0
-53.33% kpi/fields/jsonschema_form_field.py
23
51.06
-48.94% kpi/views/v2/authorized_application_user.py
22
55.71
-15.71% kobo/apps/audit_log/signals.py
21
71.79
-10.77% kobo/apps/openrosa/apps/logger/models/instance.py
21
65.45
-9.55% kpi/permissions.py
21
43.06
-9.72% kpi/renderers.py
21
50.0
-45.65% kpi/serializers/v2/asset_version.py
21
23.08
-53.85% kpi/utils/asset_translation_utils.py
21
40.58
-30.43% kpi/utils/data_exports.py
21
26.47
-61.76% kpi/utils/export_cleanup.py
21
66.83
-10.24% kpi/utils/mongo_helper.py
20
53.13
-31.25% hub/models/extra_user_detail.py
20
0.0
-68.97% kobo/apps/audit_log/tasks.py
19
74.41
-9.0% kobo/apps/openrosa/apps/logger/models/xform.py
19
58.18
-34.55% kpi/signals.py
18
37.84
-48.65% kpi/serializers/v2/create_user.py
18
60.56
-25.35% kpi/utils/sluggify.py
18
37.93
-62.07% kpi/views/token.py
17
16.22
-45.95% kobo/apps/openrosa/apps/logger/utils/database_query.py
17
39.73
-7.76% kobo/apps/organizations/views.py
17
77.53
-19.1% kpi/deployment_backends/mock_backend.py
15
31.71
-36.59% kobo/apps/openrosa/apps/logger/xform_fs.py
14
37.14
-20.0% hub/utils/i18n.py
13
54.84
-41.94% kobo/apps/openrosa/libs/authentication.py
13
26.09
-56.52% kpi/fields/relative_prefix_hyperlinked_related.py
13
47.13
-14.94% kpi/tasks.py
12
43.06
-16.67% kobo/apps/project_ownership/serializers/invite.py
12
82.76
-13.79% kpi/utils/asset_content_analyzer.py
12
22.73
-54.55% kpi/utils/bugfix.py
11
23.4
-56.6% kobo/apps/openrosa/apps/logger/utils/attachment.py
11
59.76
-13.41% kobo/apps/project_ownership/models/invite.py
11
67.86
-19.64% kpi/context_processors.py
11
69.44
-30.56% kpi/models/asset_user_partial_permission.py
11
23.31
-3.09% kpi/serializers/v2/asset_permission_assignment.py
11
55.56
-40.74% kpi/utils/xlsform_preprocessors/base_handlers.py
10
59.42
-14.49% kobo/apps/accounts/models.py
10
60.71
-35.71% kobo/apps/audit_log/utils.py
10
44.9
-24.49% kobo/apps/openrosa/apps/logger/utils/counters.py
10
14.8
-5.1% kobo/apps/subsequences/utils/versioning.py
10
77.42
-16.13% kpi/utils/kobo_to_xlsform.py
10
35.29
-58.82% kpi/utils/strings.py
10
38.1
-23.81% kpi/utils/urls.py
9
20.57
-6.38% kobo/apps/stripe/utils/subscription_limits.py
9
35.29
-52.94% kpi/serializers/v1/authorized_application_user.py
7
61.76
-20.59% kobo/apps/storage_backends/base.py
7
32.14
-25.0% kobo/apps/subsequences/utils/supplement_data.py
7
57.14
-33.33% kpi/fields/paginated_api.py
7
53.33
-46.67% kpi/maintenance_tasks.py
7
70.37
-25.93% kpi/models/extra_project_metadata_field.py
7
72.38
-6.67% kpi/utils/object_permission.py
7
71.43
-20.0% kpi/utils/project_views.py
6
30.38
-7.59% kobo/apps/accounts/utils.py
6
56.22
-3.24% kobo/apps/organizations/models.py
6
43.75
-37.5% kobo/apps/project_ownership/filters.py
6
72.09
-13.95% kobo/apps/project_ownership/serializers/transfer.py
6
0.0
-100.0% kobo/apps/project_views/tasks.py
6
42.86
-42.86% kpi/mixins/asset.py
6
22.12
-5.31% kpi/utils/models.py
5
41.79
-7.46% kobo/apps/accounts/signals.py
5
60.53
-13.16% kobo/apps/data_collectors/signals.py
5
84.75
-8.47% kobo/apps/openrosa/apps/logger/exceptions.py
5
72.22
-27.78% kobo/apps/openrosa/apps/logger/models/daily_xform_submission_counter.py
5
75.0
-25.0% kobo/apps/openrosa/apps/logger/models/monthly_xform_submission_counter.py
5
0.0
-38.46% kobo/apps/openrosa/apps/main/context_processors.py
5
30.0
-7.14% kobo/apps/organizations/permissions.py
5
46.34
-12.2% kobo/apps/organizations/tasks.py
5
53.85
-6.41% kpi/deployment_backends/kc_access/utils.py
5
57.14
-23.81% kpi/fields/writable_json.py
5
83.33
-10.42% kpi/models/asset_version.py
5
75.0
-20.83% kpi/models/authorized_application.py
5
29.41
-14.71% kpi/utils/rename_xls_sheet.py
5
36.14
-6.02% kpi/utils/storage.py
4
53.85
-30.77% kobo/apps/accounts/templatetags/customize_email_content.py
4
77.5
-10.0% kobo/apps/kobo_auth/signals.py
4
45.45
-36.36% kobo/apps/openrosa/koboform/__init__.py
4
50.0
-10.53% kobo/apps/organizations/utils.py
4
89.47
-7.02% kpi/deployment_backends/mixin.py
4
33.33
-66.67% kpi/utils/chunked_delete.py
4
80.0
-20.0% kpi/views/v1_api_gone.py
3
95.76
-2.54% kobo/apps/openrosa/apps/api/viewsets/xform_submission_api.py
3
80.0
-20.0% kobo/apps/openrosa/apps/viewer/signals.py
3
89.19
-8.11% kobo/apps/project_views/models/project_view.py
3
76.47
-17.65% kpi/utils/pyxform_compatibility.py
3
61.54
-23.08% kpi/versioning.py
2
0.0
-100.0% kobo/apps/openrosa/apps/logger/constants.py
2
70.83
-1.67% kobo/apps/openrosa/libs/utils/middleware.py
2
91.3
-8.7% kobo/apps/project_ownership/views/invite.py
2
55.88
8.16% kobo/apps/trash_bin/models/attachment.py
2
83.33
-6.67% kobo/urls.py
2
87.2
-1.6% kpi/exceptions.py
2
64.52
-6.45% kpi/mixins/standardize_searchable_field.py
2
96.36
-3.64% kpi/mixins/xls_exportable.py
2
90.0
-10.0% kpi/utils/absolute_paths.py
2
81.48
-7.41% kpi/utils/ssrf.py
1
44.44
-5.56% kobo/apps/accounts/templatetags/get_provider_appname.py
1
88.24
-5.88% kobo/apps/audit_log/middleware.py
1
86.11
-2.78% kobo/apps/openrosa/apps/logger/fields.py
1
91.3
-4.35% kobo/apps/openrosa/libs/permissions.py
1
79.27
0.09% kobo/settings/base.py
1
67.95
-1.28% kpi/authentication.py
1
70.83
-4.17% kpi/urls/__init__.py
Jobs
ID Job ID Ran Files Coverage
1 37768324112.1 08 Oct 2026 11:14AM UTC 909
43.66
2 37768324112.2 08 Oct 2026 11:15AM UTC 909
49.75
3 37768324112.3 08 Oct 2026 11:16AM UTC 911
51.0
4 37768324112.4 08 Oct 2026 11:17AM UTC 912
67.55
5 37768324112.5 08 Oct 2026 11:17AM UTC 911
44.93
6 37768324112.6 08 Oct 2026 11:18AM UTC 911
59.49
7 37768324112.7 08 Oct 2026 11:19AM UTC 911
53.73
8 37768324112.8 08 Oct 2026 11:19AM UTC 909
58.42
9 37768324112.9 08 Oct 2026 11:19AM UTC 914
69.95
10 37768324112.10 08 Oct 2026 11:45AM UTC 909
52.49
Source Files on build 37768324112
  • Tree
  • List 914
  • Changed 13
  • Source Changed 0
  • Coverage Changed 13
Coverage ∆ File Lines Relevant Covered Missed Hits/Line Branch Hits Branch Misses
  • Back to Repo
  • 77dbe284 on github
  • Prev Build on release/2.026.37 (#37745681293)
  • Next Build on release/2.026.37 (#37782134424)
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc