From e421f4ab852533f05baa3e12ce226d753992a950 Mon Sep 17 00:00:00 2001 From: Sumukh Sridhara Date: Sun, 19 Feb 2017 15:04:52 -0800 Subject: [PATCH 1/8] Prevent divide by zero --- server/autograder.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/server/autograder.py b/server/autograder.py index 716f47e6c..a033d9c86 100644 --- a/server/autograder.py +++ b/server/autograder.py @@ -178,6 +178,9 @@ def autograde_assignment(assignment_id): ] num_tasks = len(tasks) + if not num_tasks: + return "No submissions to grade" + def retry_task(task): if task.retries >= MAX_RETRIES: logger.error('Did not receive a score for backup {} after {} retries'.format( From eb8bebed1800ad2ac10f8af5c2938ead38b9fad3 Mon Sep 17 00:00:00 2001 From: Sumukh Sridhara Date: Sun, 19 Feb 2017 15:06:41 -0800 Subject: [PATCH 2/8] Allow logs with level of >50 (critical or higher) to get logged right away --- server/jobs/__init__.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/server/jobs/__init__.py b/server/jobs/__init__.py index 31e79df00..1fd3e6052 100644 --- a/server/jobs/__init__.py +++ b/server/jobs/__init__.py @@ -9,6 +9,8 @@ from server.models import db, Job +URGENT_LEVEL = 50 + class JobLogHandler(logging.StreamHandler): """Stream log contents to buffer and to DB. """ def __init__(self, stream, job, log_every=10): @@ -18,11 +20,11 @@ def __init__(self, stream, job, log_every=10): self.counter = 0 self.log_every = log_every - def handle(self, record): + def handle(self, record, force=True): self.counter += 1 super().handle(record) print(record.message) - if (self.counter % self.log_every) == 0: + if record.levelno >= URGENT_LEVEL or not (self.counter % self.log_every): self.job.log = self.contents db.session.commit() From 2395e14c22c9f44981403e6b3d316071eb59b403 Mon Sep 17 00:00:00 2001 From: Sumukh Sridhara Date: Sun, 19 Feb 2017 15:07:18 -0800 Subject: [PATCH 3/8] Use the urgent level in some jobs --- server/autograder.py | 6 ++++-- server/jobs/example.py | 3 +++ server/jobs/moss.py | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/server/autograder.py b/server/autograder.py index a033d9c86..bd5954cca 100644 --- a/server/autograder.py +++ b/server/autograder.py @@ -197,8 +197,10 @@ def retry_task(task): graded = len([task for task in tasks if task.status in (GradingStatus.DONE, GradingStatus.FAILED)]) - logger.info('Graded {:>4}/{} ({:>5.1f}%)'.format( - graded, num_tasks, 100 * graded / num_tasks)) + + logger.log(jobs.URGENT_LEVEL, 'Graded {:>4}/{} ({:>5.1f}%)'.format( + graded, num_tasks, 100 * graded / num_tasks)) + if graded == num_tasks: break diff --git a/server/jobs/example.py b/server/jobs/example.py index 2a6338635..54e3ac0a4 100644 --- a/server/jobs/example.py +++ b/server/jobs/example.py @@ -13,6 +13,9 @@ def test_job(duration=0, should_fail=False, make_file=False): logger = jobs.get_job_logger() logger.info('Starting...') + logger.log(jobs.URGENT_LEVEL, + 'This job will sleep for {} seconds'.format(duration)) + time.sleep(duration) if should_fail: 1/0 diff --git a/server/jobs/moss.py b/server/jobs/moss.py index 38b4627e0..0b9c14cce 100644 --- a/server/jobs/moss.py +++ b/server/jobs/moss.py @@ -124,7 +124,7 @@ def submit_to_moss(moss_id=None, file_regex=".*", assignment_id=None, language=N .format(lang=language, templates=templates, folder=' '.join(all_student_files))) - logger.info("Running {}".format(command[:100] + ' ...')) + logger.log(jobs.URGENT_LEVEL, "Running {}".format(command[:100] + ' ...')) try: process = subprocess.check_output(shlex.split(command), From e6f16c8d554254374c7f7baab5005aaa8c84b255 Mon Sep 17 00:00:00 2001 From: Sumukh Sridhara Date: Sun, 19 Feb 2017 15:10:48 -0800 Subject: [PATCH 4/8] Just use logging.CRITICAL directly --- server/autograder.py | 4 ++-- server/jobs/__init__.py | 4 +--- server/jobs/example.py | 3 +-- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/server/autograder.py b/server/autograder.py index bd5954cca..160c2220a 100644 --- a/server/autograder.py +++ b/server/autograder.py @@ -198,8 +198,8 @@ def retry_task(task): graded = len([task for task in tasks if task.status in (GradingStatus.DONE, GradingStatus.FAILED)]) - logger.log(jobs.URGENT_LEVEL, 'Graded {:>4}/{} ({:>5.1f}%)'.format( - graded, num_tasks, 100 * graded / num_tasks)) + logger.critical('Graded {:>4}/{} ({:>5.1f}%)'.format( + graded, num_tasks, 100 * graded / num_tasks)) if graded == num_tasks: break diff --git a/server/jobs/__init__.py b/server/jobs/__init__.py index 1fd3e6052..19fce0157 100644 --- a/server/jobs/__init__.py +++ b/server/jobs/__init__.py @@ -9,8 +9,6 @@ from server.models import db, Job -URGENT_LEVEL = 50 - class JobLogHandler(logging.StreamHandler): """Stream log contents to buffer and to DB. """ def __init__(self, stream, job, log_every=10): @@ -24,7 +22,7 @@ def handle(self, record, force=True): self.counter += 1 super().handle(record) print(record.message) - if record.levelno >= URGENT_LEVEL or not (self.counter % self.log_every): + if record.levelno >= logging.CRITICAL or not (self.counter % self.log_every): self.job.log = self.contents db.session.commit() diff --git a/server/jobs/example.py b/server/jobs/example.py index 54e3ac0a4..fb75bb6a4 100644 --- a/server/jobs/example.py +++ b/server/jobs/example.py @@ -13,8 +13,7 @@ def test_job(duration=0, should_fail=False, make_file=False): logger = jobs.get_job_logger() logger.info('Starting...') - logger.log(jobs.URGENT_LEVEL, - 'This job will sleep for {} seconds'.format(duration)) + logger.critical('This job will sleep for {} seconds'.format(duration)) time.sleep(duration) if should_fail: From 390f5f08931faf2ad36d72c8cbf3f988b654b123 Mon Sep 17 00:00:00 2001 From: Sumukh Sridhara Date: Sun, 19 Feb 2017 15:11:01 -0800 Subject: [PATCH 5/8] Fix typo --- server/jobs/moss.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/jobs/moss.py b/server/jobs/moss.py index 0b9c14cce..8819c3ded 100644 --- a/server/jobs/moss.py +++ b/server/jobs/moss.py @@ -44,7 +44,7 @@ def submit_to_moss(moss_id=None, file_regex=".*", assignment_id=None, language=N .order_by(Backup.created.desc()) .all()) - logger.info("Retreived {} final submissions".format(len(subm_keys))) + logger.info("Retrieved {} final submissions".format(len(subm_keys))) # TODO: Customize the location of the tmp writing (especially useful during dev) with tempfile.TemporaryDirectory() as tmp_dir: From d8b6656576384be8c05248537bbfcbebcce56b22 Mon Sep 17 00:00:00 2001 From: Sumukh Sridhara Date: Sun, 19 Feb 2017 15:11:47 -0800 Subject: [PATCH 6/8] Remove extra/unused kwarg --- server/jobs/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/jobs/__init__.py b/server/jobs/__init__.py index 19fce0157..5003a1276 100644 --- a/server/jobs/__init__.py +++ b/server/jobs/__init__.py @@ -18,7 +18,7 @@ def __init__(self, stream, job, log_every=10): self.counter = 0 self.log_every = log_every - def handle(self, record, force=True): + def handle(self, record): self.counter += 1 super().handle(record) print(record.message) From 3960b3a5e51897222106207c2d634cfd0315ef14 Mon Sep 17 00:00:00 2001 From: Sumukh Sridhara Date: Sun, 19 Feb 2017 15:12:39 -0800 Subject: [PATCH 7/8] use critical in moss too --- server/jobs/moss.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/jobs/moss.py b/server/jobs/moss.py index 8819c3ded..4043ea3da 100644 --- a/server/jobs/moss.py +++ b/server/jobs/moss.py @@ -124,7 +124,7 @@ def submit_to_moss(moss_id=None, file_regex=".*", assignment_id=None, language=N .format(lang=language, templates=templates, folder=' '.join(all_student_files))) - logger.log(jobs.URGENT_LEVEL, "Running {}".format(command[:100] + ' ...')) + logger.critical("Running {}".format(command[:100] + ' ...')) try: process = subprocess.check_output(shlex.split(command), From 7572c0c70a0bfbafb46a34d932d6bc05534bf24c Mon Sep 17 00:00:00 2001 From: Sumukh Sridhara Date: Sun, 19 Feb 2017 15:16:42 -0800 Subject: [PATCH 8/8] Update tests with new output for example job --- tests/test_job.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_job.py b/tests/test_job.py index 7c9649d91..e9228a8e2 100644 --- a/tests/test_job.py +++ b/tests/test_job.py @@ -44,7 +44,7 @@ def test_job(self): job = Job.query.get(job_id) self.assertEqual(job.status, 'finished') self.assertFalse(job.failed) - self.assertEqual(job.log, 'Starting...\nFinished!\n') + self.assertEqual(job.log, 'Starting...\nThis job will sleep for 0 seconds\nFinished!\n') def test_failing_job(self): job_id = self.start_test_job(should_fail=True)