[Click] finding pullers downstream

Ian Rose ianrose at eecs.harvard.edu
Thu Aug 27 09:29:39 EDT 2009



Cliff Frey wrote:
> Well, sounds like you have a pretty good handle on the options.  I'll 
> throw out two ideas though.
> 
> Look at the ScheduleInfo element, perhaps you could use it with Unqueue 
> elements to achieve what you want.  Alternately you could just adjust 
> the BURST parameters on different Unqueue elements.

I did try messing about with ScheduleInfo elements but they seem to just 
be for static initialization and don't really offer any help for 
changing scheduling parameters at runtime.

> 
> If what you really want is precise stride behavior, then perhaps 
> writting a StrideUnqueue element that has N inputs and N outputs would 
> work... this is basically combining all of your paint stuff into one 
> element.

I like this idea (StrideUnqueue) - seems obvious in hindsight (isn't 
that always the case).  I'll give it a try.

Thanks!


> 
> In any case, good luck!
> 
> Cliff
> 
> On Wed, Aug 26, 2009 at 12:08 PM, Ian Rose <ianrose at eecs.harvard.edu 
> <mailto:ianrose at eecs.harvard.edu>> wrote:
> 
>     Thanks for the response - see comments inline:
> 
> 
>     Cliff Frey wrote:
> 
>         I would look at click/lib/notifier.cc:downstream_full_signal for
>         an example of using Router::downstream_elements(...), which
>         could likely do what you want..
> 
> 
>     I think I understand how to use the Router::downstream_elements()
>     method; the problem is that I don't know how to specify the filter
>     itself that I need to pass to it...
> 
> 
>         However given your actual end goal, I think that you might want
>         to do this a different way.... I would wonder if StrideSwitch
>         <http://read.cs.ucla.edu/click/elements/strideswitch> or
>         StrideSched <http://read.cs.ucla.edu/click/elements/stridesched>
>         could get the job done for you instead.
> 
> 
>     I thought about using those, but the problem with each is that they
>     effectively mux onto (or demux out of) a single path; StrideSwitch
>     accepts pushes from a single input and StrideSched accepts pulls
>     from a single output.  The scenario that I am envisioning may have
>     entirely unrelated paths.  Here is an example:
> 
>     FromDevice(foo) -> t::Tee -> a::Queue -> Print("path 1") -> b::Discard;
>     t[1] -> c::Queue -> Print("path 2") -> d::Discard;
> 
>     And now I want to be able to control the relative execution rates of
>     each of these 2 paths.  What seems most natural to me is to write to
>     b.tickets and d.tickets, but to generalize this approach I'd like to
>     be able to "find" b::Discard and d::Discard at runtime rather than
>     having to pass in the element names as parameters or something
>     kludgey like that.
> 
>     I don't see a good way to wedge a StrideSched or StrideSwitch into
>     this configuration to accomplish what I want.  The only way that I
>     can see is to mark the packets so that they remember what path they
>     came from, schedule them onto a single path, and then demux them
>     based on the path annotation.  Here's a full example that shows what
>     I mean:
> 
>     InfiniteSource(DATA \<00>) -> t::Tee();
>     t[0] -> a::Queue() -> Paint(0) -> sched::StrideSched(100, 10);
>     t[1] -> c::Queue() -> Paint(1) -> [1]sched;
>     sched -> Unqueue -> ps::PaintSwitch() -> cnt1::Counter() -> b::Discard;
>     ps[1] -> cnt2::Counter() -> d::Discard;
> 
>     Script(wait 3,
>           write sched.tickets0 10,
>           print "set sched.tickets0 to 10",
>           print "");
> 
>     Script(wait 6,
>           write sched.tickets1 100,
>           print "set sched.tickets1 to 100",
>           print "");
> 
>     Script(wait 0.5,
>           printn "cnt1.count = ",
>           print cnt1.count,
>           write cnt1.reset,
>           printn "cnt2.count = ",
>           print cnt2.count,
>           write cnt2.reset,
>           print "",
>           loop);
> 
>     This works, but it seems a bit ugly to me what with the extra
>     Unqueue and Paint-related elements that are required.  But hey,
>     maybe that's the best option...
> 
>     - Ian
> 
> 
> 
>         Cliff
> 
> 
>         On Wed, Aug 26, 2009 at 9:58 AM, Ian Rose
>         <ianrose at eecs.harvard.edu <mailto:ianrose at eecs.harvard.edu>
>         <mailto:ianrose at eecs.harvard.edu
>         <mailto:ianrose at eecs.harvard.edu>>> wrote:
> 
>            Hello -
> 
>            Suppose I have a configuration something like this:
> 
>            FromDevice(foo) -> a::Queue -> Print -> b::Discard;
> 
>            Now, suppose that I want to write an element that, given a
>         starting
>            point (which would be 'a::Queue' in this case) can search
>         downstream and
>            find the original puller (which would be 'b::Discard' in this
>         case).  Is
>            this possible?  I don't think its as simple as just searching
>         for the
>            first downstream 'pull' element as that would return the
>         Print element
>            which is not what I want.
> 
>            I'm trying to do this so that, during execution, I can write
>         new values
>            to b.tickets and thereby change the scheduling priorities of
>         different
>            paths (useless in this configuration since there is only 1
>         path, but you
>            get the idea).
> 
>            Thanks!
>            - Ian
>            _______________________________________________
>            click mailing list
>            click at amsterdam.lcs.mit.edu
>         <mailto:click at amsterdam.lcs.mit.edu>
>         <mailto:click at amsterdam.lcs.mit.edu
>         <mailto:click at amsterdam.lcs.mit.edu>>
> 
>            https://amsterdam.lcs.mit.edu/mailman/listinfo/click
> 
> 
> 


More information about the click mailing list