int tpcmaster_put_updates_cache(void) { char* value; current_test = PUT_CACHE; tpcmaster_run_test(); kvcache_get(&testmaster.cache, "KEY", &value); ASSERT_STRING_EQUAL(value, "VAL2"); return 1; }
int tpcmaster_del_updates_cache(void) { char* value; int ret; current_test = DEL_CACHE; tpcmaster_run_test(); ret = kvcache_get(&testmaster.cache, "KEY", &value); ASSERT_EQUAL(ret, ERRNOKEY); return 1; }
/* Attempts to get KEY from SERVER. Returns 0 if successful, else a negative * error code. If successful, VALUE will point to a string which should later * be free()d. If the KEY is in cache, take the value from there. Otherwise, * go to the store and update the value in the cache. */ int kvserver_get(kvserver_t *server, char *key, char **value) { // OUR CODE HERE int ret; pthread_rwlock_t *lock = kvcache_getlock(&server->cache, key); if (lock == NULL) return ERRKEYLEN; pthread_rwlock_rdlock(lock); if (kvcache_get(&server->cache, key, value) == 0) { pthread_rwlock_unlock(lock); return 0; } pthread_rwlock_unlock(lock); if ((ret = kvstore_get(&server->store, key, value)) < 0) return ret; pthread_rwlock_wrlock(lock); ret = kvcache_put(&server->cache, key, *value); // what happens if this is unsuccessful? pthread_rwlock_unlock(lock); return ret; }
int kvserver_write_through(void) { reqmsg.type = PUTREQ; reqmsg.key = "MYKEY"; reqmsg.value = "MYVALUE"; kvserver_handle_no_tpc(&testserver, &reqmsg, &respmsg); char* retval; int ret; //check if written to cache ret = kvcache_get(&testserver.cache, "MYKEY", &retval); ASSERT_EQUAL(ret, 0); ASSERT_PTR_NOT_NULL(retval); ASSERT_EQUAL(strcmp("MYVALUE", retval), 0); free(retval); //check if written to store ret = find_entry(&testserver.store, "MYKEY", &retval); ASSERT_TRUE(ret >= 0); ASSERT_PTR_NOT_NULL(retval); ASSERT_EQUAL(strcmp("MYVALUE", retval), 0); free(retval); return 1; }