diff --git a/judge_dispatcher/migrations/0005_auto_20160519_1627.py b/judge_dispatcher/migrations/0005_auto_20160519_1627.py new file mode 100644 index 00000000..280ce659 --- /dev/null +++ b/judge_dispatcher/migrations/0005_auto_20160519_1627.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.5 on 2016-05-19 08:27 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('judge_dispatcher', '0004_auto_20160407_1816'), + ] + + operations = [ + migrations.RemoveField( + model_name='judgeserver', + name='left_instance_number', + ), + migrations.RemoveField( + model_name='judgeserver', + name='lock', + ), + migrations.RemoveField( + model_name='judgeserver', + name='workload', + ), + migrations.AddField( + model_name='judgeserver', + name='used_instance_number', + field=models.IntegerField(default=0), + ), + ] diff --git a/judge_dispatcher/models.py b/judge_dispatcher/models.py index 7305eb26..50b9c08d 100644 --- a/judge_dispatcher/models.py +++ b/judge_dispatcher/models.py @@ -8,11 +8,8 @@ class JudgeServer(models.Model): port = models.IntegerField() # 这个服务器最大可能运行的判题实例数量 max_instance_number = models.IntegerField() - left_instance_number = models.IntegerField() - workload = models.IntegerField(default=0) + used_instance_number = models.IntegerField(default=0) token = models.CharField(max_length=30) - # 进行测试用例同步的时候加锁 - lock = models.BooleanField(default=False) # status 为 false 的时候代表不使用这个服务器 status = models.BooleanField(default=True) create_time = models.DateTimeField(auto_now_add=True, blank=True, null=True) diff --git a/judge_dispatcher/tasks.py b/judge_dispatcher/tasks.py index 32b24a08..6f57abcf 100644 --- a/judge_dispatcher/tasks.py +++ b/judge_dispatcher/tasks.py @@ -4,6 +4,7 @@ import logging import time from django.db import transaction +from django.db.models import F from rpc_client import TimeoutServerProxy @@ -39,11 +40,10 @@ class JudgeDispatcher(object): def choose_judge_server(self): with transaction.atomic(): - servers = JudgeServer.objects.select_for_update().filter(workload__lt=100, lock=False, status=True).order_by("-workload") + servers = JudgeServer.objects.select_for_update().filter(used_instance_number__lt=F("max_instance_number"), status=True).order_by("max_instance_number") if servers.exists(): server = servers.first() - server.left_instance_number -= 1 - server.workload = 100 - int(float(server.left_instance_number) / server.max_instance_number * 100) + server.used_instance_number = F("used_instance_number") + 1 server.save() return server @@ -51,8 +51,7 @@ class JudgeDispatcher(object): with transaction.atomic(): # 使用原子操作, 同时因为use和release中间间隔了判题过程,需要重新查询一下 server = JudgeServer.objects.select_for_update().get(id=judge_server_id) - server.left_instance_number += 1 - server.workload = 100 - int(float(server.left_instance_number) / server.max_instance_number * 100) + server.used_instance_number = F("used_instance_number") - 1 server.save() def judge(self): diff --git a/template/src/admin/judges/judges.html b/template/src/admin/judges/judges.html index 445b6ca2..2319d359 100644 --- a/template/src/admin/judges/judges.html +++ b/template/src/admin/judges/judges.html @@ -14,7 +14,7 @@ {{ el.id }} {{ el.name }} {{ el.max_instance_number }} - {{ el.workload }} + {{ el.used_instance_number / el.max_instance_number * 100 }}% {{ el.create_time|date("yyyy-MM-dd HH:mm:ss")}}