Clint Webb wrote:
Why would you *want* a wraparound when incrementing?
Quite the opposite for me, I do not want it to wrap around, because then I would require additional code to check that. Right now, very simply... if my increment fails, I reset all the data that is associated with that key, and start again.

Wraparound might actually be a better solution for you, because it solves the concurrency problems. Currently, several clients that simultaneously attempt to increment past the size limit will all receive errors, and they will all attempt to run your reset logic. I don't know about your specific use-case, but for us this means that increments get lost in the meantime (multiple clients reset the counter to 1).

With wraparound, only one client will receive a "0" return value, and so only one client will run the additional reset logic.

It's true that clients which rely on the increment errors will need tweaking, but overall wraparound makes Memcached more useful and robust as a generic counter service.

It would be even more useful if calling "incr" on a non-existent key set the value to "1" in order to avoid race conditions similar to what I describe above, but that's a different can of worms...

Evan


Although, it is possible that treat a '0' returned as a wrap failure in your scenario, it is easier for me to treat the wrap error the same as if the key had expired, or the service had been restarted, causing me to replenish the data that appears to be missing.

On 8/17/07, *Evan Miller* <[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>> wrote:

    Currently Memcached gives an error when incrementing large counters:

    set foobar 0 0 10
    2147483647
    STORED
    incr foobar 1
    2147483648
    incr foobar 1
    CLIENT_ERROR cannot increment or decrement non-numeric value

    I believe this is a bug. Attached is a patch to make counters wrap
    around the 2**32 mark, similar to counters in routers. New behavior:

    set foobar 0 0 10
    4294967294
    STORED
    incr foobar 1
    4294967295
    incr foobar 1
    0

    A CLIENT_ERROR will continue to be returned if a value above 2**32 is
    incremented, but the "incr" command will never push the value over that
    mark.

    A future version of Memcached should probably use a 64-bit counter
    instead, but the 32-bit limit is in line with the existing docs. ("The
    data for the item is treated as decimal representation of a 32-bit
    unsigned integer.")

    The patch also adds "const" keywords to arguments of do_add_delta and
    mt_add_delta, to be consistent with the header file.

    Documentation and tests have been updated.

    Evan Miller
    IMVU, Inc.




--
"Be excellent to each other"

Reply via email to