> On March 28, 2014, 9:36 p.m., Chi Zhang wrote:
> > src/linux/routing.hpp, line 159
> > <https://reviews.apache.org/r/19702/diff/2/?file=537899#file537899line159>
> >
> > We do need this, but only because libnl doesn't have a way to remove
> > one action from the multiple actions on a filter, so we work around the
> > issue to do 'replace with all the other remaining actions'. But really we
> > wouldn't want this if libnl was a little bit better.
> >
> > That's why I wish we don't have to do this for append.
>
> Jie Yu wrote:
> As far as I know, there is no simple way to let you atomically add an
> action to a filter. You'll still have to do "get+update". That's the reason I
> don't want to introduce an interface "append" to make the users feel that the
> "append" is atomic, but in fact it is not.
>
> Chi Zhang wrote:
> Cong should weigh in if I am making a mistake here. I think it's atomic
> inside the kernel: whatever we do to prepare the 'package' in the user space
> won't do any changes to the kernel until we call `rtnl_cls_change`, when the
> package gets delivered down to kernel space to do a swap, so we get whatever
> atomicity the kernel provides, which I'd assume is good enough.
>
> I am a little bit against the new Mirror and ::add combo for two reasons:
>
> - At the end of the day, people are going to map classifier into _cls and
> actions into _act and this Mirror abstraction is quite different from the
> common understanding of an action in this area. I agree we should make users
> of this interface care as little as possible, but it's going to be people who
> know networking who'd look at this code, and straying away from the core
> concept won't really help them understand better; people who don't know would
> learn core concepts first and find it mismatch with our abstraction here.
>
> - We only have one replace/update in ::cleanup, but we have a _lot_ more
> add/append for arp/icmp in the isolator. In ::cleanup where
> replaceFilterAction is used, you can see we need to do loops to prepare the
> 'vector package'. While we have to in this case, we don't for the append
> cases. It feels superfluous to me to do this every time for a reason we don't
> have. (We'd actually have to query kernel to get the information, not because
> we need it, but because the API needs it, every time we do an append.)
>
>
>
> Jie Yu wrote:
> > I think it's atomic inside the kernel: whatever we do to prepare the
> 'package' in
> > the user space won't do any changes to the kernel until we call
> `rtnl_cls_change`,
> > when the package gets delivered down to kernel space to do a swap, so
> we get
> > whatever atomicity the kernel provides, which I'd assume is good enough.
>
> The 'rtnl_cls_change' is atomic as it will just send a RTM_NEWTFILTER
> netlink message with flag NLM_F_REPLACE. But we don't have a way to
> atomically add a single action to a filter.
>
> To do an append, you need to get the current list of actions, prepare the
> new actions in the user space, and push the changed filter using
> rtnl_cls_change mentioned above. You don't have atomicity here since two
> netlink messages are involved.
>
> You can always write a helper function to combine a "get" (atomic) and an
> "update" (atomic) in this API to mimic an "append" (not atomic) if you want.
>
> > In ::cleanup where replaceFilterAction is used, you can see we need to
> do loops to
> > prepare the 'vector package'.
>
> That's exactly why I want to make sure only one action is associated with
> a filter so that you don't need to iterate over all actions in a given filter.
>
>
>
> Chi Zhang wrote:
> yeah I was suspecting we weren't talking about the same atomicity issue.
> I meant to say that traffic wouldn't be interrupted.
>
> You were talking about two users updating at the same time. This issue is
> definitely here, unless we do active control in the interface. Can we ignore
> this issue for now in general until we have that use case?
>
> Maybe could you give an example how to use ::add for the 2 scenarios?
>
> also ::add returns false if the given classifer couldn't be found, then
> how do we add the first classifier with just ::add?
>
> Cong Wang wrote:
> Jie, what's the problem with getting a filter with a list action and
> appending a new action then pushing it into kernel? IOW, who cares about the
> new action until we push it? Since we use actions attached to a filter,
> modifying an action _is_ modifying the filter itself too, in other word,
> essentially we are just replacing a filter here.
Cong, I don't quite follow your comments. I guess there are two problems here:
1) To represent mirror (to a set of links), should we use a single Mirror
action, or we use a set of Mirror actions?
2) Problems with the add/update interfaces.
For 1), I still think enforcing exact 1 action per filter is a nice semantics
to the user, and easier to understand the reason about.
For 2), in my case, adding filter uses flag: NLM_F_CREATE | NLM_F_EXCL, meaning
that if there exist a matching filter, return immediately without touching the
filter. Updating filter uses flag: NLM_F_REPLACE such that if the matching
filter does not exist, return immediately. To add an action, you can do is:
if (/* filter not exist */) {
/* add filter */
} else {
/* get the filter info */
/* update the action in user level */
/* update filter */
}
You can create a helper function that wraps the above logic.
What do you think?
- Jie
-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviews.apache.org/r/19702/#review38947
-----------------------------------------------------------
On March 29, 2014, 5:59 a.m., Jie Yu wrote:
>
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviews.apache.org/r/19702/
> -----------------------------------------------------------
>
> (Updated March 29, 2014, 5:59 a.m.)
>
>
> Review request for mesos, Benjamin Hindman, Chi Zhang, Ian Downes, Vinod
> Kone, and Cong Wang.
>
>
> Repository: mesos-git
>
>
> Description
> -------
>
> UPDATE:
>
> 1) adjusted a few interfaces per review comments.
> 2) added impl. (including tests) for managing links.
>
> I'll be adding impl. for managing filters soon (currently, they return
> Error("Unimplemented").)
>
>
> ------
>
> Hey guys, I send this review in order to get an idea about the interface
> design.
>
> Feel free to jump in to express your thoughts, suggestions, concerns, etc.
>
> Thanks!
>
>
> Diffs
> -----
>
> configure.ac 5404dc2
> src/Makefile.am 47d03b3
> src/linux/routing.hpp PRE-CREATION
> src/linux/routing.cpp PRE-CREATION
> src/tests/routing_tests.cpp PRE-CREATION
>
> Diff: https://reviews.apache.org/r/19702/diff/
>
>
> Testing
> -------
>
> make check
>
> sudo make check
>
>
> Thanks,
>
> Jie Yu
>
>