* Change in value fetch, MEMCACHED_END is now returned when keys are no
longer in the pipe.
* Fixed bug where key could be out of range of characters
+ * Added _by_key() methods to allow partitioning of values to particular
+ servers.
+ * MEMCACHED_DEFAILT_TIMEOUT is now set to 100 microseconds.
0.11 Mon Nov 26 01:05:52 PST 2007
* Added option to memcache_behavior_set() so that poll() can be timed out.
memslap.1\\r
memstat.1\\r
memcached_add.3\\r
+ memcached_add_by_key.3\\r
memcached_append.3\\r
+ memcached_append_by_key.3\\r
memcached_behavior_get.3\\r
memcached_behavior_set.3\\r
memcached_cas.3\\r
+ memcached_cas_by_key.3\\r
memcached_clone.3\\r
memcached_create.3\\r
memcached_decrement.3\\r
memcached_fetch_result.3\\r
memcached_free.3\\r
memcached_get.3\\r
+ memcached_get_by_key.3\\r
memcached_increment.3\\r
memcached_mget.3\\r
+ memcached_mget_by_key.3\\r
memcached_prepend.3\\r
+ memcached_prepend_by_key.3\\r
memcached_replace.3\\r
+ memcached_replace_by_key.3\\r
memcached_server_add.3\\r
memcached_server_count.3\\r
memcached_server_list.3\\r
memcached_server_push.3\\r
memcached_servers_parse.3\\r
memcached_set.3\\r
+ memcached_set_by_key.3\\r
memcached_stat.3\\r
memcached_stat_get_keys.3\\r
memcached_stat_get_value.3\\r
memcached_set.3: memcached_set.pod\r
pod2man -c "libmemcached" -r "" -s 3 memcached_set.pod > memcached_set.3\r
\r
+memcached_set_by_key.3: memcached_set.pod\r
+ pod2man -c "libmemcached" -r "" -s 3 memcached_set.pod > memcached_set_by_key.3\r
+\r
memcached_cas.3: memcached_set.pod\r
pod2man -c "libmemcached" -r "" -s 3 memcached_set.pod > memcached_cas.3\r
\r
+memcached_cas_by_key.3: memcached_set.pod\r
+ pod2man -c "libmemcached" -r "" -s 3 memcached_set.pod > memcached_cas_by_key.3\r
+\r
memcached_replace.3: memcached_set.pod\r
pod2man -c "libmemcached" -r "" -s 3 memcached_set.pod > memcached_replace.3\r
\r
+memcached_replace_by_key.3: memcached_set.pod\r
+ pod2man -c "libmemcached" -r "" -s 3 memcached_set.pod > memcached_replace_by_key.3\r
+\r
memcached_add.3: memcached_set.pod\r
pod2man -c "libmemcached" -r "" -s 3 memcached_set.pod > memcached_add.3\r
\r
+memcached_add_by_key.3: memcached_set.pod\r
+ pod2man -c "libmemcached" -r "" -s 3 memcached_set.pod > memcached_add_by_key.3\r
+\r
memcached_prepend.3: memcached_set.pod\r
pod2man -c "libmemcached" -r "" -s 3 memcached_set.pod > memcached_prepend.3\r
\r
+memcached_prepend_by_key.3: memcached_set.pod\r
+ pod2man -c "libmemcached" -r "" -s 3 memcached_set.pod > memcached_prepend_by_key.3\r
+\r
memcached_append.3: memcached_set.pod\r
pod2man -c "libmemcached" -r "" -s 3 memcached_set.pod > memcached_append.3\r
\r
+memcached_append_by_key.3: memcached_set.pod\r
+ pod2man -c "libmemcached" -r "" -s 3 memcached_set.pod > memcached_append_by_key.3\r
+\r
memcached_delete.3: memcached_delete.pod\r
pod2man -c "libmemcached" -r "" -s 3 memcached_delete.pod > memcached_delete.3\r
\r
memcached_get.3: memcached_get.pod\r
pod2man -c "libmemcached" -r "" -s 3 memcached_get.pod > memcached_get.3\r
\r
+memcached_get_by_key.3: memcached_get.pod\r
+ pod2man -c "libmemcached" -r "" -s 3 memcached_get.pod > memcached_get_by_key.3\r
+\r
memcached_fetch_result.3: memcached_get.pod\r
pod2man -c "libmemcached" -r "" -s 3 memcached_get.pod > memcached_fetch_result.3\r
\r
memcached_mget.3: memcached_get.pod\r
pod2man -c "libmemcached" -r "" -s 3 memcached_get.pod > memcached_mget.3\r
\r
+memcached_mget_by_key.3: memcached_get.pod\r
+ pod2man -c "libmemcached" -r "" -s 3 memcached_get.pod > memcached_mget_by_key.3\r
+\r
memcached_fetch.3: memcached_get.pod\r
pod2man -c "libmemcached" -r "" -s 3 memcached_get.pod > memcached_fetch.3\r
\r
memcached protocol. The code has all been written with an eye to allow
for both web and embedded usage. It handles the work behind routing
particular keys to specific servers that you specify (and values are
-matched based on server order as supplied by you).
+matched based on server order as supplied by you). It implements both
+a modula and consistent method of object distribution.
The aim is to support multiple routing and hashing methods. Currently only
two hashing methods are supported, a quick built-in routine, and MD5. For
Nearly all functions return a C<memcached_return> value.
This value can be translated to a printable string with memcached_strerr(3).
+Partitioning based on keys is supported in the library. Using the key partioning
+functions it is possible to group sets of object onto servers.
+
C<memcached_st> structures are thread-safe, but each thread must
contain its own structure (that is, if you want to share these among
threads you must provide your own locking). No global variables are
=head1 SEE ALSO
-memcached(1) libmemcached_examples(3) libmemcached(1) memcat(1) memcp(1) memflush(1) memrm(1) memslap(1) memstat(1) memcached_fetch(3) memcached_replace(3) memcached_server_list_free(3) libmemcached_examples(3) memcached_clone(3) memcached_free(3) memcached_server_add(3) memcached_server_push(3) memcached_add(3) memcached_get(3) memcached_server_count(3) memcached_servers_parse(3) memcached_create(3) memcached_increment(3) memcached_server_list(3) memcached_set(3) memcached_decrement(3) memcached_mget(3) memcached_server_list_append(3) memcached_strerror(3) memcached_delete(3) memcached_quit(3) memcached_server_list_count(3) memcached_verbosity(3) memcached_server_add_unix_socket(3) memcahed_result_create(3) memcached_result_free(3) memcached_result_key_value(3) memcached_result_key_length(3) memcached_result_value(3) memcached_result_length(3) memcached_result_flags(3) memcached_result_cas(3) memcached_result_st(3) memcached_append(3) memcached_prepend(3) memcached_fetch_result(3) memerror(1)
+memcached(1) libmemcached_examples(3) libmemcached(1) memcat(1) memcp(1) memflush(1) memrm(1) memslap(1) memstat(1) memcached_fetch(3) memcached_replace(3) memcached_server_list_free(3) libmemcached_examples(3) memcached_clone(3) memcached_free(3) memcached_server_add(3) memcached_server_push(3) memcached_add(3) memcached_get(3) memcached_server_count(3) memcached_servers_parse(3) memcached_create(3) memcached_increment(3) memcached_server_list(3) memcached_set(3) memcached_decrement(3) memcached_mget(3) memcached_server_list_append(3) memcached_strerror(3) memcached_delete(3) memcached_quit(3) memcached_server_list_count(3) memcached_verbosity(3) memcached_server_add_unix_socket(3) memcahed_result_create(3) memcached_result_free(3) memcached_result_key_value(3) memcached_result_key_length(3) memcached_result_value(3) memcached_result_length(3) memcached_result_flags(3) memcached_result_cas(3) memcached_result_st(3) memcached_append(3) memcached_prepend(3) memcached_fetch_result(3) memerror(1) memcached_get_by_key() memcached_mget_by_key()
=cut
=item MEMCACHED_BEHAVIOR_DISTRIBUTION
Using this you can enable different means of distributing values to servers.
-The default method is MEMCACHED_DISTRIBUTION_MODULO. You can enable
+The default method is MEMCACHED_DISTRIBUTION_MODULA. You can enable
consistent hashing by setting MEMCACHED_DISTRIBUTION_CONSISTENT.
Consistent hashing delivers better distribution and allows servers to be
added to the cluster with minimal cache losses.
memcached_mget (memcached_st *ptr,
char **keys, size_t *key_length,
unsigned int number_of_keys);
+ char *
+ memcached_get_by_key(memcached_st *ptr,
+ char *master_key, size_t master_key_length,
+ char *key, size_t key_length,
+ size_t *value_length,
+ uint16_t *flags,
+ memcached_return *error);
+
+ memcached_return
+ memcached_mget_by_key(memcached_st *ptr,
+ char *master_key, size_t master_key_length,
+ char **keys, size_t *key_length,
+ unsigned int number_of_keys);
char *memcached_fetch (memcached_st *ptr,
char *key, size_t *key_length,
help. This function will dynamically allocate a result structure for you
if you do not pass one to the function.
+memcached_get_by_key() and memcached_mget_by_key() behave in a similar nature
+as memcached_get() and memcached_mget(). The difference is that they take
+a master key that is used for determining which server an object was stored
+if key partitioning was used for storage.
+
=head1 RETURN
All objects returned must be freed by the calling application.
uint16_t flags,
uint64_t cas);
+ memcached_return
+ memcached_set_by_key(memcached_st *ptr,
+ char *master_key, size_t master_key_length,
+ char *key, size_t key_length,
+ char *value, size_t value_length,
+ time_t expiration,
+ uint16_t flags);
+
+ memcached_return
+ memcached_add_by_key(memcached_st *ptr,
+ char *master_key, size_t master_key_length,
+ char *key, size_t key_length,
+ char *value, size_t value_length,
+ time_t expiration,
+ uint16_t flags);
+
+ memcached_return
+ memcached_replace_by_key(memcached_st *ptr,
+ char *master_key, size_t master_key_length,
+ char *key, size_t key_length,
+ char *value, size_t value_length,
+ time_t expiration,
+ uint16_t flags);
+
+ memcached_return
+ memcached_prepend_by_key(memcached_st *ptr,
+ char *master_key, size_t master_key_length,
+ char *key, size_t key_length,
+ char *value, size_t value_length,
+ time_t expiration,
+ uint16_t flags);
+
+ memcached_return
+ memcached_append_by_key(memcached_st *ptr,
+ char *master_key, size_t master_key_length,
+ char *key, size_t key_length,
+ char *value, size_t value_length,
+ time_t expiration,
+ uint16_t flags);
+
+ memcached_return
+ memcached_cas_by_key(memcached_st *ptr,
+ char *master_key, size_t master_key_length,
+ char *key, size_t key_length,
+ char *value, size_t value_length,
+ time_t expiration,
+ uint16_t flags,
+ uint64_t cas);
+
=head1 DESCRIPTION
memcached_set(), memcached_add(), and memcached_replace() are all used to
for it in libmemcached(3) is optional. Please see memcached_set() for
information on how to do this.
+memcached_set_by_key(), memcached_add_by_key(), memcached_replace_by_key(),
+memcached_prepend_by_key(), memcached_append_by_key_by_key(),
+memcached_cas_by_key() methods all behave in a similar method as the non key
+methods. The difference is that they use their master_key parameter to map
+objects to particular servers.
+
If you are looking for performance, memcached_set() with non-blocking IO is
the fastest way to store data on the server.
#define MEMCACHED_MAX_HOST_LENGTH 64
#define MEMCACHED_WHEEL_SIZE 1024
#define MEMCACHED_STRIDE 4
-#define MEMCACHED_DEFAILT_TIMEOUT 100
+#define MEMCACHED_DEFAULT_TIMEOUT 100
typedef enum {
MEMCACHED_SUCCESS,
} memcached_return;
typedef enum {
- MEMCACHED_DISTRIBUTION_MODULO,
+ MEMCACHED_DISTRIBUTION_MODULA,
MEMCACHED_DISTRIBUTION_CONSISTENT,
} memcached_server_distribution;
char ** memcached_stat_get_keys(memcached_st *ptr, memcached_stat_st *stat,
memcached_return *error);
+char *memcached_get_by_key(memcached_st *ptr,
+ char *master_key, size_t master_key_length,
+ char *key, size_t key_length,
+ size_t *value_length,
+ uint16_t *flags,
+ memcached_return *error);
+
+memcached_return memcached_mget_by_key(memcached_st *ptr,
+ char *master_key, size_t master_key_length,
+ char **keys, size_t *key_length,
+ unsigned int number_of_keys);
+
+memcached_return memcached_set_by_key(memcached_st *ptr,
+ char *master_key, size_t master_key_length,
+ char *key, size_t key_length,
+ char *value, size_t value_length,
+ time_t expiration,
+ uint16_t flags);
+
+memcached_return memcached_add_by_key(memcached_st *ptr,
+ char *master_key, size_t master_key_length,
+ char *key, size_t key_length,
+ char *value, size_t value_length,
+ time_t expiration,
+ uint16_t flags);
+
+memcached_return memcached_replace_by_key(memcached_st *ptr,
+ char *master_key, size_t master_key_length,
+ char *key, size_t key_length,
+ char *value, size_t value_length,
+ time_t expiration,
+ uint16_t flags);
+
+memcached_return memcached_prepend_by_key(memcached_st *ptr,
+ char *master_key, size_t master_key_length,
+ char *key, size_t key_length,
+ char *value, size_t value_length,
+ time_t expiration,
+ uint16_t flags);
+
+memcached_return memcached_append_by_key(memcached_st *ptr,
+ char *master_key, size_t master_key_length,
+ char *key, size_t key_length,
+ char *value, size_t value_length,
+ time_t expiration,
+ uint16_t flags);
+
+memcached_return memcached_cas_by_key(memcached_st *ptr,
+ char *master_key, size_t master_key_length,
+ char *key, size_t key_length,
+ char *value, size_t value_length,
+ time_t expiration,
+ uint16_t flags,
+ uint64_t cas);
+
/* Result Struct */
void memcached_result_free(memcached_result_st *result);
memcached_result_st *memcached_result_create(memcached_st *ptr,
}
string_ptr= memcached_string_create(ptr, &ptr->result_buffer, 0);
WATCHPOINT_ASSERT(string_ptr);
- ptr->poll_timeout= MEMCACHED_DEFAILT_TIMEOUT;
- ptr->distribution= MEMCACHED_DISTRIBUTION_MODULO;
+ ptr->poll_timeout= MEMCACHED_DEFAULT_TIMEOUT;
+ ptr->distribution= MEMCACHED_DISTRIBUTION_MODULA;
return ptr;
}
size_t *value_length,
uint16_t *flags,
memcached_return *error)
+{
+ return memcached_get_by_key(ptr, NULL, 0, key, key_length, value_length,
+ flags, error);
+}
+
+char *memcached_get_by_key(memcached_st *ptr,
+ char *master_key, size_t master_key_length,
+ char *key, size_t key_length,
+ size_t *value_length,
+ uint16_t *flags,
+ memcached_return *error)
{
char *value;
/* Request the key */
- *error= memcached_mget(ptr, &key, &key_length, 1);
+ *error= memcached_mget_by_key(ptr,
+ master_key,
+ master_key_length,
+ &key, &key_length, 1);
value= memcached_fetch(ptr, NULL, NULL,
value_length, flags, error);
memcached_return memcached_mget(memcached_st *ptr,
char **keys, size_t *key_length,
unsigned int number_of_keys)
+{
+ return memcached_mget_by_key(ptr, NULL, 0, keys, key_length, number_of_keys);
+}
+
+memcached_return memcached_mget_by_key(memcached_st *ptr,
+ char *master_key, size_t master_key_length,
+ char **keys, size_t *key_length,
+ unsigned int number_of_keys)
{
unsigned int x;
memcached_return rc= MEMCACHED_NOTFOUND;
char *get_command= "get ";
- uint8_t get_command_length= 4
+ uint8_t get_command_length= 4;
+ unsigned int master_server_key= 0;
LIBMEMCACHED_MEMCACHED_MGET_START();
ptr->cursor_server= 0;
memcached_finish(ptr);
+ if (master_key && master_key_length)
+ master_server_key= memcached_generate_hash(ptr, master_key, master_key_length);
+
/*
If a server fails we warn about errors and start all over with sending keys
to the server.
{
unsigned int server_key;
- server_key= memcached_generate_hash(ptr, keys[x], key_length[x]);
+ if (master_server_key)
+ server_key= master_server_key;
+ else
+ server_key= memcached_generate_hash(ptr, keys[x], key_length[x]);
if (ptr->hosts[server_key].cursor_active == 0)
{
WATCHPOINT_ASSERT(hash);
- if (ptr->distribution == MEMCACHED_DISTRIBUTION_MODULO)
+ if (ptr->distribution == MEMCACHED_DISTRIBUTION_MODULA)
{
return hash % ptr->number_of_hosts;
}
}
static inline memcached_return memcached_send(memcached_st *ptr,
+ char *master_key, size_t master_key_length,
char *key, size_t key_length,
char *value, size_t value_length,
time_t expiration,
if (ptr->number_of_hosts == 0)
return MEMCACHED_NO_SERVERS;
- server_key= memcached_generate_hash(ptr, key, key_length);
+ server_key= memcached_generate_hash(ptr, master_key, master_key_length);
if (cas)
write_length= snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE,
{
memcached_return rc;
LIBMEMCACHED_MEMCACHED_SET_START();
- rc= memcached_send(ptr, key, key_length, value, value_length,
- expiration, flags, 0, SET_OP);
+ rc= memcached_send(ptr, key, key_length,
+ key, key_length, value, value_length,
+ expiration, flags, 0, SET_OP);
LIBMEMCACHED_MEMCACHED_SET_END();
return rc;
}
{
memcached_return rc;
LIBMEMCACHED_MEMCACHED_ADD_START();
- rc= memcached_send(ptr, key, key_length, value, value_length,
- expiration, flags, 0, ADD_OP);
+ rc= memcached_send(ptr, key, key_length,
+ key, key_length, value, value_length,
+ expiration, flags, 0, ADD_OP);
LIBMEMCACHED_MEMCACHED_ADD_END();
return rc;
}
{
memcached_return rc;
LIBMEMCACHED_MEMCACHED_REPLACE_START();
- rc= memcached_send(ptr, key, key_length, value, value_length,
- expiration, flags, 0, REPLACE_OP);
+ rc= memcached_send(ptr, key, key_length,
+ key, key_length, value, value_length,
+ expiration, flags, 0, REPLACE_OP);
LIBMEMCACHED_MEMCACHED_REPLACE_END();
return rc;
}
uint16_t flags)
{
memcached_return rc;
- rc= memcached_send(ptr, key, key_length, value, value_length,
+ rc= memcached_send(ptr, key, key_length,
+ key, key_length, value, value_length,
expiration, flags, 0, PREPEND_OP);
return rc;
}
uint16_t flags)
{
memcached_return rc;
- rc= memcached_send(ptr, key, key_length, value, value_length,
+ rc= memcached_send(ptr, key, key_length,
+ key, key_length, value, value_length,
expiration, flags, 0, APPEND_OP);
return rc;
}
uint64_t cas)
{
memcached_return rc;
- rc= memcached_send(ptr, key, key_length, value, value_length,
+ rc= memcached_send(ptr, key, key_length,
+ key, key_length, value, value_length,
+ expiration, flags, cas, APPEND_OP);
+ return rc;
+}
+
+memcached_return memcached_set_by_key(memcached_st *ptr,
+ char *master_key, size_t master_key_length,
+ char *key, size_t key_length,
+ char *value, size_t value_length,
+ time_t expiration,
+ uint16_t flags)
+{
+ memcached_return rc;
+ LIBMEMCACHED_MEMCACHED_SET_START();
+ rc= memcached_send(ptr, key, key_length,
+ key, key_length, value, value_length,
+ expiration, flags, 0, SET_OP);
+ LIBMEMCACHED_MEMCACHED_SET_END();
+ return rc;
+}
+
+memcached_return memcached_add_by_key(memcached_st *ptr,
+ char *master_key, size_t master_key_length,
+ char *key, size_t key_length,
+ char *value, size_t value_length,
+ time_t expiration,
+ uint16_t flags)
+{
+ memcached_return rc;
+ LIBMEMCACHED_MEMCACHED_ADD_START();
+ rc= memcached_send(ptr, key, key_length,
+ key, key_length, value, value_length,
+ expiration, flags, 0, ADD_OP);
+ LIBMEMCACHED_MEMCACHED_ADD_END();
+ return rc;
+}
+
+memcached_return memcached_replace_by_key(memcached_st *ptr,
+ char *master_key, size_t master_key_length,
+ char *key, size_t key_length,
+ char *value, size_t value_length,
+ time_t expiration,
+ uint16_t flags)
+{
+ memcached_return rc;
+ LIBMEMCACHED_MEMCACHED_REPLACE_START();
+ rc= memcached_send(ptr, key, key_length,
+ key, key_length, value, value_length,
+ expiration, flags, 0, REPLACE_OP);
+ LIBMEMCACHED_MEMCACHED_REPLACE_END();
+ return rc;
+}
+
+memcached_return memcached_prepend_by_key(memcached_st *ptr,
+ char *master_key, size_t master_key_length,
+ char *key, size_t key_length,
+ char *value, size_t value_length,
+ time_t expiration,
+ uint16_t flags)
+{
+ memcached_return rc;
+ rc= memcached_send(ptr, key, key_length,
+ key, key_length, value, value_length,
+ expiration, flags, 0, PREPEND_OP);
+ return rc;
+}
+
+memcached_return memcached_append_by_key(memcached_st *ptr,
+ char *master_key, size_t master_key_length,
+ char *key, size_t key_length,
+ char *value, size_t value_length,
+ time_t expiration,
+ uint16_t flags)
+{
+ memcached_return rc;
+ rc= memcached_send(ptr, key, key_length,
+ key, key_length, value, value_length,
+ expiration, flags, 0, APPEND_OP);
+ return rc;
+}
+
+memcached_return memcached_cas_by_key(memcached_st *ptr,
+ char *master_key, size_t master_key_length,
+ char *key, size_t key_length,
+ char *value, size_t value_length,
+ time_t expiration,
+ uint16_t flags,
+ uint64_t cas)
+{
+ memcached_return rc;
+ rc= memcached_send(ptr, key, key_length,
+ key, key_length, value, value_length,
expiration, flags, cas, APPEND_OP);
return rc;
}
void scheduler(memcached_server_st *servers, conclusions_st *conclusion)
{
unsigned int x;
- unsigned int actual_loaded;
+ unsigned int actual_loaded= 0; /* Fix warning */
memcached_st *memc;
struct timeval start_time, end_time;
%{_mandir}/man3/libmemcached.3.gz
%{_mandir}/man3/libmemcached_examples.3.gz
%{_mandir}/man3/memcached_add.3.gz
+%{_mandir}/man3/memcached_add_by_key.3.gz
%{_mandir}/man3/memcached_append.3.gz
+%{_mandir}/man3/memcached_append_by_key.3.gz
%{_mandir}/man3/memcached_behavior_get.3.gz
%{_mandir}/man3/memcached_behavior_set.3.gz
%{_mandir}/man3/memcached_cas.3.gz
+%{_mandir}/man3/memcached_cas_by_key.3.gz
%{_mandir}/man3/memcached_clone.3.gz
%{_mandir}/man3/memcached_create.3.gz
%{_mandir}/man3/memcached_decrement.3.gz
%{_mandir}/man3/memcached_fetch_result.3.gz
%{_mandir}/man3/memcached_free.3.gz
%{_mandir}/man3/memcached_get.3.gz
+%{_mandir}/man3/memcached_get_by_key.3.gz
%{_mandir}/man3/memcached_increment.3.gz
%{_mandir}/man3/memcached_mget.3.gz
+%{_mandir}/man3/memcached_mget_by_key.3.gz
%{_mandir}/man3/memcached_prepend.3.gz
+%{_mandir}/man3/memcached_prepend_by_key.3.gz
%{_mandir}/man3/memcached_quit.3.gz
%{_mandir}/man3/memcached_replace.3.gz
%{_mandir}/man3/memcached_server_add.3.gz
%{_mandir}/man3/memcached_server_push.3.gz
%{_mandir}/man3/memcached_servers_parse.3.gz
%{_mandir}/man3/memcached_set.3.gz
+%{_mandir}/man3/memcached_set_by_key.3.gz
%{_mandir}/man3/memcached_stat.3.gz
%{_mandir}/man3/memcached_stat_get_keys.3.gz
%{_mandir}/man3/memcached_stat_get_value.3.gz
record-extended:
./testapp extended > output2.res
-test: testapp
+test: testapp library_test
+ echo "Tests completed"
+
+library_test:
./testapp > output.cmp
diff output.res output.cmp
+
+clients:
+ memcached -d -P /tmp/Xumemc.pid -p 12555
+ export MEMCACHED_SERVERS="localhost:12555"
sh t/memcat.test > r/memcat.cmp
diff r/memcat.res r/memcat.cmp
sh t/memcp.test > r/memcp.cmp
diff r/memslap.res r/memslap.cmp
sh t/memstat.test > r/memstat.cmp
diff r/memstat.res r/memstat.cmp
-
-test-extended: testapp
- ./testapp extended > output.cmp
- diff output2.res output.cmp
+ cat /tmp/Xumemc.pid | xargs kill
+ rm /tmp/Xumemc.pid
valgrind:
libtool --mode=execute valgrind --leak-check=yes --show-reachable=yes testapp
&return_value_length, &flags, &rc)) != NULL)
{
assert(return_value);
+ free(return_value);
count++;
}
assert(count == 3);
Found key bytes_written
Found key limit_maxbytes
Found key threads
-Error 0 -> SUCCESS
-Error 1 -> FAILURE
-Error 2 -> HOSTNAME LOOKUP FAILURE
-Error 3 -> CONNECTION FAILURE
-Error 4 -> CONNECTION BIND FAILURE
-Error 5 -> WRITE FAILURE
-Error 6 -> READ FAILURE
-Error 7 -> UNKNOWN READ FAILURE
-Error 8 -> PROTOCOL ERROR
-Error 9 -> CLIENT ERROR
-Error 10 -> SERVER ERROR
-Error 11 -> CONNECTION SOCKET CREATE FAILURE
-Error 12 -> CONNECTION DATA EXISTS
-Error 13 -> CONNECTION DATA DOES NOT EXIST
-Error 14 -> NOT STORED
-Error 15 -> STORED
-Error 16 -> NOT FOUND
-Error 17 -> MEMORY ALLOCATION FAILURE
-Error 18 -> PARTIAL READ
-Error 19 -> SOME ERRORS WERE REPORTED
-Error 20 -> NO SERVERS DEFINED
-Error 21 -> SERVER END
-Error 22 -> SERVER DELETE
-Error 23 -> SERVER VALUE
-Error 24 -> STAT VALUE
-Error 25 -> SYSTEM ERROR
-Error 26 -> COULD NOT OPEN UNIX SOCKET
-Error 27 -> ACTION NOT SUPPORTED
-Error 28 -> A KEY LENGTH OF ZERO WAS PROVIDED
-Error 29 -> FETCH WAS NOT COMPLETED
-Found key pid
-Found key uptime
-Found key time
-Found key version
-Found key pointer_size
-Found key rusage_user
-Found key rusage_system
-Found key curr_items
-Found key total_items
-Found key bytes
-Found key curr_connections
-Found key total_connections
-Found key connection_structures
-Found key cmd_get
-Found key cmd_set
-Found key get_hits
-Found key get_misses
-Found key evictions
-Found key bytes_read
-Found key bytes_written
-Found key limit_maxbytes
-Found key threads
-Found key pid
-Found key uptime
-Found key time
-Found key version
-Found key pointer_size
-Found key rusage_user
-Found key rusage_system
-Found key curr_items
-Found key total_items
-Found key bytes
-Found key curr_connections
-Found key total_connections
-Found key connection_structures
-Found key cmd_get
-Found key cmd_set
-Found key get_hits
-Found key get_misses
-Found key evictions
-Found key bytes_read
-Found key bytes_written
-Found key limit_maxbytes
-Found key threads
$MEMSLAP --help
-$MEMSLAP --servers=localhost --initial-load=5000 --verbose --flush --concurrency=500 --execute-number=500 > /dev/null
+$MEMSLAP --initial-load=5000 --verbose --flush --concurrency=500 --execute-number=500 > /dev/null
test_st *run;
run= next->tests;
- if (collection_to_run && fnmatch(collection_to_run, next->name, FNM_CASEFOLD))
+ if (collection_to_run && fnmatch(collection_to_run, next->name, 0))
continue;
fprintf(stderr, "\n%s\n\n", next->name);
memcached_return rc;
struct timeval start_time, end_time;
- if (wildcard && fnmatch(wildcard, run->name, FNM_CASEFOLD))
+ if (wildcard && fnmatch(wildcard, run->name, 0))
continue;
fprintf(stderr, "Testing %s", run->name);