Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
600c3c5
fix: allow organizers to hard-delete soft-deleted submissions
dconstancy Jun 17, 2026
a735bd9
Remove duplicate CommonMiddleware from MIDDLEWARE
pyxelr Jun 23, 2026
ff89872
refactor(login): sanitize failed login error message
wlln Jun 23, 2026
29943a7
Merge pull request #2441 from codalab/sanitize_login_failed_error_mes…
ObadaS Jun 23, 2026
65f7f09
quick documentation fix
Jun 24, 2026
7c1bb92
Merge pull request #2444 from codalab/documentation_fix
ObadaS Jun 24, 2026
445079e
Merge pull request #2422 from dconstancy/fix/quota-exclude-cancelled-…
Didayolo Jun 25, 2026
353f603
Merge pull request #2446 from codalab/delete-submissions
Didayolo Jun 25, 2026
60882f8
Merge pull request #2436 from pyxelr/fix/duplicate-common-middleware
Didayolo Jun 26, 2026
ccc72ce
Merge pull request #2449 from codalab/duplicate-common-middleware
Didayolo Jun 26, 2026
688b579
Add redirection when not in maintenance
Didayolo Jun 26, 2026
3476e5b
Merge pull request #2448 from codalab/maintenance-mode
ObadaS Jul 1, 2026
e419b61
participant routing documentation OK
IdirLISN Jun 30, 2026
2bf6d10
link images
IdirLISN Jun 30, 2026
eeff3ad
link images fix
IdirLISN Jun 30, 2026
52b958e
UX improvements
IdirLISN Jun 30, 2026
d57259e
doc improvement + removing useless things
IdirLISN Jun 30, 2026
eaa5ccc
modify and add images
IdirLISN Jun 30, 2026
d518c8d
modify and add imagesO
IdirLISN Jun 30, 2026
67b2725
docs improvements
IdirLISN Jun 30, 2026
f634b25
images modification & doc clean up
IdirLISN Jul 1, 2026
92da29a
add image to doc
IdirLISN Jul 2, 2026
6b951b8
add image to doc
IdirLISN Jul 2, 2026
3e02b8a
fix doc
IdirLISN Jul 2, 2026
692b13b
Synthax fix
IdirLISN Jul 2, 2026
85c3231
Merge pull request #2452 from codalab/doc/participant_routing
ObadaS Jul 2, 2026
d4aa166
group feature reintegreted in site worker
IdirLISN Jul 1, 2026
414dbd6
translate empty group queue
IdirLISN Jul 1, 2026
7db8d28
change feature name + Edit button name
IdirLISN Jul 1, 2026
0c1db68
translation + feature name in UI
IdirLISN Jul 1, 2026
9c0f07c
add feature documentation link to UI
IdirLISN Jul 1, 2026
b018329
group queue erase button
IdirLISN Jul 2, 2026
929a923
Merge pull request #2453 from codalab/fix/participant_routing_SW
ObadaS Jul 2, 2026
9227dfb
Update version.json
ObadaS Jul 2, 2026
9281a21
Merge pull request #2455 from codalab/Version-Bump
ObadaS Jul 2, 2026
9a3d083
fix format
IdirLISN Jul 2, 2026
8fd7ca2
Merge pull request #2456 from codalab/doc/fix_format
ObadaS Jul 2, 2026
76d0aca
re-enabled github workflow to replace circle-ci; add trivy image scan…
Feb 3, 2026
29ee41a
remove github tests
Jun 25, 2026
f48359b
update trivy workflow version
Jun 25, 2026
1862404
change from every week to every day
Jul 1, 2026
51f28fc
fix names
Jul 2, 2026
2819631
fix push to schedule
Jul 2, 2026
3106f46
remove disabled file
Jul 2, 2026
56f68bf
fix deprecated call
Jul 2, 2026
2d822b4
scan only vulnerabilities
Jul 2, 2026
4eef7ba
fix format
Jul 2, 2026
cafc913
fix pk -> pgk & remove unfixed ignore
Jul 2, 2026
a76bbd8
Merge pull request #2140 from codalab/trivy_circleci_github_workflow
wlln Jul 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions .github/workflows/image_scan.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
name: scan_image_for_CVE
on:
# Every day at 00:00
schedule:
- cron: "0 0 * * *"
jobs:
scan_image:
name: Scan compute worker image with Trivy
runs-on: ubuntu-latest
steps:
- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@v0.36.0
with:
image-ref: 'codalab/codabench-compute-worker:latest'
format: 'table'
exit-code: '1'
pkg-types: 'os,library'
severity: 'CRITICAL,HIGH'
scanners: 'vuln'
63 changes: 0 additions & 63 deletions .github/workflows/tests.yml.DISABLED

