From: Leandro Lucarella Date: Wed, 14 Mar 2007 00:27:49 +0000 (+0000) Subject: Agregar finalizador de instancias de entrega. X-Git-Tag: 0_9_0~149 X-Git-Url: https://git.llucax.com/z.facultad/75.52/sercom.git/commitdiff_plain/4b7437a8033c0bc66eae8be038000a86dc54c35b Agregar finalizador de instancias de entrega. Falta testing, pero al menos corre sin errores. --- diff --git a/TODO.txt b/TODO.txt index 6087ecb..1413f0e 100644 --- a/TODO.txt +++ b/TODO.txt @@ -1,6 +1,4 @@ - Backend (luca) - * Hacer el finalizador de entregas (selección de entregas a corregir y round - robbin para repartir tps). * Hacer un control del límite de tiempo que un subproceso puede tomar más bullet-proof (un sleep(99999999) hace pinchar el sistema). Ver sercom viejo. * Poner advertencias (error?) si se sobreescriben archivos de la entrega del diff --git a/sercom/finalizer.py b/sercom/finalizer.py new file mode 100644 index 0000000..1075cf6 --- /dev/null +++ b/sercom/finalizer.py @@ -0,0 +1,67 @@ +# vim: set et sw=4 sts=4 encoding=utf-8 foldmethod=marker : + +from sercom.model import InstanciaDeEntrega +import logging + +log = logging.getLogger('sercom.finalizer') + +error_interno = _(u'\n**Hubo un error interno al finalizar la instancia.**\n') + +class Finalizer(object): #{{{ + + def __init__(self, name, queue): #{{{ y properties + self.name = name + self.queue = queue + #}}} + + def run(self): #{{{ + instancia_id = self.queue.get() # blocking + while instancia_id is not None: + instancia = InstanciaDeEntrega.get(instancia_id) + log.debug(_(u'Nueva instancia para procesar en finalizer %s: %s'), + self.name, instancia) + self.finalize(instancia) + log.debug(_(u'Fin de proceso de instancia: %s'), instancia) + instancia_id = self.queue.get() # blocking + #}}} + + def finalize(self, instancia): #{{{ + log.debug(_(u'Finalizer.finalize(instancia=%s)'), instancia) + instancia.inicio_proceso = datetime.now() + try: + try: + instancia.finalizar() + except Exception, e: + if isinstance(e, SystemExit): raise + instancia.observaciones += error_interno + log.exception(_('Hubo una excepcion inesperada')) # FIXME encoding + except: + entrega.observaciones += error_interno + log.exception(_('Hubo una excepcion inesperada desconocida')) # FIXME encoding + else: + log.info(_(u'Instancia de entrega finalizada bien: %s'), instancia) + finally: + instancia.fin_proceso = datetime.now() + #}}} + +#}}} + +def instancia_finalizar(self): #{{{ + log.debug(_(u'InstanciaDeEntrega.finalizar()')) + curso = self.ejercicio.curso + docentes = [di.docente for di in curso.docentes if di.corrige] + curr_docente = 0 + for ai in curso.alumnos: + mejor_entrega = None + for entrega in Entrega.selectBy(instancia=self, entregador=ai).orderBy(-Entrega.q.fecha): + if not mejor_entrega or not mejor_entrega.exito and entrega.exito: + mejor_entrega = entrega + if mejor_entrega: + mejor_entrega.make_correccion(docentes[curr_docente]) + curr_docente = (curr_docente + 1) % len(docentes) + else: + log.info(_(u'El alumno inscripto %s no entregó', ai)) + +InstanciaDeEntrega.finalizar = instancia_finalizar +#}}} + diff --git a/start-sercom.py b/start-sercom.py index 45625c8..57ff058 100644 --- a/start-sercom.py +++ b/start-sercom.py @@ -1,4 +1,5 @@ #!/usr/bin/python +# vim: set et sw=4 sts=4 encoding=utf-8 foldmethod=marker : import locale locale.setlocale(locale.LC_ALL, '') @@ -24,6 +25,46 @@ elif exists(join(dirname(__file__), "setup.py")): else: update_config(configfile="prod.cfg",modulename="sercom.config") +from sercom.model import InstanciaDeEntrega, hub +from sercom.finalizer import Finalizer +from threading import Thread +from datetime import datetime +import time +import logging + +log = logging.getLogger('sercom.tester') + +class Queue(object): #{{{ + def __init__(self): + self.go_on = True + def get(self): + while self.go_on: + try: + hub.begin() + try: + select = InstanciaDeEntrega.selectBy(inicio_proceso=None) + instancia = select.orderBy(InstanciaDeEntrega.q.fin)[0] + instancia.inicio_proceso = datetime.now() + finally: + hub.commit() + return instancia.id + except IndexError: + log.debug(_(u'No hay instancias de entrega sin finalizar')) + time.sleep(30) # TODO config? + except Exception, e: + if isinstance(e, SystemExit): + raise + log.exception('Queue: ') + time.sleep(30) # TODO config? + return None +#}}} + +q = Queue() +finalizer = Finalizer(name='juanca', queue=q) +t = Thread(name='juanca', target=finalizer.run) +t.start() + from sercom.controllers import Root start_server(Root()) + diff --git a/testtester.py b/testtester.py index e549d03..96356c8 100644 --- a/testtester.py +++ b/testtester.py @@ -33,11 +33,12 @@ class Queue(object): return e.id except IndexError: log.debug(_(u'No hay entregas pendientes')) - time.sleep(5) # TODO config? + time.sleep(10) # TODO config? except Exception, e: if isinstance(e, SystemExit): raise log.exception('Queue: ') + time.sleep(10) # TODO config? return None q = Queue()