static memcached_return_t ascii_dump(Memcached *memc, memcached_dump_fn *callback, void *context, uint32_t number_of_callbacks)
{
+ memcached_version(memc);
/* MAX_NUMBER_OF_SLAB_CLASSES is defined to 200 in Memcached 1.4.10 */
for (uint32_t x= 0; x < 200; x++)
{
{
memcached_instance_st* instance= memcached_instance_fetch(memc, server_key);
- memcached_return_t vdo_rc;
- if (memcached_success((vdo_rc= memcached_vdo(instance, vector, 3, true))))
- {
- // We have sent the message to the server successfully
- }
- else
- {
- return vdo_rc;
+ // skip slabs >63 for server versions >= 1.4.23
+ if (x < 64 || memcached_version_instance_cmp(instance, 1, 4, 23) < 0) {
+ memcached_return_t vdo_rc;
+ if (memcached_failed((vdo_rc= memcached_vdo(instance, vector, 3, true))))
+ {
+ return vdo_rc;
+ }
}
}
assert(response_rc == MEMCACHED_SUCCESS); // Just fail
return response_rc;
}
+ else if (response_rc == MEMCACHED_CLIENT_ERROR)
+ {
+ /* The maximum number of slabs has changed in the past (currently 1<<6-1),
+ * so ignore any client errors complaining about an illegal slab id.
+ */
+ if (0 == strncmp(buffer, "CLIENT_ERROR Illegal slab id", sizeof("CLIENT_ERROR Illegal slab id") - 1)) {
+ memcached_error_free(*instance);
+ memcached_error_free(*memc);
+ } else {
+ return response_rc;
+ }
+ }
else
{
// IO error of some sort must have occurred