This file was deleted.

9 changes: 9 additions & 0 deletions Caddyfile
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,15 @@
status 503
}
}
# When maintenance ends, redirect stale /maintenance.html requests back to home
@staleMaintenancePage {
path /maintenance.html
not file {
root /srv
try_files maintenance.on
}
}
redir @staleMaintenancePage / 302

# Serves static files, should be the same as `STATIC_ROOT` setting:
root * /var/www/django
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
## Overview

The **Participant Routing** feature allows competition organizers to group participants and associate a compute queue with each group.

When a participant submits a submission, Codabench automatically routes it to the compute queue(s) associated with the participant's groups.

This feature enables organizers to:

- Route different participants to different compute infrastructures (dedicated GPU servers, university clusters, private cloud, etc.).
- Compare the same participant's results across multiple infrastructures.
- Isolate specific participant groups (students, partners, internal teams, etc.) on dedicated compute resources.
- Combine participant routing with multi-task competitions.

# Managing Participant Groups

## Accessing the Group Management Interface

1. Open the competition edit form.

![image (1)](_attachments/participant_routing1.png)

2. Navigate to the **Participation** tab.

![image (2)](_attachments/participant_routing2.png)

3. Scroll down to the **Participant routing** section.

![image (3)](_attachments/participant_routing3.png)

---

## Creating a Group

Click **New Routing Group**.

Fill in the following fields:

![image (4)](_attachments/participant_routing4.png)

| Field | Description |
| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Group Name** | Display name shown in the leaderboard. Must be unique within the competition. |
| **Queue** _(optional)_ | Compute queue where submissions from this group will be routed. Use the search field to filter queues. Leave empty to use the competition's default queue. |
| **Members** | Approved competition participants to include in the group. Search by username or email. |

Click **Create**.

---

## Deleting a Group

!!! Warning
Deleting a participant group is **permanent**.
Existing submissions are **not** modified after a group is deleted.

---

# Submission Routing Rules

## Queue Priority

Routing follows the following priority:
!!! Tip
`title="Queue priority"
Group Queue > Competition Queue > Default Queue
`
---

## Routing Trigger

Participant routing is enabled **only if the participant belongs to at least one group**.

!!! Tip
A group **without a queue** means:
Use the competition's **default** queue.

## Queue Deduplication

If multiple groups reference the **same compute queue**, only **one child submission** is created.
Duplicate submissions are never generated for the same queue.

## Group Column

A new **Group** column appears whenever at least one routed group is involved.
It displays the participant group associated with each leaderboard entry.
If no routed group is involved, the leaderboard behaves exactly as before and the column is hidden.

---

## Multi-task Competitions

For a given root submission:

- Child submissions executed on the **same queue** are merged into a single leaderboard row.
- Child submissions executed on **different queues** appear on separate rows.

---

## Leaderboard exemple

![image (5)](_attachments/participant_routing5.png)

User Obada is inside of three groups (GPU_group, CPU_group and VIP_group),
The leaderboard shows three lines, one for each group.

User Cidir is inside of two groups so only two lines are displayed.

Group column shows the group name and the main user submission ID like: ID_GroupName

---

# Routing Scenarios

| Participant configuration | Group queues | Child submissions created | Leaderboard rows | Group column |
| ------------------------------------------------- | ------------ | --------------------------------- | ---------------- | ------------ |
| No group, single-task competition | — | 1 root submission executed on Q0 | 1 | ❌ |
| No group, multi-task competition | — | N child submissions on Q0 | 1 | ❌ |
| One group without queue, single-task | Default | 1 root submission on Q0 | 1 | ❌ |
| One group without queue, multi-task | Default | N child submissions on Q0 | 1 | ❌ |
| One group with queue, single-task | Q1 | 1 child submission on Q1 | 1 | ✅ |
| One group with queue, multi-task | Q1 | N child submissions on Q1 | 1 | ✅ |
| One routed group + one default group, single-task | Q1 + Default | 2 child submissions (Q1 + Q0) | 2 | ✅ |
| One routed group + one default group, multi-task | Q1 + Default | 2 × N child submissions | 2 | ✅ |
| Two groups with different queues, single-task | Q1 + Q2 | 2 child submissions | 2 | ✅ |
| Two groups with different queues, multi-task | Q1 + Q2 | 2 × N child submissions | 2 | ✅ |
| Two groups using the same queue | Q1 + Q1 | 1 child submission (deduplicated) | 1 | ✅ |
| K groups with distinct queues | Q1...QK | K × N child submissions | K | ✅ |

