/* Initializes a kvserver. Will return 0 if successful, or a negative error * code if not. DIRNAME is the directory which should be used to store entries * for this server. The server's cache will have NUM_SETS cache sets, each * with ELEM_PER_SET elements. HOSTNAME and PORT indicate where SERVER will be * made available for requests. USE_TPC indicates whether this server should * use TPC logic (for PUTs and DELs) or not. */ int kvserver_init(kvserver_t *server, char *dirname, unsigned int num_sets, unsigned int elem_per_set, unsigned int max_threads, const char *hostname, int port, bool use_tpc) { int ret; ret = kvcache_init(&server->cache, num_sets, elem_per_set); if (ret < 0) return ret; ret = kvstore_init(&server->store, dirname); if (ret < 0) return ret; if (use_tpc) { ret = tpclog_init(&server->log, dirname); if (ret < 0) return ret; } server->hostname = malloc(strlen(hostname) + 1); if (server->hostname == NULL) return ENOMEM; strcpy(server->hostname, hostname); server->port = port; server->use_tpc = use_tpc; server->max_threads = max_threads; server->handle = kvserver_handle; // OUR CODE HERE server->msg = NULL; server->state = TPC_READY; return 0; }
/* Initializes a tpcfollower. Will return 0 if successful, or a negative error * code if not. DIRNAME is the directory which should be used to store entries * for this server. HOSTNAME and PORT indicate where SERVER will be * made available for requests. */ int tpcfollower_init(tpcfollower_t *server, char *dirname, unsigned int max_threads, const char *hostname, int port) { int ret; ret = kvstore_init(&server->store, dirname); if (ret < 0) return ret; ret = tpclog_init(&server->log, dirname); if (ret < 0) return ret; strcpy(server->hostname, hostname); server->port = port; server->max_threads = max_threads; server->state = TPC_INIT; /* Rebuild TPC state. */ tpcfollower_rebuild_state(server); return 0; }