I am using SQLite. The TIMEOUT record in the scheduler_run table eventually
shows up. I can't be sure when since it normally happens over night. I
don't know how to raise a timeout but if you tell me I can try that. That
would help narrow down the issue because if the DB is locked I would not
see the scheduler_run record inserted and my scheduler_task record would
still be marked running. Is this correct?
>From the docs I was under the impression that retry_failed would only work
if the task actually raised an exception. I will certainly add that and
hope that it works.
Would changing the database out for postgres or MySQL possibly solve the
root issue? I would obviously rather the task did not timeout.
I will enable the debug logging. Thanks so much for your help and for your
work on the scheduler Niphlod.
On Thursday, December 13, 2012 1:31:38 AM UTC-8, Niphlod wrote:
>
> are you using sqlite ? It's possible that the timeout is reached because
> database is locked and the scheduler_run record (that you confirm is
> missing) can't be inserted. Also, just to be sure, did you try raising the
> timeout?
>
> If I cannot fix it I will have to find a different solution for directory
>> monitoring and not use the scheduler.
>>
>
> Can't you use a task with retry_failed ?
>
> Next step is enabling debug logging of the scheduler to see what goes on
> when the task timeouts
>
> On Thursday, December 13, 2012 7:17:29 AM UTC+1, Mike D wrote:
>>
>> Hello,
>>
>> I am using the web2py scheduler to run a task to monitor a directory.
>> Here's some code describing what I'm doing:
>>
>> def get_configured_logger():
>>
>> logger = logging.getLogger("ss_server")
>>
>> if (len(logger.handlers) == 0):
>>
>> handler = logging.handlers.RotatingFileHandler("/path/to/log/log.
>> txt", maxBytes=1024*1024*10, backupCount=2)
>>
>> handler.setLevel(logging.DEBUG)
>>
>> logger.addHandler(handler)
>>
>> logger.setLevel(logging.DEBUG)
>>
>> logger.debug("Logger created")
>>
>> return logger
>>
>>
>> def write_to_log(s):
>>
>> l = get_configured_logger()
>>
>> l.info(s)
>>
>> ...
>>
>>
>> def searchForFiles():
>>
>> print("serach for files")
>>
>> write_to_log("searching for files")
>>
>> print os.getcwd()
>>
>> write_to_log("creating watermark")
>>
>> watermark_opaque = Image.open('./path/to/image/watermark.png')
>>
>> watermark = reduce_opacity(watermark_opaque, 0.7)
>>
>> write_to_log("done creating watermark")
>>
>> write_to_log("globbing files")
>>
>> files = glob.glob(INPUT_DIR + "*.jpg")
>>
>> write_to_log("files globbed")
>>
>> for filename in files:
>>
>> write_to_log("getting basename for " + filename)
>>
>> filename = os.path.basename(filename)
>>
>> write_to_log("splitting filename")
>>
>> parts = filename.split('-')
>>
>> write_to_log("checking filename")
>>
>> if (len(parts) == 6):
>>
>> try:
>>
>> print("processing file: " + filename)
>>
>> write_to_log("processing file: " + filename)
>>
>> im = Image.open(INPUT_DIR + filename)
>>
>> write_to_log("adding watermark")
>>
>> im.paste(watermark,(im.size[0] - watermark.size[0] - 20
>> ,im.size[1] - watermark.size[1] - 20),watermark)
>>
>> im.save(INPUT_DIR + filename, "JPEG", quality=100)
>>
>> write_to_log("added watermark")
>>
>> write_to_log("creating scaled images")
>>
>> createScaledImage(64, INPUT_DIR + filename, THUMBS_DIR)
>>
>> createScaledImage(600, INPUT_DIR + filename, SMALL_DIR)
>>
>> write_to_log("done creating scaled images")
>>
>> pic_id = processFile(filename)
>>
>> print("processed file successfully")
>>
>> write_to_log("processed file successfully")
>>
>> write_to_log("renaming files")
>>
>> shutil.move(INPUT_DIR + filename, PROCESSED_DIR + "%d" %
>> pic_id + ".jpg")
>>
>> shutil.move(THUMBS_DIR + filename, THUMBS_DIR + "%d" %
>> pic_id + ".jpg")
>>
>> shutil.move(SMALL_DIR + filename, SMALL_DIR + "%d" %
>> pic_id + ".jpg")
>>
>> write_to_log("done renaming files")
>>
>> except IOError:
>>
>> #this is likely due to a partial file, so let it finish
>> writing and try
>>
>> #again next time
>>
>> print("IO Error")
>>
>> write_to_log("IO Error")
>>
>> pass
>>
>> except:
>>
>> etype, eval, etb = sys.exc_info()
>>
>> print("error processing file: ", eval.message)
>>
>> write_to_log("error: " + eval.message)
>>
>> shutil.move(INPUT_DIR + filename, ERRORS_DIR + filename)
>>
>> write_to_log("end of loop")
>>
>>
>>
>> write_to_log("ending function")
>>
>> return "success"
>>
>>
>>
>> myscheduler = Scheduler(db, tasks=dict(searchForFiles=searchForFiles))
>>
>>
>> I have a task inserted into my scheduler_task table with the following
>> properties:
>> function name: searchForFiles
>> repeats: 0
>> timeout: 240
>> sync output: 15
>>
>> Everything works fine except I get random TIMEOUT runs 1-2 times per day.
>> Furthermore these runs will happen in the middle of the night when nothing
>> has been added to the directory. When a TIMEOUT happens, the last line in
>> my log file is "ending function". Also, there is no output at all in the
>> scheduler_run record for the run that was marked as TIMEOUT.
>>
>> For these reasons I do not think the timeout is happening inside my code,
>> I believe it is somehow happening between when the scheduler tries to pick
>> up task and when it calls my function. I could totally be wrong though. The
>> reason I have added in such granular logging is to find exactly where the
>> timeout was occurring so I could fix it but I cannot find the problem
>> anywhere.
>>
>> Please let me know if anyone has any ideas on what could be causing this
>> issue. Any help would be very much appreciated. If I cannot fix it I will
>> have to find a different solution for directory monitoring and not use the
>> scheduler.
>>
>> Thanks again,
>> Mike
>>
>
--