Hi Sage, My bad, indeed. I'll resubmit a patch.
Cheers
On 02/17/2013 03:11 AM, Sage Weil wrote:
> On Sun, 17 Feb 2013, Loic Dachary wrote:
>> When running
>>
>> bufferptr a("A", 1);
>> bufferptr ab("AB", 2);
>> a.cmp(ab);
>>
>> it returned zero because cmp only compared up to the length of the
>> smallest buffer. The tests comparing the length of the buffers are
>> moved before the memcmp comparing the actual content of the buffers.
>>
>> http://tracker.ceph.com/issues/4170 refs #4170
>>
>> Signed-off-by: Loic Dachary <[email protected]>
>
> The problem here is that for B cmp AB, we should be 1, because 'B' > 'A'.
> The length only matters if we reach the end and everything so far is
> equal.
>
>> ---
>> src/common/buffer.cc | 8 +-------
>> src/test/bufferlist.cc | 14 ++++++++++++++
>> 2 files changed, 15 insertions(+), 7 deletions(-)
>>
>> diff --git a/src/common/buffer.cc b/src/common/buffer.cc
>> index e10d6c9..5a88849 100644
>> --- a/src/common/buffer.cc
>> +++ b/src/common/buffer.cc
>> @@ -368,17 +368,11 @@ bool buffer_track_alloc =
>> get_env_bool("CEPH_BUFFER_TRACK");
>>
>> int buffer::ptr::cmp(const ptr& o)
>> {
>> - int l = _len < o._len ? _len : o._len;
>> - if (l) {
>> - int r = memcmp(c_str(), o.c_str(), l);
>> - if (!r)
>> - return r;
>
> I think this is the bug.. it should be if (r) return r, and fall through
> below only if r == 0 because the buffers are equal.
>
> sage
>
>> - }
>> if (_len < o._len)
>> return -1;
>> if (_len > o._len)
>> return 1;
>> - return 0;
>> + return memcmp(c_str(), o.c_str(), _len);
>> }
>>
>> bool buffer::ptr::is_zero() const
>> diff --git a/src/test/bufferlist.cc b/src/test/bufferlist.cc
>> index 71c2e79..aac41c6 100644
>> --- a/src/test/bufferlist.cc
>> +++ b/src/test/bufferlist.cc
>> @@ -9,6 +9,20 @@
>>
>> #define MAX_TEST 1000000
>>
>> +TEST(BufferPtr, cmp) {
>> + bufferptr empty;
>> + bufferptr a("A", 1);
>> + bufferptr ab("AB", 2);
>> + bufferptr af("AF", 2);
>> + EXPECT_GE(-1, empty.cmp(a));
>> + EXPECT_LE(1, a.cmp(empty));
>> + EXPECT_GE(-1, a.cmp(ab));
>> + EXPECT_LE(1, ab.cmp(a));
>> + EXPECT_EQ(0, ab.cmp(ab));
>> + EXPECT_GE(-1, ab.cmp(af));
>> + EXPECT_LE(1, af.cmp(ab));
>> +}
>> +
>> TEST(BufferList, zero) {
>> //
>> // void zero()
>> --
>> 1.7.10.4
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
>> the body of a message to [email protected]
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>>
>>
--
Loïc Dachary, Artisan Logiciel Libre
signature.asc
Description: OpenPGP digital signature
