I can't tell what logs line have been added (I see new lines but I don't 
know what is the line following "if counter ...." and what is the one 
following "if self.worker_status[0] ....")

On Tuesday, April 2, 2013 11:05:11 AM UTC+2, Paolo valleri wrote:
>
> Hi Niphlod, sorry for the late answer, I hadn't access to the involved 
> server.
> I added the two logs lines you proposed, below the logs:
> 2013-04-02 09:38:14,561 - web2py.scheduler.mapserver#4162 - DEBUG - 
> ........recording heartbeat (ACTIVE)
> 2013-04-02 09:38:14,562 - web2py.scheduler.mapserver#4162 - DEBUG - 
> send_heartbeat(), do_assign_tasks=False
> 2013-04-02 09:38:14,562 - web2py.scheduler.mapserver#4162 - DEBUG -     
> freeing workers that have not sent heartbeat
> 2013-04-02 09:38:14,564 - web2py.scheduler.mapserver#4162 - INFO - TICKER: 
> I'm a ticker
> 2013-04-02 09:38:14,644 - web2py.scheduler.mapserver#4162 - DEBUG - 
> looping...
> 2013-04-02 09:38:14,652 - web2py.scheduler.mapserver#4162 - INFO - pop 
> task True False
> 2013-04-02 09:38:14,723 - web2py.scheduler.mapserver#4162 - DEBUG - 
> is_a_ticker := True, worker_status[0] := ACTIVE
> 2013-04-02 09:38:14,732 - web2py.scheduler.mapserver#4162 - INFO - nothing 
> to do
> 2013-04-02 09:38:14,732 - web2py.scheduler.mapserver#4162 - DEBUG - 
> sleeping...
> 2013-04-02 09:38:17,727 - web2py.scheduler.mapserver#4162 - DEBUG - 
> ........recording heartbeat (ACTIVE)
> 2013-04-02 09:38:17,728 - web2py.scheduler.mapserver#4162 - DEBUG - 
> send_heartbeat(), do_assign_tasks=True
> 2013-04-02 09:38:17,735 - web2py.scheduler.mapserver#4162 - DEBUG - 
> looping...
> 2013-04-02 09:38:17,736 - web2py.scheduler.mapserver#4162 - INFO - pop 
> task True False
> 2013-04-02 09:38:17,916 - web2py.scheduler.mapserver#4162 - INFO - nothing 
> to do
> 2013-04-02 09:38:17,916 - web2py.scheduler.mapserver#4162 - DEBUG - 
> sleeping...
> 2013-04-02 09:38:20,871 - web2py.scheduler.mapserver#4162 - DEBUG - 
> ........recording heartbeat (ACTIVE)
> 2013-04-02 09:38:20,872 - web2py.scheduler.mapserver#4162 - DEBUG - 
> send_heartbeat(), do_assign_tasks=False
> 2013-04-02 09:38:20,919 - web2py.scheduler.mapserver#4162 - DEBUG - 
> looping...
> 2013-04-02 09:38:20,920 - web2py.scheduler.mapserver#4162 - INFO - pop 
> task True False
> 2013-04-02 09:38:21,050 - web2py.scheduler.mapserver#4162 - INFO - nothing 
> to do
> 2013-04-02 09:38:21,050 - web2py.scheduler.mapserver#4162 - DEBUG - 
> sleeping...
> 2013-04-02 09:38:24,045 - web2py.scheduler.mapserver#4162 - DEBUG - 
> ........recording heartbeat (ACTIVE)
> 2013-04-02 09:38:24,046 - web2py.scheduler.mapserver#4162 - DEBUG - 
> send_heartbeat(), do_assign_tasks=False
> 2013-04-02 09:38:24,054 - web2py.scheduler.mapserver#4162 - DEBUG - 
> looping...
> 2013-04-02 09:38:24,054 - web2py.scheduler.mapserver#4162 - INFO - pop 
> task True False
> 2013-04-02 09:38:24,234 - web2py.scheduler.mapserver#4162 - INFO - nothing 
> to do
> 2013-04-02 09:38:24,234 - web2py.scheduler.mapserver#4162 - DEBUG - 
> sleeping...
> 2013-04-02 09:38:27,193 - web2py.scheduler.mapserver#4162 - DEBUG - 
> ........recording heartbeat (ACTIVE)
> 2013-04-02 09:38:27,193 - web2py.scheduler.mapserver#4162 - DEBUG - 
> send_heartbeat(), do_assign_tasks=False
> 2013-04-02 09:38:27,238 - web2py.scheduler.mapserver#4162 - DEBUG - 
> looping...
> 2013-04-02 09:38:27,238 - web2py.scheduler.mapserver#4162 - INFO - pop 
> task True False
> 2013-04-02 09:38:27,368 - web2py.scheduler.mapserver#4162 - INFO - nothing 
> to do
> 2013-04-02 09:38:27,368 - web2py.scheduler.mapserver#4162 - DEBUG - 
> sleeping...
> 2013-04-02 09:38:30,360 - web2py.scheduler.mapserver#4162 - DEBUG - 
> ........recording heartbeat (ACTIVE)
> 2013-04-02 09:38:30,361 - web2py.scheduler.mapserver#4162 - DEBUG - 
> send_heartbeat(), do_assign_tasks=False
> 2013-04-02 09:38:30,361 - web2py.scheduler.mapserver#4162 - DEBUG -     
> freeing workers that have not sent heartbeat
> 2013-04-02 09:38:30,363 - web2py.scheduler.mapserver#4162 - INFO - TICKER: 
> I'm a ticker
>
>  
>
>  Paolo
>
>
> 2013/3/27 Niphlod <[email protected] <javascript:>>
>
>> it was just a trial.
>> Explaining it further, let's see if someone spots the **supposed** 
>> implementation error....
>>
>> In order to separate transactions and avoid "task contention" among 
>> several workers, we need the **master** steps to both assign tasks and 
>> process tasks.
>>
>> The **thread** steps inserts a virtual "assign the task" job setting the 
>> do_assign_task flag to True when necessary.
>> When that is found to be true, **worker** assigns tasks and sleeps for 3 
>> seconds, giving the change to the send_heartbeat() to reset the 
>> do_assign_task to False, so you don't have consecutive "assign_tasks" over 
>> and over.
>>
>> Skipping over the actual steps taken, a **master** does a loop and 
>> sleeps. 
>>
>> In that loop, if do_assign_task is True, it assign tasks, returns "None" 
>> --> goes to sleep for 3 seconds
>>
>> A **thread** does some cleanup, sleeps for 3 seconds and sets the 
>> do_assign_task every 5 cycles.
>>
>> Ok, to be fair it's not guaranteed that a loop in either of those 
>> completes in 3 seconds, but the **steps** for both (when the **worker** 
>> doesn't anything) take a few ms (i.e. scheduler doesn't take into account 
>> how many ms passed between the start of either loop before setting the 
>> sleep of 3 seconds...)
>>
>> So, self.sleep() in normal condition gets called:
>> - at every loop of the **thread** (at the end of the send_heartbeat())
>> - at every loop of the **master** when it has no tasks or when it assign 
>> tasks (at the end of the loop() function)  
>>
>> What you are experiencing is that, even if the **thread** sets correctly 
>> do_assign_tasks = True, when the **worker** tries to pop something for some 
>> reason do_assign_task is False.
>> I can imagine that such a thing happens because do_assign_task is reset 
>> to False, but that reset happens only after (at least) 3 seconds, at the 
>> next send_heartbeat() call.
>> What I can't reproduce is this behaviour exactly.... how is it possible 
>> that in your logs the "I'm a ticker" message comes 40 ms before pop_task, 
>> and do_assign_task is yet False ?  
>> Can you add a logging line just between these two lines
>>             self.do_assign_tasks = False
>>             if counter % 5 == 0 or mybackedstatus == PICK:
>> and between
>>
>>                     if self.worker_status[0] == ACTIVE:
>>                         self.do_assign_tasks = True
>>
>> so we can monitor exactly when the flag is switched ?
>>
>>  -- 
>>  
>> --- 
>> You received this message because you are subscribed to a topic in the 
>> Google Groups "web2py-users" group.
>> To unsubscribe from this topic, visit 
>> https://groups.google.com/d/topic/web2py/u_PgzKLuQmw/unsubscribe?hl=en.
>> To unsubscribe from this group and all its topics, send an email to 
>> [email protected] <javascript:>.
>> For more options, visit https://groups.google.com/groups/opt_out.
>>  
>>  
>>
>
>

-- 

--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to