[Click] schedule tasks [ns-3 + click]

Sascha Alexander Jopen jopen at informatik.uni-bonn.de
Thu Dec 22 16:13:32 EST 2011


Whops, sorry. This was obviously wrong. The actual problem was not that
_active_iter was not incremented, but that the variable is not
initialized. On simulation time 0.0, the memcmp evaluates to true, but
_active_iter contains a random number, which maybe large and negative.
After it has reached the maximum, everythings works as expected.

Sascha

Am 22.12.2011 21:37, schrieb Eddie Kohler:
> Hey Sascha, your patch double-increments _active_iter, I am incrementing
> it in the if statement, which might be a bad habit, but works. Right? :)
> 
> E
> 
> 
> On 12/22/11 2:54 PM, Sascha Alexander Jopen wrote:
>> Hey,
>>
>> with the attached patch everything is fine. You missed to count the
>> iterations spend :-)
>> I think a maximum of 1000 iterations is enough, but i have to check this
>> with reasonable simulations. However, it would be nice if this parameter
>> would be configurable somehow.
>>
>> Sascha
>>
>>
>> On 12/22/11 17:11, Eddie Kohler wrote:
>>> Hi Sascha,
>>>
>>> Fair enough -- that's exactly the problem I was worried about.
>>> Please take a look at commit 2754456. Does it help? Do you advise a
>>> different constant?
>>>
>>> Eddie
>>>
>>> On 12/22/11 6:15 AM, Sascha Alexander Jopen wrote:
>>>> Hi,
>>>>
>>>> Altough i'm not really happy with those 1us steps, i think they are
>>>> still necessary. timeval_ceil() does help, when a task is scheduled
>>>> with some nanoseconds. If it is not, timeval_ceil() does nothing. Some
>>>> elements like InfiniteSource will reschedule a new task all the time.
>>>> Because all work done within the elements don't consume any simulation
>>>> time, this will lead to a rescheduled task for the exact same
>>>> timestamp, everytime, effectivly ending in an endless loop. Every
>>>> "polling" like Element will suffer from this problem.
>>>> If there is nothing else, which adds up some simulation time between
>>>> task executions within the click driver, then we need it there, just
>>>> before ns scheduling, don't we?
>>>>
>>>> A simple test script with only an InfiniteSource shows this behaviour:
>>>>
>>>> InfiniteSource
>>>>           ->   IPEncap(SRC eth0:ip, DST eth0:bcast,  TTL 255, PROTO
>>>> 253)
>>>>           ->   Queue
>>>>           ->   IPPrint(Sending)
>>>>           ->   ToSimDevice(eth0);
>>>>
>>>> Sascha
>>>>
>>>> On 12/21/11 14:55, Eddie Kohler wrote:
>>>>> Hi Sascha, Björn,
>>>>>
>>>>> Removing the 1us steps WAS intentional. I thought maybe
>>>>> timeval_ceil() would be enough here. Sascha, I looked at the commit
>>>>> history to try to figure out why the 1us steps were necessary, but
>>>>> the commit message wasn't enough. Do you think the 1us is
>>>>> necessary? If so, why? Is there a risk that an always-active Click
>>>>> config will cause ns time to stop?
>>>>>
>>>>> Eddie
>>>>>
>>>>>
>>>>> 2011/12/21 Björn Lichtblau<lichtbla at informatik.hu-berlin.de>:
>>>>>> Hi,
>>>>>>
>>>>>> my tests went well so far, and i also noticed from the tests that
>>>>>> the artificial 1us steps i did not like were gone. If that's
>>>>>> intended: double thumbs up!
>>>>>>
>>>>>> Regards, Björn
>>>>>>
>>>>>> On 21.12.2011 11:50, Sascha Alexander Jopen wrote:
>>>>>>> Hey Eddie,
>>>>>>>
>>>>>>> i didnt' test you changes yet, but after looking into the code
>>>>>>> i think you accidently removed the newly introduced artificial
>>>>>>> time increase in lib/routerthread.cc line 683. I think this
>>>>>>> should read
>>>>>>>
>>>>>>> struct timeval nexttime = (Timestamp::now() +
>>>>>>> Timestamp::make_usec(1)).timeval_ceil();
>>>>>>>
>>>>>>> Regards, Sascha
>>>>>>>
>>>>>>> Am 20.12.2011 17:31, schrieb Eddie Kohler:
>>>>>>>> Hi Sascha,
>>>>>>>>
>>>>>>>> I applied a different version of your patch, using a new
>>>>>>>> function (Timestamp::timeval_ceil()) written for the purpose.
>>>>>>>> This also slightly changed the active() case in ns3
>>>>>>>> scheduling. Take a look; does it work for you?
>>>>>>>>
>>>>>>>> Best, Eddie
>>>>>>>>
>>>>>>>>
>>>>>>>> On Fri, Dec 16, 2011 at 5:40 PM, Sascha Alexander Jopen
>>>>>>>> <jopen at informatik.uni-bonn.de>    wrote:
>>>>>>>>> Hey Eddie,
>>>>>>>>>
>>>>>>>>> i think my patch is still necessary. The one integrated
>>>>>>>>> into ns3 is about rounding errors between double and
>>>>>>>>> integer time representations, which led to similar endless
>>>>>>>>> loops but on ns3 side.
>>>>>>>>>
>>>>>>>>> Regards, Sascha
>>>>>>>>>
>>>>>>>>> Am 16.12.2011 15:20, schrieb Eddie Kohler:
>>>>>>>>>> Hi Björn, Sascha,
>>>>>>>>>>
>>>>>>>>>> So, I'm a bit behind. Should I apply Sascha's patch, or
>>>>>>>>>> some other version?
>>>>>>>>>>
>>>>>>>>>> Best, Eddie
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On 12/04/2011 10:25 AM, Björn Lichtblau wrote:
>>>>>>>>>>> Hi, this flaw was already fixed on ns3 side (in
>>>>>>>>>>> ns3-dev):
>>>>>>>>>>> http://code.nsnam.org/ns-3-dev/rev/0d04b625ea54
>>>>>>>>>>>
>>>>>>>>>>> Regarding Eddies change, it works but i had no time yet
>>>>>>>>>>> to test it extensively. While it works i think it's a
>>>>>>>>>>> little work around to let the simulator do artificial 1
>>>>>>>>>>> us steps... however it should not hurt in most cases
>>>>>>>>>>> and doing it cleaner my be hard.. i'll comment more
>>>>>>>>>>> detailed soon.
>>>>>>>>>>>
>>>>>>>>>>> Regards, Björn
>>>>>>>>>>>
>>>>>>>>>>> On 03.12.2011 23:42, Sascha Alexander Jopen wrote:
>>>>>>>>>>>> Hey,
>>>>>>>>>>>>
>>>>>>>>>>>> after running some real simulations i found that
>>>>>>>>>>>> scheduling timers may lead to infinite loops with
>>>>>>>>>>>> nsclicks scheduling. On 64bit systems the nanosecond
>>>>>>>>>>>> precision of a timestamp is mapped to a truncated
>>>>>>>>>>>> microsecond precision timeval. The next ns event is
>>>>>>>>>>>> scheduled at this microsecond timeval, but clicks
>>>>>>>>>>>> run_timers() method doesn't run the timer, because
>>>>>>>>>>>> its expiry is not reached. nsclick is then again
>>>>>>>>>>>> scheduled for this timer, again some nanoseconds to
>>>>>>>>>>>> early.
>>>>>>>>>>>>
>>>>>>>>>>>> The attached patch fixes this problem by scheduling
>>>>>>>>>>>> nsclick to the next microsecond after the timer
>>>>>>>>>>>> expires.
>>>>>>>>>>>>
>>>>>>>>>>>> Regards, Sascha
>>>>>>>>>>>>
>>>>>>>>>>>> On 11/09/11 18:56, Eddie Kohler wrote:
>>>>>>>>>>>>> Sascha, Björn,
>>>>>>>>>>>>>
>>>>>>>>>>>>> Thanks for your patience with this problem.  I took
>>>>>>>>>>>>> a look at the patch, but decided to do it a
>>>>>>>>>>>>> different way that is less intrusive and hopefully
>>>>>>>>>>>>> addresses all the cases.  The checkin is here:
>>>>>>>>>>>>>
>>>>>>>>>>>>> https://github.com/kohler/click/commit/e3c9f295ea1d5c5700e26f19afce873b0ce755f5
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>
>>>>>>>>>>>>>
>>>> Please let me know if this does not work (I have not tested it).
>>>>>>>>>>>>> Best, Eddie
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> On Fri, Nov 4, 2011 at 3:05 PM, Sascha Alexander
>>>>>>>>>>>>> Jopen<jopen at informatik.uni-bonn.de>      wrote:
>>>>>>>>>>>>>> Hi,
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> after rereading the stated problems, i found that
>>>>>>>>>>>>>> my patch did not catch the case when a timer
>>>>>>>>>>>>>> schedules a task. The attached patch should fix
>>>>>>>>>>>>>> this. Both test scenarios from Björn seem to run
>>>>>>>>>>>>>> as expected with this patch.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> However, i'm still not sure, how much time should
>>>>>>>>>>>>>> pass between two driver runs.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Regards, Sascha
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> On 11/04/11 17:28, Sascha Alexander Jopen wrote:
>>>>>>>>>>>>>>> Hey,
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> i use a slightly different fix. After running
>>>>>>>>>>>>>>> the tasks, i check if there is still at least
>>>>>>>>>>>>>>> one task scheduled. If this is the case, i
>>>>>>>>>>>>>>> reschedule the router thread for execution in
>>>>>>>>>>>>>>> ns-3 again with the smallest possible time
>>>>>>>>>>>>>>> offset, which is one microsecond. This way it
>>>>>>>>>>>>>>> doesn't matter if there are other timers to be
>>>>>>>>>>>>>>> executed or not. For elements which do polling
>>>>>>>>>>>>>>> using tasks all the time, this means that
>>>>>>>>>>>>>>> simulation time advances only one microsecond
>>>>>>>>>>>>>>> per iteration which could lead to really long
>>>>>>>>>>>>>>> running simulations. Using such elements is
>>>>>>>>>>>>>>> possible this way, however.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Regards, Sascha
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> On 11/04/11 12:15, Björn Lichtblau wrote:
>>>>>>>>>>>>>>>> Hi,
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> i think you are experiencing what i described
>>>>>>>>>>>>>>>> as problem A in
>>>>>>>>>>>>>>>> http://pdos.csail.mit.edu/pipermail/click/2011-October/010357.html
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>> Tasks getting scheduled by a fired timer are not run immediatly,
>>>> because
>>>>>>>>>>>>>>>> run_timers() is behind run_tasks() and the
>>>>>>>>>>>>>>>> routerthread-driver() loop is only run once
>>>>>>>>>>>>>>>> at each call from the simulation. The fix i
>>>>>>>>>>>>>>>> described there however was not correct,
>>>>>>>>>>>>>>>> currently i'm working with this (but maybe
>>>>>>>>>>>>>>>> incorrect too):
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> diff --git a/lib/routerthread.cc
>>>>>>>>>>>>>>>> b/lib/routerthread.cc index d118a91..7232b79
>>>>>>>>>>>>>>>> 100644 --- a/lib/routerthread.cc +++
>>>>>>>>>>>>>>>> b/lib/routerthread.cc @@ -640,14 +640,7 @@
>>>>>>>>>>>>>>>> RouterThread::driver() _oticks = ticks;
>>>>>>>>>>>>>>>> #endif timer_set().run_timers(this,
>>>>>>>>>>>>>>>> _master); -#if CLICK_NS -           // If
>>>>>>>>>>>>>>>> there's another timer, tell the simulator to
>>>>>>>>>>>>>>>> make us -           // run when it's due to
>>>>>>>>>>>>>>>> go off. -           if (Timestamp next_expiry
>>>>>>>>>>>>>>>> = timer_set().timer_expiry_steady()) { -
>>>>>>>>>>>>>>>> struct timeval nexttime =
>>>>>>>>>>>>>>>> next_expiry.timeval(); -
>>>>>>>>>>>>>>>> simclick_sim_command(_master->simnode(),
>>>>>>>>>>>>>>>> SIMCLICK_SCHEDULE,&nexttime); -           }
>>>>>>>>>>>>>>>> -#endif + } while (0);
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> // run operating system @@ -667,7 +660,20 @@
>>>>>>>>>>>>>>>> RouterThread::driver() #if CLICK_NS ||
>>>>>>>>>>>>>>>> BSD_NETISRSCHED // Everyone except the NS
>>>>>>>>>>>>>>>> driver stays in driver() until the driver is
>>>>>>>>>>>>>>>> // stopped. -       break; + if(task_begin()
>>>>>>>>>>>>>>>> == task_end()){ +#if CLICK_NS + // If there's
>>>>>>>>>>>>>>>> another timer, tell the simulator to make us
>>>>>>>>>>>>>>>> +           // run when it's due to go off.
>>>>>>>>>>>>>>>> + if (Timestamp next_expiry =
>>>>>>>>>>>>>>>> timer_set().timer_expiry_steady()) { + struct
>>>>>>>>>>>>>>>> timeval nexttime = next_expiry.timeval(); +
>>>>>>>>>>>>>>>> simclick_sim_command(_master->simnode(),
>>>>>>>>>>>>>>>> SIMCLICK_SCHEDULE,&nexttime); +           }
>>>>>>>>>>>>>>>> +#endif + break; + +       } #endif }
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> So the driver loop only exits on task_begin()
>>>>>>>>>>>>>>>> == task_end() (means it will loop again if a
>>>>>>>>>>>>>>>> timer scheduled a task), and we only tell the
>>>>>>>>>>>>>>>> simulator to schedule a timer when the loop
>>>>>>>>>>>>>>>> is exiting. While this is fine for me a
>>>>>>>>>>>>>>>> colleague working with ns2 still has problems
>>>>>>>>>>>>>>>> with ToSimDevice in some cases which is too
>>>>>>>>>>>>>>>> much to describe now.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Another potential problem i stumbled over in
>>>>>>>>>>>>>>>> the documentation
>>>>>>>>>>>>>>>> (http://www.read.cs.ucla.edu/click/doxygen/classTimer.html)
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>> is busy waiting: "Particularly at user level, there can
>>>>>>>>>>>>>>>> be a significant delay between a Timer's
>>>>>>>>>>>>>>>> nominal expiration time and the actual time
>>>>>>>>>>>>>>>> it runs. Elements that desire extremely
>>>>>>>>>>>>>>>> precise timings should combine a Timer with a
>>>>>>>>>>>>>>>> Task. The Timer is set to go off a bit before
>>>>>>>>>>>>>>>> the true expiration time (see
>>>>>>>>>>>>>>>> Timer::adjustment()), after which the Task
>>>>>>>>>>>>>>>> polls the CPU until the actual expiration
>>>>>>>>>>>>>>>> time arrives."
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Elements doing busy waiting are a big
>>>>>>>>>>>>>>>> headache in the sim environment, and no nice
>>>>>>>>>>>>>>>> idea yet to fix such cases, because time will
>>>>>>>>>>>>>>>> never advance without setting a timer...
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Regards, Björn
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> On 11/04/2011 11:29 AM, Giovanni Di Stasi
>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>> Hi everyone,
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> I have developed an element which behaves
>>>>>>>>>>>>>>>>> like a Queue. It has a pull output which is
>>>>>>>>>>>>>>>>> connected to a ToSimDevice.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Sometimes, when the pull gets called on the
>>>>>>>>>>>>>>>>> element, it returns a NULL and sets a timer
>>>>>>>>>>>>>>>>> which expires after a few milliseconds
>>>>>>>>>>>>>>>>> (e.g. 3). When the timer expires, an
>>>>>>>>>>>>>>>>> empty_notifier is "activated"
>>>>>>>>>>>>>>>>> (empty_not.wake()). I would expect, at this
>>>>>>>>>>>>>>>>> point, the ToSimDevice task to be run, and
>>>>>>>>>>>>>>>>> the pull to be called on my element.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Unfortunately this does not happen. The
>>>>>>>>>>>>>>>>> Task schedule function  seems to be called
>>>>>>>>>>>>>>>>> after the notifier is waken up, but the
>>>>>>>>>>>>>>>>> task is not run. Is this normal? The task
>>>>>>>>>>>>>>>>> is sometimes run a few seconds later. So I
>>>>>>>>>>>>>>>>> have two doubts: is it possible to schedule
>>>>>>>>>>>>>>>>> a task to be run right away (maybe be
>>>>>>>>>>>>>>>>> putting it at the top of the Click pending
>>>>>>>>>>>>>>>>> tasks)? If not, which delay should I expect
>>>>>>>>>>>>>>>>> from the moment I schedule the Task and
>>>>>>>>>>>>>>>>> the moment it gets executed?
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Thanks, Giovanni
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> _______________________________________________
>>>>>>>>>>>>>>>> click mailing list
>>>>>>>>>>>>>>>> click at amsterdam.lcs.mit.edu
>>>>>>>>>>>>>>>> https://amsterdam.lcs.mit.edu/mailman/listinfo/click
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>> _______________________________________________ click
>>>>>>>>>>>>>>> mailing list click at amsterdam.lcs.mit.edu
>>>>>>>>>>>>>>> https://amsterdam.lcs.mit.edu/mailman/listinfo/click
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>> _______________________________________________ click
>>>>>>>>>>>>>> mailing list click at amsterdam.lcs.mit.edu
>>>>>>>>>>>>>> https://amsterdam.lcs.mit.edu/mailman/listinfo/click
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>> _______________________________________________ click mailing
>>>>>>>>>>>> list click at amsterdam.lcs.mit.edu
>>>>>>>>>>>> https://amsterdam.lcs.mit.edu/mailman/listinfo/click
>>>>>>>>>>> _______________________________________________ click
>>>>>>>>>>> mailing list click at amsterdam.lcs.mit.edu
>>>>>>>>>>> https://amsterdam.lcs.mit.edu/mailman/listinfo/click
>>>>>>>>>> _______________________________________________ click
>>>>>>>>>> mailing list click at amsterdam.lcs.mit.edu
>>>>>>>>>> https://amsterdam.lcs.mit.edu/mailman/listinfo/click
>>>>>>>>> _______________________________________________ click
>>>>>>>>> mailing list click at amsterdam.lcs.mit.edu
>>>>>>>>> https://amsterdam.lcs.mit.edu/mailman/listinfo/click
>>>>>>> _______________________________________________ click mailing
>>>>>>> list click at amsterdam.lcs.mit.edu
>>>>>>> https://amsterdam.lcs.mit.edu/mailman/listinfo/click
>>>>>>
>>>>>>
>>>>>> _______________________________________________ click mailing
>>>>>> list click at amsterdam.lcs.mit.edu
>>>>>> https://amsterdam.lcs.mit.edu/mailman/listinfo/click
>>>>
>>



More information about the click mailing list