示例#1
0
int kvstore_put_overwrite(void) {
  char *retval;
  int ret;
  ret = kvstore_put(&teststore, "mykey", "initial value");
  ret += kvstore_put(&teststore, "mykey", "updated value");
  ret += kvstore_get(&teststore, "mykey", &retval);
  ASSERT_STRING_EQUAL(retval, "updated value");
  free(retval);
  ASSERT_EQUAL(ret, 0);
  return 1;
}
示例#2
0
int kvstore_put_oversized_fields(void) {
  char oversizedkey[MAX_KEYLEN + 2], oversizedvalue[MAX_VALLEN + 2];
  int ret, i;
  strcpy(oversizedkey, "a");
  strcpy(oversizedvalue, "v");
  for (i = 1; i < MAX_KEYLEN + 1; i++)
    strcat(oversizedkey, "a");
  for (i = 1; i < MAX_VALLEN + 1; i++)
    strcat(oversizedvalue, "v");
  ret = kvstore_put(&teststore, oversizedkey, "normal value");
  ASSERT_EQUAL(ret, ERRKEYLEN);
  ret = kvstore_put(&teststore, "normal key", oversizedvalue);
  ASSERT_EQUAL(ret, ERRVALLEN);
  return 1;
}
示例#3
0
/* Inserts the given KEY, VALUE pair into this server's store
 * Returns 0 if successful, else a negative error code. */
int tpcfollower_put(tpcfollower_t *server, char *key, char *value) {
  int ret;
  if ((ret = tpcfollower_put_check(server, key, value)) < 0)
    return ret;
  ret = kvstore_put(&server->store, key, value);
  return ret;
}
示例#4
0
int kvstore_multiple_put_get(void) {
  char *retval;
  int ret;
  ret = kvstore_put(&teststore, "KEY1", "VALUE1");
  ret += kvstore_put(&teststore, "KEY2", "VALUE2");
  ret += kvstore_put(&teststore, "KEY3", "VALUE3");
  ret += kvstore_get(&teststore, "KEY1", &retval);
  ASSERT_STRING_EQUAL(retval, "VALUE1");
  free(retval);
  ret += kvstore_get(&teststore, "KEY2", &retval);
  ASSERT_STRING_EQUAL(retval, "VALUE2");
  free(retval);
  ret += kvstore_get(&teststore, "KEY3", &retval);
  ASSERT_STRING_EQUAL(retval, "VALUE3");
  free(retval);
  ASSERT_EQUAL(ret, 0);
  return 1;
}
示例#5
0
int kvstore_get_put_uninitialized(void) {
  char *retval;
  int ret;
  kvstore_clean(&teststore);
  ret = kvstore_get(&teststore, "KEY", &retval);
  ASSERT_EQUAL(ret, ERRFILACCESS);
  ret = kvstore_put(&teststore, "KEY", "VALUE");
  ASSERT_EQUAL(ret, ERRFILACCESS);
  return 1;
}
示例#6
0
int kvstore_put_get_blank_value(void) {
  char *retval;
  int ret;
  ret = kvstore_put(&teststore, "valid key", "");
  ret += kvstore_get(&teststore, "valid key", &retval);
  ASSERT_STRING_EQUAL(retval, "");
  ASSERT_EQUAL(ret, 0);
  free(retval);
  return 1;
}
示例#7
0
int kvstore_single_put_get(void) {
  char *retval;
  int ret;
  ret = kvstore_put(&teststore, "MYKEY", "MYVALUE");
  ASSERT_EQUAL(ret, 0);
  ret = kvstore_get(&teststore, "MYKEY", &retval);
  ASSERT_EQUAL(ret, 0);
  ASSERT_STRING_EQUAL(retval, "MYVALUE");
  free(retval);
  return 1;
}
示例#8
0
int kvstore_get_put_with_hash_conflicts(void) {
  /* hash("abD") == hash("aae") == hash("ac#") */
  char *retval, *key1 = "abD", *key2 = "aae", *key3 = "ac#";
  int ret;
  ret = kvstore_put(&teststore, key1, "value1");
  ret += kvstore_put(&teststore, key2, "value2");
  ret += kvstore_put(&teststore, key3, "value3");
  ret += kvstore_get(&teststore, key1, &retval);
  ASSERT_STRING_EQUAL(retval, "value1");
  free(retval);
  ret += kvstore_get(&teststore, key2, &retval);
  ASSERT_STRING_EQUAL(retval, "value2");
  free(retval);
  ret += kvstore_get(&teststore, key3, &retval);
  ASSERT_STRING_EQUAL(retval, "value3");
  free(retval);
  /* Clean the store and do it again in a different order to ensure that
     the above success wasn't just because of a lucky ordering. */
  kvstore_clean(&teststore);
  kvstore_init(&teststore, KVSTORE_DIRNAME);
  ret = kvstore_put(&teststore, key2, "value2");
  ret += kvstore_put(&teststore, key3, "value3");
  ret += kvstore_put(&teststore, key1, "value1");
  ret += kvstore_get(&teststore, key1, &retval);
  ASSERT_STRING_EQUAL(retval, "value1");
  free(retval);
  ret += kvstore_get(&teststore, key2, &retval);
  ASSERT_STRING_EQUAL(retval, "value2");
  free(retval);
  ret += kvstore_get(&teststore, key3, &retval);
  ASSERT_STRING_EQUAL(retval, "value3");
  free(retval);
  ASSERT_EQUAL(ret, 0);
  return 1;
}
示例#9
0
/* Inserts the given KEY, VALUE pair into this server's store and cache. Access
 * to the cache should be concurrent if the keys are in different cache sets.
 * Returns 0 if successful, else a negative error code. */
