示例#1
0
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;
}
示例#2
0
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);
	
}
示例#3
0
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;
}