Здравствуйте.
Хотелось бы иметь следующую функциональность: возможность устанавливать для каждой задачи контеста лимит возможных посылок, при достижение которого, дальнейшие посылки невозможны. Возможно ли это в текущей версии или требуется модификация исходного кода? В случае второго варианта, заинтересованы ли вы в таком патче и если да, то какие требования к его содержанию.
Ограничение количества посылок на задачу
Re: Ограничение количества посылок на задачу
В текущей версии этого нет.
Можете попробовать добавить, но это может оказаться не очень просто. Если возникнут вопросы, я постараюсь ответить.
Можете попробовать добавить, но это может оказаться не очень просто. Если возникнут вопросы, я постараюсь ответить.
Re: Ограничение количества посылок на задачу
Я делал такое довольно просто. Я модифицировал код и после этого настройка, которая ограничивала количество посылок, стала ограничивать кол-во посылок на задачу (было лень вводить дополнительный параметр).
Есть патч для версии 2.3.24
Есть патч для версии 2.3.24
-
- Posts:2
- Joined:08 December 2012, 15:30
Re: Ограничение количества посылок на задачу
Хотелось бы иметь более гибкую настройку, позволяющую устанавливать отдельный лимит по каждой задаче (или хотя бы группе), но если возможно, я бы посмотрел ваш патчhotsnr wrote:Я делал такое довольно просто. Я модифицировал код и после этого настройка, которая ограничивала количество посылок, стала ограничивать кол-во посылок на задачу (было лень вводить дополнительный параметр).
Есть патч для версии 2.3.24
Re: Ограничение количества посылок на задачу
Мне не требовались такие возможности, мне было достаточно ограничивать на одинаковое число посылок для задачи. Для вашего варианта нужно вводить опцию в конфиг или использовать существующую какую-нибудь (вариант не очень).
Извините за кривой код и изобретение велосипеда, но меня это устраивает
Извините за кривой код и изобретение велосипеда, но меня это устраивает
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 *,