Skip to content

Commit

Permalink
fix: judger
Browse files Browse the repository at this point in the history
  • Loading branch information
M1saka10010 committed Jan 24, 2024
1 parent e413d81 commit b06174c
Show file tree
Hide file tree
Showing 6 changed files with 122 additions and 52 deletions.
4 changes: 2 additions & 2 deletions judge/src/dispatcher.c
Original file line number Diff line number Diff line change
Expand Up @@ -368,8 +368,8 @@ int work()
ID[i] = fork(); // start to fork
if (ID[i] == 0)
{
// if (DEBUG)
write_log("<<=sid=%d===clientid=%d==>>\n", runid, i);
if (DEBUG)
write_log("<<=sid=%d===clientid=%d==>>\n", runid, i);
run_client(runid, i); // if the process is the son, run it
exit(0);
}
Expand Down
13 changes: 7 additions & 6 deletions judge/src/judge.c
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,7 @@ void init_mysql_conf()
read_kv_int(&kv[i], "OJ_FULL_DIFF", &full_diff);
read_kv_int(&kv[i], "OJ_SHM_RUN", &shm_run);
read_kv_int(&kv[i], "OJ_COMPILE_CHROOT", &compile_chroot);
read_kv_int(&kv[i], "OJ_USE_PTRACE", &use_ptrace);
}
}
}
Expand Down Expand Up @@ -1515,15 +1516,15 @@ int main(int argc, char **argv)
subtask_struct *subtask_list; // 子任务链表
double score = 0; // OI mode score
init_parameters(argc, argv, &solution_id, &runner_id);
write_log("[Solution ID: %d] start judging", solution_id);
// write_log("[Solution ID: %d] start judging", solution_id);
init_mysql_conf();
write_log("[Solution ID: %d] mysql conf init success", solution_id);
// write_log("[Solution ID: %d] mysql conf init success", solution_id);
if (!init_mysql_conn())
{
write_log("mysql init error\n");
exit(0); // exit if mysql is down
}
write_log("[Solution ID: %d] mysql init success", solution_id);
// write_log("[Solution ID: %d] mysql init success", solution_id);
// set work directory to start running & judging
// sprintf(work_dir, "%srun/%d/", oj_home, runner_id);
int snp = snprintf(work_dir, BUFFER_SIZE, "%srun/%d/", oj_home, runner_id);
Expand All @@ -1547,7 +1548,7 @@ int main(int argc, char **argv)

// get the limit
problem = get_problem_info(problem_id);
write_log("[Solution ID: %d] get info success", solution_id);
// write_log("[Solution ID: %d] get info success", solution_id);
// java is lucky
// Clang Clang++ not VM or Script
if (lang >= 2)
Expand All @@ -1573,7 +1574,7 @@ int main(int argc, char **argv)

