static int lmdb_storage_get(void* handle, iid_t iid, paxos_accepted* out) { struct lmdb_storage* s = handle; int result; MDB_val key, data; memset(&data, 0, sizeof(data)); key.mv_data = &iid; key.mv_size = sizeof(iid_t); if ((result = mdb_get(s->txn, s->dbi, &key, &data)) != 0) { if (result == MDB_NOTFOUND) { paxos_log_debug("There is no record for iid: %d", iid); } else { paxos_log_error("Could not find record for iid: %d : %s", iid, mdb_strerror(result)); } return 0; } paxos_accepted_from_buffer(data.mv_data, out); assert(iid == out->iid); return 1; }
static void proposer_preexecute(struct evproposer* p) { int i; prepare_req pr; int count = p->preexec_window - proposer_prepared_count(p->state); //先进先出队列保存准备实例,队列长128,用一个释放一个,有空间了就把新的加到队列末尾。 if (count <= 0) return; for (i = 0; i < count; i++) { proposer_prepare(p->state, &pr); //发送prepare请求 send_prepares(p, &pr); } paxos_log_debug("Opened %d new instances", count); }
acceptor_record* storage_get_record(struct storage* s, iid_t iid) { int flags, result; DBT dbkey, dbdata; DB* dbp = s->db; DB_TXN* txn = s->txn; acceptor_record* record_buffer = NULL; memset(&dbkey, 0, sizeof(DBT)); memset(&dbdata, 0, sizeof(DBT)); //Key is iid dbkey.data = &iid; dbkey.size = sizeof(iid_t); //Force copy to the specified buffer dbdata.flags = DB_DBT_MALLOC; //Read the record flags = 0; result = dbp->get(dbp, txn, &dbkey, &dbdata, flags); if (result == DB_NOTFOUND || result == DB_KEYEMPTY) { paxos_log_debug("The record for iid: %d does not exist", iid); return NULL; } else if (result != 0) { paxos_log_error("Error while reading record with iid%u : %s", iid, db_strerror(result)); return NULL; } record_buffer = (acceptor_record*) dbdata.data; assert(record_buffer != NULL); //Record found assert(iid == record_buffer->iid); return record_buffer; }