Hi [...]
>> I miss also the relation between oprators and between the content >> of operators. I mean AND or OR. How I understand your example: >> >> + local filter = { >> + lt={{"gpc0", 1}, {"gpc1", 2}}, >> + gt={{"conn_rate", 3}}, >> + eq={{"conn_cur", 4}} >> + } >> >> Are you sure that the syntax <operator>=<list of left, right operands> >> is a good format ? Maybe something like the following, with the operator >> as argument between the two operands. lines are implicitly OR, and columns >> are AND: >> >> + local filter = { >> + {{"gpc0", "lt", 1}, {"gpc1", "lt", 2}}, >> + {{"conn_rate", "gt", 3}}, >> + {{"conn_cur", "eq", 4}} >> + } > Actually, I was playing with some other ideas, and it was useful to be > able to "preselect" filter operators. > However, the CLI doesn't even support more than one, maybe we don't need > to complicate too much. Maybe we can simplify to this: > > local filter = { > {"gpc0", "lt", 1}, > {"gpc1", "lt", 2}, > {"conn_rate", "gt", 3}, > {"conn_cur", "eq", 4} > } > > The default operator would be AND, and we would not support other > operators (to keep the things simple). e.g. example use case for the > filter would be to filter out on gpc0 > X AND gpc1 > Y > > If this sounds good, I can update/simplify the code. Ok, it sounds good. I think this kind of syntax is easily understandable and it allow a good way for filtering values. >> Idea of extension for the future: Maybe it will be safe to compile >> sticktable filter during the initialisation of the Lua code, to avoid >> runtime errors ? > I'm returning runtime errors since it can be easy to mix up data from > the client side (most probably data would come as json table, then > transformed to Lua table) ok [...] >> Line 274 of your patch, I don't see any HA_SPIN_LOCK(STK_TABLE_LOCK >> I don't known very well the thread, so maybe there are useles, maybe no. > hlua_stktable_lookup() uses stktable_lookup_key() which does have locks, > so I guess that it should be fine then? sure ! [...] >> l.365, 369: The user doesn't have context about the error. there are the >> first entry of the table, the second ? Which operator doesn't exists ? >> >> L.380, 384: Which line is wrong ? > Yes, it is somwehat cryptic. I've tried to avoid returning user supplied > data in the error messages. We can revisit this if/when we change the > filter table format. ok >> L.431: Your release the lock, so the next element relative to the current >> "n", can disappear and the ebmb_next() can return wrong memory. > I was under impression that we only have to acquire lock and increment > ref_cnt (so we can be sure our current node n is not deleted) > ebmb_next() is called only when we're holding lock, first and every > other iteration, i.e. > > HA_SPIN_LOCK(STK_TABLE_LOCK, &t->lock); > eb = ebmb_first(&t->keys); > for (n = eb; n; n = ebmb_next(n)) { > ... > ts->ref_cnt++; > HA_SPIN_UNLOCK(STK_TABLE_LOCK, &t->lock); > ... > > HA_SPIN_LOCK(STK_TABLE_LOCK, &t->lock); > } > > Or I didn't get your point? ok, you probably right. Thierry