// compile
// set the result to compiling
write_log("[Solution ID: %d] Compiling", solution_id);
// write_log("[Solution ID: %d] Compiling", solution_id);
if (compile(lang, work_dir) != 0)
{
addceinfo(solution_id);
Expand Down Expand Up @@ -1685,7 +1686,7 @@ int main(int argc, char **argv)
subtask_struct *subtask_node = subtask_list;
int test_result_rec[OJ_NT + 1]; // 记录各个测试点的通过结果的数量
memset(test_result_rec, 0, sizeof(test_result_rec));
write_log("[Solution ID: %d] Judging", solution_id);
// write_log("[Solution ID: %d] Judging", solution_id);
// 遍历子任务链表
while (subtask_node->next != NULL)
{
Expand Down
2 changes: 1 addition & 1 deletion polygon/config.ini
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,4 @@ OJ_SIM_ENABLE=0
OJ_SHM_RUN=1 #是否使用/dev/shm的共享内存虚拟磁盘来运行答案,如果启用能提高判题速度,但需要较多内存
OJ_LANG_SET=0,1,2,3
OJ_COMPILE_CHROOT=0
OJ_USE_PTRACE=1
OJ_USE_PTRACE=1
71 changes: 53 additions & 18 deletions polygon/src/common.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,41 +9,47 @@

int DEBUG = 0;

struct database {
struct database
{
char host_name[LENGTH];
char user_name[LENGTH];
char password[LENGTH];
char db_name[LENGTH];
char mysql_unix_port[LENGTH]; //连接 mysql sock文件路径
char mysql_unix_port[LENGTH]; // 连接 mysql sock文件路径
int port_number;
} db;

typedef struct
{
char key[50];
char value[LENGTH];
} kvPair;

#define OJ_WT0 0 // Pending
#define OJ_WT1 1 // Pending_Rejudging
#define OJ_CI 2 // Compiling
#define OJ_RI 3 // Running_Judging
#define OJ_AC 4 // Accepted
#define OJ_PE 5 // Presentation Error
#define OJ_WA 6 // Wrong Answer
#define OJ_TL 7 // Time Limit Exceeded
#define OJ_ML 8 // Memory Limit Exceeded
#define OJ_OL 9 // Output Limit Exceeded
#define OJ_RE 10 // Runtime Error
#define OJ_CE 11 // Compilation Error
#define OJ_WT0 0 // Pending
#define OJ_WT1 1 // Pending_Rejudging
#define OJ_CI 2 // Compiling
#define OJ_RI 3 // Running_Judging
#define OJ_AC 4 // Accepted
#define OJ_PE 5 // Presentation Error
#define OJ_WA 6 // Wrong Answer
#define OJ_TL 7 // Time Limit Exceeded
#define OJ_ML 8 // Memory Limit Exceeded
#define OJ_OL 9 // Output Limit Exceeded
#define OJ_RE 10 // Runtime Error
#define OJ_CE 11 // Compilation Error
#define OJ_SE 12 // System Error
#define OJ_NT 13 // No Testdata

//读取配置文件时寻找等号
int after_equal(char * c)
// 读取配置文件时寻找等号
int after_equal(char *c)
{
int i = 0;
for (; c[i] != '\0' && c[i] != '='; i++)
;
return ++i;
}

//读取配置文件时去除空格
// 读取配置文件时去除空格
void trim(char *c)
{
char buf[LENGTH];
Expand All @@ -61,7 +67,8 @@ void trim(char *c)

bool read_buf(char *buf, const char *key, char *value)
{
if (strncmp(buf, key, strlen(key)) == 0) {
if (strncmp(buf, key, strlen(key)) == 0)
{
strcpy(value, buf + after_equal(buf));
trim(value);
if (DEBUG)
Expand All @@ -78,4 +85,32 @@ void read_int(char *buf, const char *key, int *value)
sscanf(buf2, "%d", value);
}

void parseLine(char *line, kvPair *kv)
{
char *equals = strchr(line, '=');
if (equals)
{
*equals = '\0';
trim(equals + 1);
strcpy(kv->key, line);
strcpy(kv->value, equals + 1);
}
}

void read_kv(kvPair *kv, const char *key, char *value)
{
if (strncmp(kv->key, key, strlen(key)) == 0)
{
strcpy(value, kv->value);
}
}

void read_kv_int(kvPair *kv, const char *key, int *value)
{
if (strncmp(kv->key, key, strlen(key)) == 0)
{
sscanf(kv->value, "%d", value);
}
}

#endif
70 changes: 51 additions & 19 deletions polygon/src/judge.c
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,11 @@ void write_log(const char *fmt, ...)
va_list ap;
char buffer[BUFFER_SIZE];
// sprintf(buffer, "%s/log/client.log", oj_home);
if (snprintf(buffer, BUFFER_SIZE, "%s/log/client.log", oj_home) < 0)
int snp = snprintf(buffer, BUFFER_SIZE, "%s/log/client.log", oj_home);
if (snp < 0 || snp >= BUFFER_SIZE)
{
write_log("buffer overflow!");
}
{
write_log("buffer overflow!");
}
Expand Down Expand Up @@ -194,30 +198,54 @@ void init_mysql_conf()
strcpy(java_xms, "-Xms32m");
strcpy(java_xmx, "-Xmx256m");
// sprintf(buf, "%s/config.ini", oj_home);
if (snprintf(buf, BUFFER_SIZE, "%s/config.ini", oj_home) < 0)
int snp = snprintf(buf, BUFFER_SIZE, "%s/config.ini", oj_home);
if (snp < 0 || snp >= BUFFER_SIZE)
{
write_log("buffer overflow!");
}
fp = fopen("./config.ini", "re");
if (fp != NULL)
{
// while (fgets(buf, BUFFER_SIZE - 1, fp))
// {
// read_buf(buf, "OJ_HOST_NAME", db.host_name);
// read_buf(buf, "OJ_USER_NAME", db.user_name);
// read_buf(buf, "OJ_PASSWORD", db.password);
// read_buf(buf, "OJ_DB_NAME", db.db_name);
// read_buf(buf, "OJ_MYSQL_UNIX_PORT", db.mysql_unix_port);
// read_int(buf, "OJ_PORT_NUMBER", &db.port_number);
// read_int(buf, "OJ_JAVA_TIME_BONUS", &java_time_bonus);
// read_int(buf, "OJ_JAVA_MEMORY_BONUS", &java_memory_bonus);
// read_buf(buf, "OJ_JAVA_XMS", java_xms);
// read_buf(buf, "OJ_JAVA_XMX", java_xmx);
// read_int(buf, "OJ_FULL_DIFF", &full_diff);
// read_int(buf, "OJ_SHM_RUN", &shm_run);
// read_int(buf, "OJ_COMPILE_CHROOT", &compile_chroot);
// }
kvPair kv[20];
int i = 0;
while (fgets(buf, BUFFER_SIZE - 1, fp))
{
read_buf(buf, "OJ_HOST_NAME", db.host_name);
read_buf(buf, "OJ_USER_NAME", db.user_name);
read_buf(buf, "OJ_PASSWORD", db.password);
read_buf(buf, "OJ_DB_NAME", db.db_name);
read_buf(buf, "OJ_MYSQL_UNIX_PORT", db.mysql_unix_port);
read_int(buf, "OJ_PORT_NUMBER", &db.port_number);
read_int(buf, "OJ_JAVA_TIME_BONUS", &java_time_bonus);
read_int(buf, "OJ_JAVA_MEMORY_BONUS", &java_memory_bonus);
read_buf(buf, "OJ_JAVA_XMS", java_xms);
read_buf(buf, "OJ_JAVA_XMX", java_xmx);
read_int(buf, "OJ_FULL_DIFF", &full_diff);
read_int(buf, "OJ_SHM_RUN", &shm_run);
read_int(buf, "OJ_COMPILE_CHROOT", &compile_chroot);
parseLine(buf, &kv[i++]);
}
fclose(fp);
while (i--)
{
read_kv(&kv[i], "OJ_HOST_NAME", db.host_name);
read_kv(&kv[i], "OJ_USER_NAME", db.user_name);
read_kv(&kv[i], "OJ_PASSWORD", db.password);
read_kv(&kv[i], "OJ_DB_NAME", db.db_name);
read_kv(&kv[i], "OJ_MYSQL_UNIX_PORT", db.mysql_unix_port);
read_kv_int(&kv[i], "OJ_PORT_NUMBER", &db.port_number);
read_kv_int(&kv[i], "OJ_JAVA_TIME_BONUS", &java_time_bonus);
read_kv_int(&kv[i], "OJ_JAVA_MEMORY_BONUS", &java_memory_bonus);
read_kv(&kv[i], "OJ_JAVA_XMS", java_xms);
read_kv(&kv[i], "OJ_JAVA_XMX", java_xmx);
read_kv_int(&kv[i], "OJ_FULL_DIFF", &full_diff);
read_kv_int(&kv[i], "OJ_SHM_RUN", &shm_run);
read_kv_int(&kv[i], "OJ_COMPILE_CHROOT", &compile_chroot);
read_kv_int(&kv[i], "OJ_USE_PTRACE", &use_ptrace);
}
}
}

Expand Down Expand Up @@ -1159,7 +1187,8 @@ void mk_shm_workdir(char *work_dir)
{
char shm_path[BUFFER_SIZE];
// sprintf(shm_path, "/dev/shm/jnoj%s", work_dir);
if (snprintf(shm_path, BUFFER_SIZE, "/dev/shm/jnoj%s", work_dir) < 0)
int snp = nprintf(shm_path, BUFFER_SIZE, "/dev/shm/jnoj%s", work_dir);
if (snp < 0 || snp >= BUFFER_SIZE)
{
write_log("shm_path too long");
}
Expand All @@ -1169,7 +1198,8 @@ void mk_shm_workdir(char *work_dir)
execute_cmd("chmod 755 %s ", shm_path);
// sim need a soft link in shm_dir to work correctly
// sprintf(shm_path, "/dev/shm/jnoj%s", oj_home);
if (snprintf(shm_path, BUFFER_SIZE, "/dev/shm/jnoj%s", oj_home) < 0)
snp = nprintf(shm_path, BUFFER_SIZE, "/dev/shm/jnoj%s", oj_home);
if (snp < 0 || snp >= BUFFER_SIZE)
{
write_log("shm_path too long");
}
Expand Down Expand Up @@ -1211,7 +1241,8 @@ int main(int argc, char **argv)
}
// set work directory to start running & judging
// sprintf(work_dir, "%srun/%d", oj_home, runner_id);
if (snprintf(work_dir, BUFFER_SIZE, "%srun/%d", oj_home, runner_id) < 0)
int snp = snprintf(work_dir, BUFFER_SIZE, "%srun/%d", oj_home, runner_id);
if (snp < 0 || snp >= BUFFER_SIZE)
{
write_log("work_dir too long");
}
Expand Down Expand Up @@ -1277,7 +1308,8 @@ int main(int argc, char **argv)

// the fullpath of data dir
// sprintf(fullpath, "%sdata/%d", oj_home, problem_id);
if (snprintf(fullpath, BUFFER_SIZE, "%sdata/%d", oj_home, problem_id) < 0)
snp = snprintf(fullpath, BUFFER_SIZE, "%sdata/%d", oj_home, problem_id);
if (snp < 0 || snp >= BUFFER_SIZE)
{
write_log("fullpath too long");
}
Expand Down
14 changes: 8 additions & 6 deletions polygon/src/polygon.c
Original file line number Diff line number Diff line change
Expand Up @@ -131,11 +131,12 @@ void init_mysql_conf()
// "WHERE result<2 and MOD(id,%d)=%d "
// "ORDER BY result ASC,id ASC limit %d",
// oj_tot, oj_mod, max_running * 2);
if (snprintf(query, BUFFER_SIZE,
"SELECT id FROM polygon_status "
"WHERE result<2 and MOD(id,%d)=%d "
"ORDER BY result ASC,id ASC limit %d",
oj_tot, oj_mod, max_running * 2) < 0)
int snp = snprintf(query, BUFFER_SIZE,
"SELECT id FROM polygon_status "
"WHERE result<2 and MOD(id,%d)=%d "
"ORDER BY result ASC,id ASC limit %d",
oj_tot, oj_mod, max_running * 2);
if (snp < 0 || snp >= BUFFER_SIZE)
{
printf("query buffer overflow\n");
}
Expand Down Expand Up @@ -568,7 +569,8 @@ int main(int argc, char *argv[])
chdir(oj_home); // change the dir

// sprintf(lock_file, "%s/etc/judge.pid", oj_home);
if (snprintf(lock_file, BUFFER_SIZE, "%s/etc/judge.pid", oj_home) < 0)
int snp = snprintf(lock_file, BUFFER_SIZE, "%s/etc/judge.pid", oj_home);
if (snp < 0 || snp >= BUFFER_SIZE)
{
printf("lock_file buffer overflow\n");
}
Expand Down

0 comments on commit b06174c

Please sign in to comment.