---

# Important Notes

!!! Danger
Removing a participant from a group **after** a submission has been created does **not** modify existing submissions.
If the queue associated with a group is deleted after submissions have been created, the leaderboard displays **"—"** in the **Group** column for those entries.

---

!!! Notes
Re-running a submission recomputes participant routing using the participant's **current group memberships**.

If group assignments have changed since the original submission, the rerun may produce different child submissions.

---

!!! Info
Group names are unique **within a competition**.

Different competitions may use identical group names without conflict.

When participant groups affect routing, the leaderboard adapts automatically.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 2 additions & 1 deletion documentation/zensical.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ nav = [
{"How to Transition from Codalab to Codabench?" = "Organizers/Benchmark_Creation/How-to-transition-from-CodaLab-to-Codabench.md"},
{"Competition Creation" = "Organizers/Benchmark_Creation/Competition-Creation.md"},
{"Competition Creation Form" = "Organizers/Benchmark_Creation/Competition-Creation-Form.md"},
{"Participant Routing" = "Organizers/Benchmark_Creation/Participant-Routing.md"},
{"Competition Creation Bundle" = "Organizers/Benchmark_Creation/Competition-Creation-Bundle.md"},
{"Competition YAML Structure" = "Organizers/Benchmark_Creation/Competition-Bundle-Structure.md"},
{"YAML Structure" = "Organizers/Benchmark_Creation/Yaml-Structure.md"},
Expand All @@ -39,6 +40,7 @@ nav = [
]}
]},
{"Developers" = [
{"Codabench Basic Installation Guide" = "Developers_and_Administrators/Codabench-Installation.md"},
{"Codabench Docker Architecture" = "Developers_and_Administrators/Codabench-Architecture.md"},
{"Submission Docker Container Layout" = "Developers_and_Administrators/Submission-Docker-Container-Layout.md"},
{"Submission Process Overview" = "Developers_and_Administrators/Submission-Process-Overview.md"},
Expand All @@ -49,7 +51,6 @@ nav = [

]},
{"Self-Hosters" = [
{"Codabench Basic Installation Guide" = "Developers_and_Administrators/Codabench-Installation.md"},
{"How to Deploy a Server" = "Developers_and_Administrators/How-to-deploy-Codabench-on-your-server.md"},
{"Administrative Procedures" = "Developers_and_Administrators/Administrator-procedures.md"},
{"Backups - Automating Creation and Restoring" = "Developers_and_Administrators/Creating-and-Restoring-from-Backup.md"},
Expand Down
16 changes: 9 additions & 7 deletions src/apps/competitions/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -536,9 +536,10 @@ def soft_delete(self):
detail.delete() # Remove record from DB

# Clear the data field if no other submissions are using it
other_submissions_using_data = Submission.objects.filter(data=self.data).exclude(pk=self.pk).exists()
if not other_submissions_using_data:
self.data.delete()
if self.data:
other_submissions_using_data = Submission.objects.filter(data=self.data).exclude(pk=self.pk).exists()
if not other_submissions_using_data:
self.data.delete()

# Clear the data field for this submission
self.data = None
Expand All @@ -554,11 +555,12 @@ def soft_delete(self):
def delete(self, **kwargs):

# Check if any other submissions are using the same data
other_submissions_using_data = Submission.objects.filter(data=self.data).exclude(pk=self.pk).exists()
if self.data:
other_submissions_using_data = Submission.objects.filter(data=self.data).exclude(pk=self.pk).exists()

if not other_submissions_using_data:
# If no other submissions are using the same data, delete it
self.data.delete()
if not other_submissions_using_data:
# If no other submissions are using the same data, delete it
self.data.delete()

# Also clean up details on delete
self.details.all().delete()
Expand Down
Loading
Loading