Promise<Unit> MultiPromiseActor::get_promise() { if (empty()) { register_actor("MultiPromise", this).release(); } CHECK(!promises_.empty()); PromiseActor<Unit> promise; FutureActor<Unit> future; init_promise_future(&promise, &future); future.set_event(EventCreator::raw(actor_id(), nullptr)); futures_.emplace_back(std::move(future)); return PromiseCreator::from_promise_actor(std::move(promise)); }
bool server_helper_impl::prepare_for_start(const server_argv& a, bool use_cht) { #ifdef HAVE_ZOOKEEPER_H if (!a.is_standalone()) { ls = zk_; common::prepare_jubatus(*zk_, a.type, a.name); if (a.join) { // join to the existing cluster with -j option LOG(INFO) << "joining to the cluseter " << a.name; LOG(ERROR) << "join is not supported yet :("; } if (use_cht) { jubatus::common::cht::setup_cht_dir(*zk_, a.type, a.name); jubatus::common::cht ht(zk_, a.type, a.name); ht.register_node(a.eth, a.port); } // FIXME(rethink): is this sequence correct? register_actor(*zk_, a.type, a.name, a.eth, a.port); return true; } #endif return false; }
// 1. Figure out actor index, create one if it does not exist // 2. check info for evnum/evterm data int sqlite3WalOpen(sqlite3_vfs *pVfs, sqlite3_file *pDbFd, const char *zWalName,int bNoShm, i64 mxWalSize, Wal **ppWal) { MDB_val key, data; int rc; #if ATOMIC db_thread *thr = g_tsd_thread; db_connection *conn = g_tsd_conn; #else db_thread* thr = enif_tsd_get(g_tsd_thread); db_connection* conn = enif_tsd_get(g_tsd_conn); #endif mdbinf * const mdb = &thr->mdb; Wal *pWal = &conn->wal; MDB_dbi actorsdb, infodb; MDB_txn *txn = mdb->txn; int offset = 0, cutoff = 0, nmLen = 0; actorsdb = mdb->actorsdb; infodb = mdb->infodb; if (zWalName[0] == '/') offset = 1; nmLen = strlen(zWalName+offset); if (zWalName[offset+nmLen-1] == 'l' && zWalName[offset+nmLen-2] == 'a' && zWalName[offset+nmLen-3] == 'w' && zWalName[offset+nmLen-4] == '-') cutoff = 4; DBG("Wal name=%s %lld",zWalName,(i64)txn); // shorten size to ignore "-wal" at the end key.mv_size = nmLen-cutoff; key.mv_data = (void*)(zWalName+offset);//thr->curConn->dbpath; rc = mdb_get(txn,actorsdb,&key,&data); // This is new actor, assign an index if (rc == MDB_NOTFOUND) { i64 index = 0; // MDB_val key1 = {1,(void*)"?"}; #ifndef _TESTAPP_ qitem *item; db_command *cmd; item = command_create(conn->wthreadind,-1,g_pd); cmd = (db_command*)item->cmd; cmd->type = cmd_actorsdb_add; #if ATOMIC index = atomic_fetch_add_explicit(&g_pd->actorIndexes[thr->nEnv], 1, memory_order_relaxed); #else enif_mutex_lock(g_pd->actorIndexesMtx[thr->nEnv]); index = g_pd->actorIndexes[thr->nEnv]++; enif_mutex_unlock(g_pd->actorIndexesMtx[thr->nEnv]); #endif pWal->index = index; cmd->arg = enif_make_string(item->env,zWalName,ERL_NIF_LATIN1); cmd->arg1 = enif_make_uint64(item->env, index); push_command(conn->wthreadind, -1, g_pd, item); #else if (thr->isreadonly) { return SQLITE_ERROR; } else { #if ATOMIC char filename[MAX_PATHNAME]; sprintf(filename,"%.*s",(int)(nmLen-cutoff),zWalName+offset); index = atomic_fetch_add_explicit(&g_pd->actorIndexes[thr->nEnv], 1, memory_order_relaxed); pWal->index = index; if (register_actor(index, filename) != SQLITE_OK) return SQLITE_ERROR; #else return SQLITE_ERROR; #endif } #endif } // Actor exists, read evnum/evterm info else if (rc == MDB_SUCCESS) { // data contains index key = data; pWal->index = *(i64*)data.mv_data; DBG("Actor at index %lld",pWal->index); rc = mdb_get(txn,infodb,&key,&data); if (rc == MDB_SUCCESS) { if (*(u8*)data.mv_data != 1) { return SQLITE_ERROR; } memcpy(&pWal->firstCompleteTerm, ((u8*)data.mv_data)+1, sizeof(u64)); memcpy(&pWal->firstCompleteEvnum,((u8*)data.mv_data)+1+sizeof(u64), sizeof(u64)); memcpy(&pWal->lastCompleteTerm, ((u8*)data.mv_data)+1+sizeof(u64)*2, sizeof(u64)); memcpy(&pWal->lastCompleteEvnum, ((u8*)data.mv_data)+1+sizeof(u64)*3, sizeof(u64)); memcpy(&pWal->inProgressTerm, ((u8*)data.mv_data)+1+sizeof(u64)*4, sizeof(u64)); memcpy(&pWal->inProgressEvnum, ((u8*)data.mv_data)+1+sizeof(u64)*5, sizeof(u64)); memcpy(&pWal->mxPage, ((u8*)data.mv_data)+1+sizeof(u64)*6, sizeof(u32)); memcpy(&pWal->allPages, ((u8*)data.mv_data)+1+sizeof(u64)*6+sizeof(u32),sizeof(u32)); pWal->readSafeTerm = pWal->lastCompleteTerm; pWal->readSafeEvnum = pWal->lastCompleteEvnum; pWal->readSafeMxPage = pWal->mxPage; // if (pWal->inProgressTerm != 0) // { // doundo(pWal,NULL,NULL,1); // } } else if (rc == MDB_NOTFOUND) { // DBG("Info for actor not found")); } } else { DBG("Error open=%d",rc); thr->forceCommit = 2; return SQLITE_ERROR; } conn->changed = 1; if (ppWal != NULL) (*ppWal) = pWal; return SQLITE_OK; }