Exemple #1
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;
}/*}}}*/
Exemple #2
0
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;
}/*}}}*/
Exemple #3
0
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;
}/*}}}*/
Exemple #4
0
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;
}/*}}}*/
Exemple #5
0
struct spx_msg *spx_header_to_msg(struct spx_msg_header *header,size_t len,err_t *err){/*{{{*/
    if(NULL == header){
        *err = EINVAL;
        return NULL;
    }
    struct spx_msg *ctx = spx_msg_new(len,err);
    if(NULL == ctx){
        return NULL;
    }
    spx_msg_pack_u32(ctx,header->version);
    spx_msg_pack_u32(ctx,header->protocol);
    spx_msg_pack_u64(ctx,header->bodylen);
    spx_msg_pack_u64(ctx,header->offset);
    if(header->is_keepalive){
        spx_msg_pack_true(ctx);
    } else {
        spx_msg_pack_false(ctx);
    }
    spx_msg_pack_u32(ctx,header->err);
    return ctx;
}/*}}}*/
Exemple #6
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;
}/*}}}*/