~mkoppanen/libmemcached/replication-miss-test

« back to all changes in this revision

Viewing changes to tests/mem_functions.c

  • Committer: Mikko Koppanen
  • Date: 2010-02-10 21:53:36 UTC
  • Revision ID: mkoppanen@gameboy.config-20100210215336-0l3o4hpmexn0chmy
added test

Show diffs side-by-side

added added

removed removed

Lines of Context:
4439
4439
  return TEST_SUCCESS;
4440
4440
}
4441
4441
 
 
4442
/* Test that single miss does not cause replica reads to fail */
 
4443
static test_return_t replication_miss_test(memcached_st *memc)
 
4444
{
 
4445
  memcached_return_t rc;
 
4446
  memcached_st *memc_repl= memcached_clone(NULL, memc);
 
4447
  memcached_st *memc_single= memcached_clone(NULL, memc);
 
4448
 
 
4449
  char *v;
 
4450
  const char *key   = "hello_w_k";
 
4451
  const char *value = "my_value";
 
4452
  size_t vlen;
 
4453
  uint32_t flags;
 
4454
 
 
4455
  /* this test makes sense only with 2 or more servers */
 
4456
  test_true(memcached_server_count(memc_repl) > 1);
 
4457
 
 
4458
  /* Consistent hash */
 
4459
  memcached_behavior_set(memc_repl, MEMCACHED_DISTRIBUTION_CONSISTENT, 1);
 
4460
  memcached_behavior_set(memc_single, MEMCACHED_DISTRIBUTION_CONSISTENT, 1);
 
4461
 
 
4462
  /* The first clone writes to all servers */
 
4463
  memcached_behavior_set(memc_repl, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 1);
 
4464
  memcached_behavior_set(memc_repl, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS, 
 
4465
                         memcached_server_count(memc_repl));
 
4466
 
 
4467
  /* Write to servers */
 
4468
  rc= memcached_set(memc_repl, key, strlen(key), 
 
4469
                               value, strlen(value), 
 
4470
                               (time_t)1200, (uint32_t)0);
 
4471
  test_true(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
 
4472
 
 
4473
  /* Use the second clone to remove the key from primary server.
 
4474
      This should remove the key from only one server */
 
4475
  rc= memcached_delete(memc_single, key, strlen(key), 0);
 
4476
  test_true(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
 
4477
  
 
4478
  /* Remove the server where the key was deleted */
 
4479
  memcached_server_st *instance= memcached_server_by_key(memc_single, key, strlen(key), &rc);
 
4480
  test_true(rc == MEMCACHED_SUCCESS);
 
4481
  rc= memcached_server_remove(instance);
 
4482
  test_true(rc == MEMCACHED_SUCCESS);
 
4483
  
 
4484
  /* Test that others still have it */
 
4485
  v= memcached_get(memc_single, key, strlen(key), &vlen, &flags, &rc);
 
4486
  test_true(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
 
4487
  test_true(v && strcmp(v, value) == 0);
 
4488
  free(v);
 
4489
 
 
4490
  /* This read should still return the value as we have it on other servers */
 
4491
  v= memcached_get(memc_repl, key, strlen(key), &vlen, &flags, &rc);
 
4492
  test_true(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
 
4493
  test_true(v && strcmp(v, value) == 0);
 
4494
  free(v);
 
4495
  
 
4496
  memcached_free(memc_repl);
 
4497
  memcached_free(memc_single);
 
4498
 
 
4499
  return TEST_SUCCESS;
 
4500
}
 
4501
 
4442
4502
static test_return_t replication_delete_test(memcached_st *memc)
4443
4503
{
4444
4504
  memcached_return_t rc;
5995
6055
  {"set", 1, (test_callback_fn)replication_set_test },
5996
6056
  {"get", 0, (test_callback_fn)replication_get_test },
5997
6057
  {"mget", 0, (test_callback_fn)replication_mget_test },
 
6058
  {"miss", 0, (test_callback_fn)replication_miss_test},
5998
6059
  {"delete", 0, (test_callback_fn)replication_delete_test },
5999
6060
  {"rand_mget", 0, (test_callback_fn)replication_randomize_mget_test },
6000
6061
  {0, 0, (test_callback_fn)0}