Esempio n. 1
0
File: spx_io.c Progetto: alxbean/dfs
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;
}/*}}}*/
Esempio n. 2
0
File: spx_io.c Progetto: alxbean/dfs
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;
}/*}}}*/
Esempio n. 3
0
File: spx_io.c Progetto: alxbean/dfs
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;
}/*}}}*/
Esempio n. 4
0
File: spx_io.c Progetto: alxbean/dfs
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;
}/*}}}*/
Esempio n. 5
0
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;
}/*}}}*/