int kvserver_put(kvserver_t *server, char *key, char *value) {
  // OUR CODE HERE
  int success;
  pthread_rwlock_t *lock = kvcache_getlock(&server->cache, key);
  if (lock == NULL) return ERRKEYLEN;
  pthread_rwlock_wrlock(lock);
  if ((success = kvcache_put(&server->cache, key, value)) < 0) {
    pthread_rwlock_unlock(lock);
    return success;
  }
  pthread_rwlock_unlock(lock);
  return kvstore_put(&server->store, key, value);
}
示例#10
0
int kvstore_del_simple(void) {
  char *retval;
  int ret;
  ret = kvstore_put(&teststore, "key", "val");
  ret += kvstore_get(&teststore, "key", &retval);
  ASSERT_STRING_EQUAL(retval, "val");
  free(retval);
  ret += kvstore_del(&teststore, "key");
  ASSERT_EQUAL(ret, 0);
  retval = NULL;
  ret = kvstore_get(&teststore, "key", &retval);
  ASSERT_EQUAL(ret, ERRNOKEY);
  ASSERT_PTR_NULL(retval);
  return 1;
}
示例#11
0
int kvstore_del_hash_conflicts(void) {
  /* hash("abD") == hash("aae") == hash("ac#") */
  char *retval = NULL, *key1 = "abD", *key2 = "aae", *key3 = "ac#";
  int ret;
  ret = kvstore_put(&teststore, key1, "value1");
  ret += kvstore_put(&teststore, key2, "value2");
  ret += kvstore_put(&teststore, key3, "value3");
  ret += kvstore_del(&teststore, key2);
  ASSERT_EQUAL(ret, 0);
  ret = kvstore_get(&teststore, key2, &retval);
  ASSERT_PTR_NULL(retval);
  ASSERT_EQUAL(ret, ERRNOKEY);
  ret = kvstore_get(&teststore, key1, &retval);
  ASSERT_STRING_EQUAL(retval, "value1");
  free(retval);
  ret += kvstore_get(&teststore, key3, &retval);
  ASSERT_STRING_EQUAL(retval, "value3");
  free(retval);
  ASSERT_EQUAL(ret, 0);
  /* Clean store and do operations again with a different insertion order to
   * help ensure that success wasn't due to a lucky ordering. */
  kvstore_clean(&teststore);
  kvstore_init(&teststore, KVSTORE_DIRNAME);
  ret = kvstore_put(&teststore, key2, "value2");
  ret += kvstore_put(&teststore, key1, "value1");
  ret += kvstore_put(&teststore, key3, "value3");
  ret += kvstore_del(&teststore, key2);
  ASSERT_EQUAL(ret, 0);
  retval = NULL;
  ret = kvstore_get(&teststore, key2, &retval);
  ASSERT_PTR_NULL(retval);
  ASSERT_EQUAL(ret, ERRNOKEY);
  ret = kvstore_get(&teststore, key1, &retval);
  ASSERT_STRING_EQUAL(retval, "value1");
  free(retval);
  ret += kvstore_get(&teststore, key3, &retval);
  ASSERT_STRING_EQUAL(retval, "value3");
  free(retval);
  ASSERT_EQUAL(ret, 0);
  return 1;
}