On Sat, Mar 22, 2025 at 10:40 PM Dumitru Ceara <dce...@redhat.com> wrote:
> On 3/21/25 6:14 PM, Ilya Maximets wrote: > > On 3/21/25 17:32, Dumitru Ceara via dev wrote: > >> On 3/21/25 7:31 AM, Ales Musil wrote: > >>> @@ -108,40 +98,52 @@ bool > >>> ofctrl_acked_seqnos_contains(const struct ofctrl_acked_seqnos *seqnos, > >>> uint64_t val) > >>> { > >>> - struct ofctrl_ack_seqno *sn; > >>> + if (vector_is_empty(&seqnos->acked)) { > >>> + return false; > >>> + } > >>> + > >>> + size_t low = 0; > >>> + size_t high = vector_len(&seqnos->acked) -1; > >>> + uint64_t *acked = vector_get_array(&seqnos->acked); > >>> > >>> - HMAP_FOR_EACH_WITH_HASH (sn, node, hash_uint64(val), > &seqnos->acked) { > >>> - if (sn->seqno == val) { > >>> + while (low <= high) { > >>> + size_t mid = low + (high - low) / 2; > >>> + > >>> + if (acked[mid] == val) { > >>> return true; > >>> } > >>> + > >>> + if (acked[mid] >= acked[low]) { > >>> + if (val >= acked[low] && val < acked[mid]) { > >>> + high = mid - 1; > >>> + } else { > >>> + low = mid + 1; > >>> + } > >>> + } else { > >>> + if (val > acked[mid] && val <= acked[high]) { > >>> + low = mid + 1; > >>> + } else { > >>> + high = mid - 1; > >>> + } > >>> + } > >>> } > >>> - return false; > >>> -} > >> > Hi Dumitru and Ilya, thank you for the review. > >> I think this definitely deserves a comment. :) > >> > >> This works because sequence numbers are acked in increasing order > >> (except for the case when sequence numbers overflow). > > > > The data structure is also used for nb_cfg numbers. I'm not sure we can > > guarantee that they can never jump back or overflow. Database can be > reset > > for example. And while this is far reached and the function is not used > > for this use case, I'm not convinced it's a good idea to assume any kind > > of order in this generic function. > > > > Good point, I missed the nb_cfg case exactly because we don't call this > function there. If we decide to use this binary search variation, it > should only be for data structures that are collections whose order is > guaranteed. > > Which means that maybe we shouldn't change ofctrl_acked_seqnos after > all; the current hash based implementation is probably good enough. > The find is not used at all in the nb_cfg, it looks only at the last acked seqno. So this function should be fine as is. There are other assumptions even in the current code about the order. > >> So the sequence > >> number collection is always a "sorted and shifted" ordered collection > >> which allows us to implement the binary search above if we store them as > >> a vector. > > > > FWIW, I'm also not sure this binary search implementation is correct. > > I didn't look very close, but on a first read it seems that it can't > > find the second element of an ascending 2-element vector. And if that's > > true, it will fail to find elements in any array half the time. > > I might be missing something but it seems to me that the code above > works fine when searching for the second element of an ascending > 2-element vector. I didn't look closely yet though. > > > I'd suggest to add vector_find function instead and use the standard > > bsearch() inside. And and some unit tests. > > +1 for bsearch() if we decide we need a vector_find(). Also +1 for unit > tests. > The vector_find is fine, however it can be a footgun because the user will have to ensure it is ordered. Also why do we need unit test for functions provided by libc? vector_find() would be just a wrapper so it doesn't make sense to test libc in our code in my opinion. Also bsearch() doesn't work on rotated/shifted arrays AFAIK, which is the case here. > > > > But again, I'm not convinced we can assume the values to be sorted here. > > > > Best regards, Ilya Maximets. > > > > Regards, > Dumitru > > Thanks, Ales _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev