struct spx_msg_header *spx_read_header_nb(SpxLogDelegate *log,int fd,err_t *err){/*{{{*/ size_t len = 0; struct spx_msg *hbuff = spx_msg_new(SpxMsgHeaderSize,err); if(NULL == hbuff){ SpxLog2(log,SpxLogError,*err, "new msg-ctx for header is fail."); return NULL; } *err = spx_read_to_msg_nb(fd,hbuff,SpxMsgHeaderSize,&len); if(0 != *err){ SpxLogFmt2(log,SpxLogError,*err, "recv header buff:%d,realsize:%d.", SpxMsgHeaderSize,len); SpxMsgFree(hbuff); return NULL; } struct spx_msg_header *h = spx_msg_to_header(hbuff,err); if(NULL == h){ SpxLog2(log,SpxLogError,*err, "convert msg-ctx to header is fail."); SpxMsgFree(hbuff); return NULL; } return h; }/*}}}*/
err_t spx_lazy_recv_nb(SpxLogDelegate *log,int fd,int sock,size_t size){/*{{{*/ err_t err = 0; size_t len = 0; struct spx_msg *ctx = spx_msg_new(SpxKB,&err); if(NULL == ctx){ SpxLogFmt2(log,SpxLogError,err, "alloc msg for lazy recv is fail.msg size:%lld.", SpxKB); return err; } size_t totalsize = SpxMax(size,SpxKB); size_t recvbytes = 0; while(recvbytes < totalsize){ size_t recvs = SpxMin(SpxKB,(totalsize - recvbytes)); err = spx_read_to_msg_nb(sock,ctx,recvs,&len); if(0 != err ){ SpxLogFmt2(log,SpxLogError,err, "lazy recv is fail.recvsize:%lld,realsize:%lld,writed size:%lld.", recvs,len,recvbytes); break; } len = 0; err = spx_write_from_msg_nb(fd,ctx,recvs,&len); if(0 != err ){ SpxLogFmt2(log,SpxLogError,err, "write by lazy recv is fail.recvsize:%lld,realsize:%lld,writed size:%lld.", recvs,len,recvbytes); break; } recvbytes += recvs; spx_msg_clear(ctx); } SpxMsgFree(ctx); return err; }/*}}}*/
err_t spx_write_context_nb(SpxLogDelegate *log,int fd,struct spx_msg_context *ctx){/*{{{*/ err_t err = 0; size_t len = 0; struct spx_msg *hctx = spx_header_to_msg(ctx->header,SpxMsgHeaderSize,&err); if(NULL == hctx){ SpxLog2(log,SpxLogError,err, "header convert to msg-ctx is fail."); return err; } err = spx_write_from_msg_nb(fd,hctx,SpxMsgHeaderSize,&len); if(0 != err) { SpxLogFmt2(log,SpxLogError,err, "write header size:%lld,realsize:%lld.", SpxMsgHeaderSize,len); goto r1; } len = 0; if(ctx->is_sendfile){ err = spx_write_from_msg_nb(fd,ctx->body,ctx->header->offset,&len); if(0 != err){ SpxLogFmt2(log,SpxLogError,err, "write leading-date of body buffer:%lld,realsize:%lld.", ctx->header->offset,len); goto r1; } len = 0; err = spx_sendfile(fd,ctx->sendfile_fd,ctx->sendfile_begin,ctx->sendfile_size,&len); if(0 != err ){ SpxLogFmt2(log,SpxLogError,err, "sendfile size:%lld,realsize:%lld.", ctx->sendfile_size,len); goto r1; } } else { err = spx_write_from_msg_nb(fd,ctx->body,ctx->header->bodylen,&len); if(0 != err ){ SpxLogFmt2(log,SpxLogError,err, "write body buffer:%lld,realsize:%lld.", ctx->header->bodylen,len); goto r1; } } r1: if(NULL != hctx){ SpxMsgFree(hctx); } return err; }/*}}}*/
struct spx_msg *spx_read_body_nb(SpxLogDelegate *log,int fd,size_t size,err_t *err){/*{{{*/ size_t len = 0; struct spx_msg *ctx = spx_msg_new(size,err); if(NULL == ctx){ SpxLog2(log,SpxLogError,*err, "new msg-ctx for header is fail."); return NULL; } *err = spx_read_to_msg_nb(fd,ctx,size,&len); if(0 != *err){ SpxLogFmt2(log,SpxLogError,*err, "read body buffer:%lld realsize:%lld.", size,len); SpxMsgFree(ctx); return NULL; } return ctx; }/*}}}*/
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; }/*}}}*/