Ограничение количества посылок на задачу

Обсуждение вопросов, связанных с системой проведения турниров ejudge.
Post Reply
through_horizon
Posts:2
Joined:08 December 2012, 15:30
Ограничение количества посылок на задачу

Post by through_horizon » 08 December 2012, 15:38

Здравствуйте.
Хотелось бы иметь следующую функциональность: возможность устанавливать для каждой задачи контеста лимит возможных посылок, при достижение которого, дальнейшие посылки невозможны. Возможно ли это в текущей версии или требуется модификация исходного кода? В случае второго варианта, заинтересованы ли вы в таком патче и если да, то какие требования к его содержанию.

cher
Posts:1153
Joined:13 March 2004, 17:00
Contact:

Re: Ограничение количества посылок на задачу

Post by cher » 08 December 2012, 21:09

В текущей версии этого нет.

Можете попробовать добавить, но это может оказаться не очень просто. Если возникнут вопросы, я постараюсь ответить.

hotsnr
Posts:67
Joined:19 October 2012, 22:14

Re: Ограничение количества посылок на задачу

Post by hotsnr » 09 December 2012, 14:25

Я делал такое довольно просто. Я модифицировал код и после этого настройка, которая ограничивала количество посылок, стала ограничивать кол-во посылок на задачу (было лень вводить дополнительный параметр).
Есть патч для версии 2.3.24

through_horizon
Posts:2
Joined:08 December 2012, 15:30

Re: Ограничение количества посылок на задачу

Post by through_horizon » 09 December 2012, 22:43

hotsnr wrote:Я делал такое довольно просто. Я модифицировал код и после этого настройка, которая ограничивала количество посылок, стала ограничивать кол-во посылок на задачу (было лень вводить дополнительный параметр).
Есть патч для версии 2.3.24
Хотелось бы иметь более гибкую настройку, позволяющую устанавливать отдельный лимит по каждой задаче (или хотя бы группе), но если возможно, я бы посмотрел ваш патч

hotsnr
Posts:67
Joined:19 October 2012, 22:14

Re: Ограничение количества посылок на задачу

Post by hotsnr » 10 December 2012, 18:39

Мне не требовались такие возможности, мне было достаточно ограничивать на одинаковое число посылок для задачи. Для вашего варианта нужно вводить опцию в конфиг или использовать существующую какую-нибудь (вариант не очень).
Извините за кривой код и изобретение велосипеда, но меня это устраивает

Code: Select all

diff -c -r ejudge/new_server_html_4.c ejudge_new/new_server_html_4.c
*** ejudge/new_server_html_4.c	2012-09-01 20:36:25.000000000 +0300
--- ejudge_new/new_server_html_4.c	2012-10-27 20:48:34.456600715 +0300
***************
*** 957,963 ****
        FAIL(NEW_SRV_ERR_CONTEST_NOT_STARTED);
      if (stop_time)
        FAIL(NEW_SRV_ERR_CONTEST_ALREADY_FINISHED);
!     if (serve_check_user_quota(cs, phr->user_id, run_size) < 0)
        FAIL(NEW_SRV_ERR_RUN_QUOTA_EXCEEDED);
      if (!serve_is_problem_started(cs, phr->user_id, prob))
        FAIL(NEW_SRV_ERR_PROB_UNAVAILABLE);
--- 957,963 ----
        FAIL(NEW_SRV_ERR_CONTEST_NOT_STARTED);
      if (stop_time)
        FAIL(NEW_SRV_ERR_CONTEST_ALREADY_FINISHED);
!     if (serve_check_user_quota(cs, prob->id, phr->user_id, run_size) < 0)
        FAIL(NEW_SRV_ERR_RUN_QUOTA_EXCEEDED);
      if (!serve_is_problem_started(cs, phr->user_id, prob))
        FAIL(NEW_SRV_ERR_PROB_UNAVAILABLE);
diff -c -r ejudge/new_server_html.c ejudge_new/new_server_html.c
*** ejudge/new_server_html.c	2012-09-01 20:36:25.000000000 +0300
--- ejudge_new/new_server_html.c	2012-10-27 20:50:19.672605281 +0300
***************
*** 10438,10444 ****
    if (!admin_mode && stop_time > 0) {
      FAIL(NEW_SRV_ERR_CONTEST_ALREADY_FINISHED);
    }
!   if (!admin_mode && serve_check_user_quota(cs, user_id, run_size) < 0) {
      FAIL(NEW_SRV_ERR_RUN_QUOTA_EXCEEDED);
    }
    if (!admin_mode && !serve_is_problem_started(cs, user_id, prob)) {
--- 10438,10444 ----
    if (!admin_mode && stop_time > 0) {
      FAIL(NEW_SRV_ERR_CONTEST_ALREADY_FINISHED);
    }
!   if (!admin_mode && serve_check_user_quota(cs, prob->id, user_id, run_size) < 0) {
      FAIL(NEW_SRV_ERR_RUN_QUOTA_EXCEEDED);
    }
    if (!admin_mode && !serve_is_problem_started(cs, user_id, prob)) {
***************
*** 11056,11062 ****
      ns_error(log_f, NEW_SRV_ERR_CONTEST_ALREADY_FINISHED);
      goto done;
    }
!   if (serve_check_user_quota(cs, phr->user_id, run_size) < 0) {
      ns_error(log_f, NEW_SRV_ERR_RUN_QUOTA_EXCEEDED);
      goto done;
    }
--- 11056,11062 ----
      ns_error(log_f, NEW_SRV_ERR_CONTEST_ALREADY_FINISHED);
      goto done;
    }
