Re: schedule tasks [ns-3 + click]
Eddie Kohler <[email protected]>
| Newsgroups | gmane.network.routing.click |
|---|---|
| Organization | Harvard University |
| Message-ID | <[email protected]> |
Oh! I didn't realize that the NS time started at 0. I checked in a wee fix. Best, Eddie On 12/22/11 4:13 PM, Sascha Alexander Jopen wrote: > 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<[email protected]>: >>>>>>> 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 >>>>>>>>> <[email protected]> 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<[email protected]> 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 >>>>>>>>>>>>>>>>> [email protected] >>>>>>>>>>>>>>>>> https://amsterdam.lcs.mit.edu/mailman/listinfo/click >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>> _______________________________________________ click >>>>>>>>>>>>>>>> mailing list [email protected] >>>>>>>>>>>>>>>> https://amsterdam.lcs.mit.edu/mailman/listinfo/click >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>> _______________________________________________ click >>>>>>>>>>>>>>> mailing list [email protected] >>>>>>>>>>>>>>> https://amsterdam.lcs.mit.edu/mailman/listinfo/click >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>> _______________________________________________ click mailing >>>>>>>>>>>>> list [email protected] >>>>>>>>>>>>> https://amsterdam.lcs.mit.edu/mailman/listinfo/click >>>>>>>>>>>> _______________________________________________ click >>>>>>>>>>>> mailing list [email protected] >>>>>>>>>>>> https://amsterdam.lcs.mit.edu/mailman/listinfo/click >>>>>>>>>>> _______________________________________________ click >>>>>>>>>>> mailing list [email protected] >>>>>>>>>>> https://amsterdam.lcs.mit.edu/mailman/listinfo/click >>>>>>>>>> _______________________________________________ click >>>>>>>>>> mailing list [email protected] >>>>>>>>>> https://amsterdam.lcs.mit.edu/mailman/listinfo/click >>>>>>>> _______________________________________________ click mailing >>>>>>>> list [email protected] >>>>>>>> https://amsterdam.lcs.mit.edu/mailman/listinfo/click >>>>>>> >>>>>>> >>>>>>> _______________________________________________ click mailing >>>>>>> list [email protected] >>>>>>> https://amsterdam.lcs.mit.edu/mailman/listinfo/click >>>>> >>> > _______________________________________________ click mailing list [email protected] https://amsterdam.lcs.mit.edu/mailman/listinfo/click