Skip to content

Commit ac1c41a

Browse files
iceboy233twd2
authored andcommitted
allow more idle time for custom judge as they need to wait on user (#61)
program
1 parent 57a480b commit ac1c41a

File tree

3 files changed

+14
-6
lines changed

3 files changed

+14
-6
lines changed

jd4/case.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ async def judge(self, package):
6060
wait_cgroup(cgroup_sock,
6161
execute_task,
6262
self.time_limit_ns,
63+
self.time_limit_ns,
6364
self.memory_limit_bytes,
6465
self.process_limit))
6566
execute_status = await execute_task
@@ -178,11 +179,13 @@ async def prepare_judge_sandbox():
178179
wait_cgroup(user_cgroup_sock,
179180
user_execute_task,
180181
self.time_ns,
182+
self.time_ns,
181183
self.memory_bytes,
182184
PROCESS_LIMIT),
183185
wait_cgroup(judge_cgroup_sock,
184186
judge_execute_task,
185187
DEFAULT_TIME_NS,
188+
self.time_ns + DEFAULT_TIME_NS,
186189
DEFAULT_MEMORY_BYTES,
187190
PROCESS_LIMIT))
188191
user_execute_status, judge_execute_status = await gather(

jd4/cgroup.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,8 @@ def enter_cgroup(socket_path):
107107
def _get_idle():
108108
return float(read_text_file('/proc/uptime').split()[1])
109109

110-
async def wait_cgroup(sock, execute_task, time_limit_ns, memory_limit_bytes, process_limit):
110+
async def wait_cgroup(sock, execute_task, cpu_limit_ns, idle_limit_ns,
111+
memory_limit_bytes, process_limit):
111112
cgroup = CGroup()
112113
try:
113114
cgroup.memory_limit_bytes = memory_limit_bytes
@@ -117,13 +118,16 @@ async def wait_cgroup(sock, execute_task, time_limit_ns, memory_limit_bytes, pro
117118

118119
while True:
119120
cpu_usage_ns = cgroup.cpu_usage_ns
121+
cpu_remain_ns = cpu_limit_ns - cpu_usage_ns
122+
if cpu_remain_ns <= 0:
123+
return cpu_usage_ns, cgroup.memory_usage_bytes
120124
idle_usage_ns = int((_get_idle() - start_idle) / cpu_count() * 1e9)
121-
time_usage_ns = max(cpu_usage_ns, idle_usage_ns)
122-
time_remain_ns = time_limit_ns - time_usage_ns
123-
if time_remain_ns <= 0:
124-
return time_usage_ns, cgroup.memory_usage_bytes
125+
idle_remain_ns = idle_limit_ns - idle_usage_ns
126+
if idle_remain_ns <= 0:
127+
return idle_usage_ns, cgroup.memory_usage_bytes
125128
try:
126-
await wait_for(shield(execute_task), (time_remain_ns + WAIT_JITTER_NS) / 1e9)
129+
await wait_for(shield(execute_task),
130+
(min(cpu_remain_ns, idle_remain_ns) + WAIT_JITTER_NS) / 1e9)
127131
return cgroup.cpu_usage_ns, cgroup.memory_usage_bytes
128132
except TimeoutError:
129133
pass

jd4/compile.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ async def _compiler_build(compiler,
133133
wait_cgroup(cgroup_sock,
134134
build_task,
135135
time_limit_ns,
136+
time_limit_ns,
136137
memory_limit_bytes,
137138
process_limit))
138139
package, status = await build_task

0 commit comments

Comments
 (0)