!   if (serve_check_user_quota(cs, prob->id, phr->user_id, run_size) < 0) {
      ns_error(log_f, NEW_SRV_ERR_RUN_QUOTA_EXCEEDED);
      goto done;
    }
***************
*** 14550,14556 ****
    if (cs->clients_suspended) FAIL(NEW_SRV_ERR_CLIENTS_SUSPENDED);
    if (!start_time) FAIL(NEW_SRV_ERR_CONTEST_NOT_STARTED);
    if (stop_time) FAIL(NEW_SRV_ERR_CONTEST_ALREADY_FINISHED);
!   if (serve_check_user_quota(cs, phr->user_id, run_size) < 0)
      FAIL(NEW_SRV_ERR_RUN_QUOTA_EXCEEDED);
    // problem submit start time
    if (!serve_is_problem_started(cs, phr->user_id, prob))
--- 14550,14556 ----
    if (cs->clients_suspended) FAIL(NEW_SRV_ERR_CLIENTS_SUSPENDED);
    if (!start_time) FAIL(NEW_SRV_ERR_CONTEST_NOT_STARTED);
    if (stop_time) FAIL(NEW_SRV_ERR_CONTEST_ALREADY_FINISHED);
!   if (serve_check_user_quota(cs, prob->id, phr->user_id, run_size) < 0)
      FAIL(NEW_SRV_ERR_RUN_QUOTA_EXCEEDED);
    // problem submit start time
    if (!serve_is_problem_started(cs, phr->user_id, prob))
diff -c -r ejudge/runlog.c ejudge_new/runlog.c
*** ejudge/runlog.c	2012-09-01 20:36:25.000000000 +0300
--- ejudge_new/runlog.c	2012-10-27 20:42:02.640583726 +0300
***************
*** 714,719 ****
--- 714,739 ----
    if (ps) *ps = sz;
  }
  
+ int
+ run_get_team_problem_usage(runlog_state_t state, int user_id, int prob_id, int skip_ce_flag)
+ {
+   int i, count = 0;
+ 
+   for (i = 0; i < state->run_u; i++) {
+     if (state->runs[i].status == RUN_VIRTUAL_START
+         || state->runs[i].status == RUN_VIRTUAL_STOP
+         || state->runs[i].status == RUN_EMPTY)
+       continue;
+     if ((state->runs[i].status == RUN_COMPILE_ERR || state->runs[i].status == RUN_STYLE_ERR)
+         && skip_ce_flag)
+       continue;
+     if (state->runs[i].user_id != user_id
+         || (prob_id > 0 && state->runs[i].prob_id != prob_id)) continue;
+     count++;
+   }
+   return count;
+ }
+ 
  /* FIXME: VERY DUMB */
  int
  run_get_attempts(
diff -c -r ejudge/runlog.h ejudge_new/runlog.h
*** ejudge/runlog.h	2012-09-01 20:36:25.000000000 +0300
--- ejudge_new/runlog.h	2012-10-27 20:52:38.236611293 +0300
***************
*** 149,154 ****
--- 149,155 ----
  time_t run_get_duration(runlog_state_t);
  
  void run_get_team_usage(runlog_state_t, int, int *, size_t*);
+ int run_get_team_problem_usage(runlog_state_t, int, int, int);
  int  run_get_attempts(runlog_state_t, int, int *, int *, int);
  int run_count_all_attempts(runlog_state_t state, int user_id, int prob_id);
  char *run_status_str(int, char *, int, int, int);
diff -c -r ejudge/serve_2.c ejudge_new/serve_2.c
*** ejudge/serve_2.c	2012-09-01 20:36:25.000000000 +0300
--- ejudge_new/serve_2.c	2012-10-27 20:50:25.884605551 +0300
***************
*** 389,401 ****
  }
  
  int
! serve_check_user_quota(serve_state_t state, int user_id, size_t size)
  {
    int num;
    size_t total;
  
    if (size > state->global->max_run_size) return -1;
    run_get_team_usage(state->runlog_state, user_id, &num, &total);
    if (num > state->global->max_run_num
        || total + size > state->global->max_run_total)
      return -1;
--- 389,402 ----
  }
  
  int
! serve_check_user_quota(serve_state_t state, int prob_id, int user_id, size_t size)
  {
    int num;
    size_t total;
  
    if (size > state->global->max_run_size) return -1;
    run_get_team_usage(state->runlog_state, user_id, &num, &total);
+   num = run_get_team_problem_usage(state->runlog_state, prob_id, user_id, state->global->ignore_compile_errors);
    if (num > state->global->max_run_num
        || total + size > state->global->max_run_total)
      return -1;
diff -c -r ejudge/serve_state.h ejudge_new/serve_state.h
*** ejudge/serve_state.h	2012-09-01 20:36:25.000000000 +0300
--- ejudge_new/serve_state.h	2012-10-27 20:47:26.596597788 +0300
***************
*** 340,346 ****
  void serve_load_status_file(serve_state_t state);
  void serve_remove_status_file(serve_state_t state);
  
! int serve_check_user_quota(serve_state_t, int user_id, size_t size);
  int serve_check_clar_quota(serve_state_t, int user_id, size_t size);
  
  int serve_check_cnts_caps(serve_state_t state, const struct contest_desc *,
--- 340,346 ----
  void serve_load_status_file(serve_state_t state);
  void serve_remove_status_file(serve_state_t state);
  
! int serve_check_user_quota(serve_state_t, int prob_id, int user_id, size_t size);
  int serve_check_clar_quota(serve_state_t, int user_id, size_t size);
  
  int serve_check_cnts_caps(serve_state_t state, const struct contest_desc *,

Post Reply