spx_private err_t spx_thread_context_free(void **arg){/*{{{*/ struct spx_thread_context **tc = (struct spx_thread_context **) arg; ev_break((*tc)->loop,EVBREAK_ALL); ev_loop_destroy((*tc)->loop); SpxClose((*tc)->pipe[0]); SpxClose((*tc)->pipe[1]); SpxFree(*tc); return 0; }/*}}}*/
spx_private err_t spx_nio_thread_context_free(void **arg){ struct spx_nio_thread_context **context = (struct spx_nio_thread_context **) arg; ev_break((*context)->loop,EVBREAK_ALL); ev_loop_destroy((*context)->loop); SpxClose((*context)->pipe[0]); SpxClose((*context)->pipe[1]); SpxFree(*context); return 0; }
spx_private err_t ydb_storage_query_remote(SpxLogDelegate *log, struct ydb_tracker *t,string_t groupname, string_t machineid,string_t syncgroup){/*{{{*/ err_t err = 0; struct spx_job_context *sjc = t->sjc; int fd = spx_socket_new(&err); if(0 >= fd){ SpxLog2(log,SpxLogError,err,"create query sync socket fd is fail."); return err; } if(0 != (err = spx_set_nb(fd))){ SpxLog2(log,SpxLogError,err,"set socket nonblacking is fail."); goto r1; } if(0 != (err = spx_socket_set(fd,SpxKeepAlive,SpxAliveTimeout,\ SpxDetectTimes,SpxDetectTimeout,\ SpxLinger,SpxLingerTimeout,\ SpxNodelay,\ true,30))){ SpxLog2(log,SpxLogError,err,"set socket operator is fail."); goto r1; } if(0 != (err = spx_socket_connect(fd,t->host.ip,t->host.port))){ SpxLogFmt2(log,SpxLogError,err,\ "conntect to tracker:%s:%d is fail.",\ t->host.ip,t->host.port); goto r1; } struct spx_msg_header *writer_header = NULL; writer_header = spx_alloc_alone(sizeof(*writer_header),&err); if(NULL == writer_header){ SpxLog2(log,SpxLogError,err,\ "alloc writer header is fail."); goto r1; } sjc->writer_header = writer_header; writer_header->version = YDB_VERSION; writer_header->protocol = YDB_QUERY_SYNC_STORAGES; writer_header->bodylen = YDB_GROUPNAME_LEN + YDB_MACHINEID_LEN \ + YDB_SYNCGROUP_LEN ; struct spx_msg *ctx = spx_msg_new(writer_header->bodylen,&err); if(NULL == ctx){ SpxLog2(log,SpxLogError,err,\ "alloc writer body is fail."); goto r1; } sjc->writer_body_ctx = ctx; spx_msg_pack_fixed_string(ctx,groupname,YDB_GROUPNAME_LEN); spx_msg_pack_fixed_string(ctx,machineid,YDB_MACHINEID_LEN); spx_msg_pack_fixed_string(ctx,syncgroup,YDB_SYNCGROUP_LEN); sjc->fd = fd; spx_nio_regedit_writer(sloop,sjc->fd,sjc); return err; r1: SpxClose(fd); return err; }/*}}}*/
spx_private void CloseCTX(struct server_context *ctx){ if (NULL == ctx){ printf("ctx is NULL\n"); return; } SpxClose(ctx->fd); CTXPush(ctx); }
spx_private void idcreatorServerContextClear(struct IdcreatorServerContext *isc){/*{{{*/ if(NULL != isc->client_ip){ SpxStringFree(isc->client_ip); } isc->err = 0; isc->moore = SpxNioMooreNormal; isc->loop = NULL; memset(isc->inbuf,0,SpxMsgHeaderSize + sizeof(i32_t)); memset(isc->outbuf,0,SpxMsgHeaderSize + sizeof(u64_t)); memset(&(isc->inheader),0,sizeof(isc->inheader)); memset(&(isc->outheader),0,sizeof(isc->outheader)); isc->offset = 0; if(0 < isc->fd){ SpxClose(isc->fd); } }/*}}}*/
spx_private void * CreateMainSocket(void *arg){/*{{{*/ struct server_config * conf = (struct server_config *) arg; SpxLogDelegate *log = conf->log; err_t err = 0; main_socket_loop = ev_loop_new(0); if(NULL == main_socket_loop){ SpxLog2(log, SpxLogError, err, "create main socket loop is fail."); goto r1; } int mainsocket = spx_socket_new(&err); if(0 == mainsocket){ SpxLog2(log, SpxLogError, err, "create main socket is fail."); goto r1; } if( 0 != (err = spx_set_nb(mainsocket))){ SpxLog2(log, SpxLogError, err, "set main socket nonblock is fail."); } if( 0 != (err = spx_socket_start(mainsocket, conf->ip, conf->port,\ true, conf->timeout,\ 3, conf->timeout,\ false, 0,\ true,\ true, conf->timeout, 1024))){ SpxLog2(log, SpxLogError, err, "start main socket is fail."); goto r1; } SpxLogFmt1(log, SpxLogMark, "main socket fd: %d" "and accepting...", mainsocket); RegisterIOWatcher(&monitor_watcher, mainsocket, Reciver, EV_READ, log); ev_io_start(main_socket_loop, &monitor_watcher); ev_run(main_socket_loop, 0); r1: SpxClose(mainsocket); return NULL; }/*}}}*/
err_t ydb_storage_dio_delete_context_from_chunkfile( struct ydb_storage_configurtion *c, string_t fname, u64_t cbegin, u64_t ctotalsize, u32_t copver, u32_t cver, u64_t clastmodifytime, u64_t crealsize, u64_t lastmodifytime){/*{{{*/ err_t err = 0; struct spx_msg *ioctx = NULL; int fd = 0; char *mptr = NULL; string_t io_suffix = NULL; string_t io_hashcode = NULL; bool_t io_isdelete = false; u32_t io_opver = 0; u32_t io_ver = 0; u64_t io_createtime = 0; u64_t io_lastmodifytime = 0; u64_t io_totalsize = 0; u64_t io_realsize = 0; u32_t unit = (int) cbegin / c->pagesize; u64_t begin = unit * c->pagesize; u64_t offset = cbegin - begin; u64_t len = offset + ctotalsize; fd = open(fname,O_RDWR,SpxFileMode); if(0 == fd){ err = errno; SpxLogFmt2(c->log,SpxLogError,err,\ "open chunkfile:%s is fail.", fname); goto r1; } mptr = mmap(NULL,\ len,PROT_READ | PROT_WRITE ,\ MAP_SHARED,fd,begin); if(MAP_FAILED == mptr){ err = errno; SpxLogFmt2(c->log,SpxLogError,err,\ "mmap chunkfile:%s with begin:%lld,length:%lld is fail.", fname,begin,len); goto r1; } ioctx = spx_msg_new(YDB_CHUNKFILE_MEMADATA_SIZE,&err); if(NULL == ioctx){ SpxLog2(c->log,SpxLogError,err,\ "alloc metedata ioctx is fail."); goto r1; } if(0 != (err = spx_msg_pack_ubytes(ioctx, ((ubyte_t *) (mptr+ offset)), YDB_CHUNKFILE_MEMADATA_SIZE))){ SpxLog2(c->log,SpxLogError,err,\ "read metedata to ioctx is fail."); goto r1; } spx_msg_seek(ioctx,0,SpxMsgSeekSet); err = ydb_storage_dio_parser_metadata(c->log,ioctx, &io_isdelete,&io_opver, &io_ver,&io_createtime, &io_lastmodifytime,&io_totalsize,&io_realsize, &io_suffix,&io_hashcode); if(0 != err){ SpxLog2(c->log,SpxLogError,err,\ "unpack metedate ioctx is fail."); goto r1; } if(io_isdelete){ SpxLogFmt1(c->log,SpxLogError, "the file in the chunkfile:%s " "with begin:%lld totalsize:%lld is deleted.", fname,cbegin,ctotalsize); err = ENOENT; goto r1; } if(copver != io_opver || cver != io_ver || clastmodifytime != io_lastmodifytime || ctotalsize != io_totalsize || crealsize != io_realsize){ SpxLogFmt1(c->log,SpxLogError, "the file in the chunkfile:%s " "with begin:%lld totalsize:%lld is not the deleting-file.", fname,cbegin,ctotalsize); err = ENOENT; goto r1; } spx_msg_seek(ioctx,0,SpxMsgSeekSet); spx_msg_pack_true(ioctx);//isdelete spx_msg_pack_u32(ioctx,copver + 1); spx_msg_pack_u32(ioctx,YDB_VERSION); spx_msg_seek(ioctx,sizeof(u64_t),SpxMsgSeekCurrent);//jump createtime spx_msg_pack_u64(ioctx,lastmodifytime); memcpy(mptr + offset,ioctx->buf,YDB_CHUNKFILE_MEMADATA_SIZE); r1: if(NULL != ioctx){ SpxMsgFree(ioctx); } if(NULL != mptr){ munmap(mptr,len); } if(0 < fd){ SpxClose(fd); } if(NULL != io_hashcode){ SpxStringFree(io_hashcode); } if(NULL != io_suffix){ SpxStringFree(io_suffix); } return err; }/*}}}*/
spx_private void CloseCTX(struct server_context *ctx){ SpxClose(ctx->fd); CTXPush(ctx); }