From f163f134c99172170fe55b5a84aa18d02b0078b8 Mon Sep 17 00:00:00 2001 From: Antti Leinonen Date: Fri, 12 Jan 2024 15:26:13 +0200 Subject: [PATCH 1/2] Add memory and cpu limits to exercises --- app/models/remote_sandbox.rb | 2 ++ ..._add_memory_and_cpu_limits_to_exercises.rb | 6 +++++ db/schema.rb | 4 +++- lib/course_refresh_database_updater.rb | 24 +++++++++++++++++++ 4 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20240112130207_add_memory_and_cpu_limits_to_exercises.rb diff --git a/app/models/remote_sandbox.rb b/app/models/remote_sandbox.rb index cc475f496..ac8d0e6d1 100644 --- a/app/models/remote_sandbox.rb +++ b/app/models/remote_sandbox.rb @@ -77,6 +77,8 @@ def send_submission(submission, notify_url) file: tar_file, notify: notify_url, token: submission.secret_token, submission_id: submission.id } payload[:docker_image] = exercise.docker_image if exercise.docker_image + payload[:memory_limit] = exercise.memory_limit if exercise.memory_limit + payload[:cpu_limit] = exercise.cpu_limit if exercise.cpu_limit RestClient::Request.execute(method: :post, url: post_url, timeout: 5, payload: payload) end diff --git a/db/migrate/20240112130207_add_memory_and_cpu_limits_to_exercises.rb b/db/migrate/20240112130207_add_memory_and_cpu_limits_to_exercises.rb new file mode 100644 index 000000000..25daaff14 --- /dev/null +++ b/db/migrate/20240112130207_add_memory_and_cpu_limits_to_exercises.rb @@ -0,0 +1,6 @@ +class AddMemoryAndCpuLimitsToExercises < ActiveRecord::Migration[6.1] + def change + add_column :exercises, :memory_limit_gb, :integer, default: 1, null: false + add_column :exercises, :cpu_limit, :integer, default: 1, null: false + end +end diff --git a/db/schema.rb b/db/schema.rb index b05705406..2445f6dba 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2023_09_10_232815) do +ActiveRecord::Schema.define(version: 2024_01_12_130207) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -205,6 +205,8 @@ t.boolean "hide_submission_results", default: false t.string "docker_image", default: "eu.gcr.io/moocfi-public/tmc-sandbox-tmc-langs-rust" t.integer "paste_visibility" + t.integer "memory_limit_gb", default: 1, null: false + t.integer "cpu_limit", default: 1, null: false t.index ["course_id", "name"], name: "index_exercises_on_course_id_and_name", unique: true t.index ["gdocs_sheet"], name: "index_exercises_on_gdocs_sheet" t.index ["name"], name: "index_exercises_on_name" diff --git a/lib/course_refresh_database_updater.rb b/lib/course_refresh_database_updater.rb index 882cf96a5..95819bb76 100644 --- a/lib/course_refresh_database_updater.rb +++ b/lib/course_refresh_database_updater.rb @@ -126,6 +126,30 @@ def set_docker_image end end + def set_memory_limit + @rust_data['exercises'].each do |exercise| + ex = @course.exercises.find { |e| e.name == exercise['name'] } + next unless ex + if (exercise['tmcproject-yml'] || {}).include? 'memory_gb' + ex.memory_limit = exercise['tmcproject-yml']['memory_gb'] + else + ex.memory_limit = 1 + end + end + end + + def set_cpu_limit + @rust_data['exercises'].each do |exercise| + ex = @course.exercises.find { |e| e.name == exercise['name'] } + next unless ex + if (exercise['tmcproject-yml'] || {}).include? 'cpus' + ex.cpu_limit = exercise['tmcproject-yml']['cpus'] + else + ex.cpu_limit = 1 + end + end + end + def update_available_points @rust_data['exercises'].each do |exercise| added = [] From b02b4ecf8a9f105810167c957901cf4b9af51589 Mon Sep 17 00:00:00 2001 From: Antti Leinonen Date: Fri, 12 Jan 2024 15:35:31 +0200 Subject: [PATCH 2/2] Fix bug and add gb to payload's memory field --- app/models/remote_sandbox.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/remote_sandbox.rb b/app/models/remote_sandbox.rb index ac8d0e6d1..3049596fa 100644 --- a/app/models/remote_sandbox.rb +++ b/app/models/remote_sandbox.rb @@ -77,7 +77,7 @@ def send_submission(submission, notify_url) file: tar_file, notify: notify_url, token: submission.secret_token, submission_id: submission.id } payload[:docker_image] = exercise.docker_image if exercise.docker_image - payload[:memory_limit] = exercise.memory_limit if exercise.memory_limit + payload[:memory_limit_gb] = exercise.memory_limit_gb if exercise.memory_limit_gb payload[:cpu_limit] = exercise.cpu_limit if exercise.cpu_limit RestClient::Request.execute(method: :post, url: post_url, timeout: 5, payload: payload)