Exemplo n.º 1
0
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#include "spx_alloc.h"
#include "spx_errno.h"
#include "spx_message.h"
#include "spx_types.h"
#include "spx_string.h"
#include "spx_defs.h"

union d2i{
    double v;
    uint64_t i;
};

union f2i{
    float v;
    uint32_t i;
};


struct spx_msg *spx_msg_new(const size_t len,err_t *err){/*{{{*/
    if (0 == len){
        *err = EINVAL;
        return NULL;
    }
    struct spx_msg *ctx = spx_alloc_alone(sizeof(*ctx),err);
    if(NULL == ctx){
        return NULL;
    }
    ctx->buf = spx_alloc_alone(len ,err);
    if(NULL == ctx->buf){
        goto r1;
    }
    ctx->last = ctx->buf;
    ctx->s = len;
    ctx->busylen = 0;
    return ctx;
r1:
    SpxFree(ctx);
    return NULL;
}/*}}}*/

err_t spx_msg_free(struct spx_msg **ctx){/*{{{*/
    if(NULL != (*ctx)->buf){
        SpxFree((*ctx)->buf);
    }
    (*ctx)->last = NULL;
    (*ctx)->s = 0;
    SpxFree(*ctx);
    return 0;
}/*}}}*/

err_t spx_msg_seek(struct spx_msg *ctx,off_t offset,int whence){
    if(NULL == ctx || NULL == ctx->buf){
        return EINVAL;
    }
    switch(whence){
        case SpxMsgSeekSet :{
                                ctx->last =(uchar_t *) SpxMemIncr(ctx->buf,offset);
                                break;
                            }
        case SpxMsgSeekCurrent:{
                                   ctx->last =(uchar_t *) SpxMemIncr(ctx->last,offset);
                                   break;
                               }
        case SpxMsgSeekEnd:{
                               ctx->last =(uchar_t *) SpxMemIncr(ctx->buf,spx_msg_size(ctx) + offset);
                               break;
                           }
    }
    return 0;
}

void spx_msg_peek(struct spx_msg *ctx,off_t off){
    ctx->last = (uchar_t*) (ctx->buf + off);
}
    void spx_msg_front(struct spx_msg *ctx){
        ctx->last = ctx->buf;
    }

err_t spx_msg_align(struct spx_msg *ctx,off_t offset){
    return spx_msg_seek(ctx,offset,SpxMsgSeekCurrent);
}

void spx_msg_clear(struct spx_msg *ctx){
    SpxZeroLen(ctx->buf,ctx->s);
    ctx->last = ctx->buf;
    ctx->busylen = 0;
    ctx->err = 0;
}


err_t spx_msg_pack_int( struct spx_msg *ctx,const int v){/*{{{*/
    return spx_msg_pack_i32(ctx,(i32_t) v);
}/*}}}*/

err_t spx_msg_pack_i8(struct spx_msg *ctx,const i8_t v){/*{{{*/
    if(NULL == ctx) return EINVAL;
    *(ctx->last) = (char) v;
    (ctx->last)++;
    ctx->busylen++;
    return 0;
}/*}}}*/

err_t spx_msg_pack_i32( struct spx_msg *ctx,const i32_t v){/*{{{*/
    if(NULL == ctx) return EINVAL;
    spx_msg_i2b(ctx->last,v);
    (ctx->last) += sizeof(i32_t);
    ctx->busylen += sizeof(i32_t);
    return 0;
}/*}}}*/

err_t spx_msg_pack_i64( struct spx_msg *ctx,const i64_t v) {/*{{{*/
    if (NULL == ctx) return EINVAL;
    spx_msg_l2b(ctx->last,v);
    (ctx->last) += sizeof(i64_t);
    ctx->busylen += sizeof(i64_t);
    return 0;
}/*}}}*/
err_t spx_msg_pack_u8( struct spx_msg *ctx,const u8_t v){/*{{{*/
    if (NULL == ctx) return EINVAL;
    *(ctx->last) = (uchar_t) v;
    (ctx->last)++;
    ctx->busylen ++;
    return 0;
}/*}}}*/
err_t spx_msg_pack_u32( struct spx_msg *ctx,const u32_t v){/*{{{*/
    if(NULL == ctx) return EINVAL;
    spx_msg_i2b(ctx->last,(i32_t) v);
    (ctx->last) += sizeof(u32_t);
    ctx->busylen += sizeof(u32_t);
    return 0;
}/*}}}*/
err_t spx_msg_pack_u64( struct spx_msg *ctx,const u64_t v){/*{{{*/
    if(NULL == ctx) return EINVAL;
    spx_msg_l2b(ctx->last,(i64_t) v);
    (ctx->last) += sizeof(u64_t);
    ctx->busylen += sizeof(u64_t);
    return 0;
}/*}}}*/
err_t spx_msg_pack_double( struct spx_msg *ctx,const double v){/*{{{*/
    if (NULL == ctx) return EINVAL;
    union d2i n;
    SpxZero(n);
    n.v = v;
    spx_msg_l2b(ctx->last,n.i);
    (ctx->last) += sizeof(n.i);
    (ctx->busylen) += sizeof(n.i);
    return 0;
}/*}}}*/
err_t spx_msg_pack_float( struct spx_msg *ctx,const float v){/*{{{*/
    if (NULL == ctx) return EINVAL;
    union f2i n;
    SpxZero(n);
    n.v = v;
    spx_msg_i2b(ctx->last,n.i);
    (ctx->last) += sizeof(n.i);
    (ctx->busylen) += sizeof(n.i);
    return 0;
}/*}}}*/
err_t spx_msg_pack_true( struct spx_msg *ctx){/*{{{*/
    if (NULL == ctx) return EINVAL;
    *(ctx->last) = (uchar_t) true;
    (ctx->last)++;
    ctx->busylen ++;
    return 0;
}/*}}}*/
err_t spx_msg_pack_false( struct spx_msg *ctx){/*{{{*/
    if (NULL == ctx) return EINVAL;
    *(ctx->last) = (uchar_t) false;
    (ctx->last)++;
    ctx->busylen ++;
    return 0;
}/*}}}*/
err_t spx_msg_pack_string( struct spx_msg *ctx,string_t s){/*{{{*/
    if (NULL == ctx) return EINVAL;
    ctx->last = SpxMemcpy(ctx->last,s,spx_string_len(s));
    ctx->busylen += spx_string_len(s);
    return 0;
}/*}}}*/
err_t spx_msg_pack_fixed_string( struct spx_msg *ctx,string_t s,size_t len){/*{{{*/
    if (NULL == ctx) return EINVAL;
    ctx->last = SpxMemcpy(ctx->last,s,spx_string_len(s));
    ctx->last += len - spx_string_len(s);
    ctx->busylen += len;
    return 0;
}/*}}}*/
Exemplo n.º 2
0
spx_private void ydb_storage_syncquery_nio_body_reader(int fd,
        struct spx_job_context *jc){/*{{{*/
    spx_nio_reader_body_handler(fd,jc);
    if(ENOENT == jc->err){
        SpxLog1(jc->log,SpxLogWarn,\
                "not find out the sync storages.");
        goto r1;
    }

    if(0 != jc->err){

        SpxLog2(jc->log,SpxLogError,jc->err,\
                "recv the regedit response is fail.");
        goto r1;
    }

    struct spx_msg *ctx = jc->reader_body_ctx;
    if(NULL == ctx){
        SpxLog2(jc->log,SpxLogError,jc->err,\
                "no recved the body ctx.");
        goto r1;
    }

    struct ydb_storage_slave *s = NULL;
     size_t unit_size = YDB_MACHINEID_LEN + SpxIpv4Size
                        + SpxI32Size + SpxI32Size;
     size_t numbs = jc->reader_header->bodylen / unit_size;
     size_t i = 0;
     for( ; i < numbs; i++){
        string_t machineid = spx_msg_unpack_string(ctx,YDB_MACHINEID_LEN,&(jc->err));
        string_t ip = spx_msg_unpack_string(ctx,SpxIpv4Size,&(jc->err));
        i32_t port = spx_msg_unpack_i32(ctx);
        u32_t status = spx_msg_unpack_u32(ctx);
        spx_map_get(g_ydb_storage_slaves,machineid,spx_string_len(machineid),\
                (void **) &s,NULL);
        if(NULL == s){
            s = spx_alloc_alone(sizeof(*s),&(jc->err));
            if(NULL == s){
                continue;
            }
            s->state = status;
            s->machineid = machineid;
            s->host.port = port;
            s->host.ip = ip;
            spx_map_insert(g_ydb_storage_slaves,machineid,spx_string_len(machineid),
                    s,sizeof(s));
        }
        if(port != s->host.port){
            s->host.port = port;
        }
        if(0 != spx_string_casecmp_string(machineid,s->machineid)){
            spx_string_free(s->machineid);
            s->machineid = machineid;
        }
        s->state = status;

     }
r1:
    spx_job_context_clear(jc);
}/*}}}*/
Exemplo n.º 3
0
spx_private u32_t logdb_tracker_configurtion_timespan_convert(
        SpxLogDelegate *log,string_t v,u32_t default_unitsize,
        char *errinfo,err_t *err){/*{{{*/
    u64_t size = strtoul(v,NULL,10);
    if(ERANGE == size) {
        SpxLog1(log,SpxLogError,\
                errinfo);
        *err = size;
        return 0;
    }
    string_t unit = spx_string_range_new(v,\
            -2,spx_string_len(v),err);
    if(NULL == unit){
        size *= default_unitsize;
    }
    if(0 == spx_string_casecmp(unit,"D")){
        size *= SpxDayTick;
    }
    else if( 0 == spx_string_casecmp(unit,"H")){
        size *= SpxHourTick;
    }else if(0 == spx_string_casecmp(unit,"M")){
        size *= SpxMinuteTick;
    }else if(0 == spx_string_casecmp(unit,"S")){
        size *= SpxSecondTick;
    }else {
        size *= default_unitsize;
    }
    spx_string_free(unit);
    return size;
}/*}}}*/
Exemplo n.º 4
0
spx_private u64_t logdb_tracker_configurtion_iosize_convert(
        SpxLogDelegate *log,string_t v,u32_t default_unitsize,
        char *errinfo,err_t *err){/*{{{*/
    u64_t size = strtoul(v,NULL,10);
    if(ERANGE == size) {
        SpxLog1(log,SpxLogError,\
                errinfo);
        *err = size;
        return 0;
    }
    string_t unit = spx_string_range_new(v,\
            -2,spx_string_len(v),err);
    if(NULL == unit){
        size *= default_unitsize;
    }
    if(0 == spx_string_casecmp(unit,"GB")){
        size *= SpxGB;
    }
    else if( 0 == spx_string_casecmp(unit,"MB")){
        size *= SpxMB;
    }else if(0 == spx_string_casecmp(unit,"KB")){
        size *= SpxKB;
    }else {
        size *= default_unitsize;
    }
    spx_string_free(unit);
    return size;
}/*}}}*/
Exemplo n.º 5
0
int main(int argc,char **argv){
    err_t err = 0;
    SpxLogDelegate *log = spx_log;
    struct spx_map *map = spx_map_new(log,\
            spx_pjw,
            spx_collection_string_default_cmper,
            NULL,
            spx_map_free,
            spx_map_free,
            &err);
    if(NULL == map){
        return err;
    }

    string_t aaa = spx_string_new("aaa",&err);
    string_t bbb = spx_string_new("bbb",&err);
    string_t ccc = spx_string_new("ccc",&err);
    string_t ddd = spx_string_new("ddd",&err);
    err = spx_map_insert(map,aaa,spx_string_len(aaa),\
            aaa,spx_string_len(aaa));
    err = spx_map_insert(map,bbb,spx_string_len(bbb),\
            bbb,spx_string_len(bbb));
    err = spx_map_insert(map,ccc,spx_string_len(ccc),\
            ccc,spx_string_len(ccc));
    err = spx_map_insert(map,ddd,spx_string_len(ddd),\
            ddd,spx_string_len(ddd));

    string_t newaaa,newbbb,newccc,newddd;
    size_t newalen,newblen,newclen,newdlen;

    err = spx_map_get(map,aaa,spx_string_len(aaa),(void **) &newaaa,&newalen);
    err = spx_map_get(map,aaa,spx_string_len(bbb),(void **) &newbbb,&newblen);
    err = spx_map_get(map,aaa,spx_string_len(ccc),(void **) &newccc,&newclen);
    err = spx_map_get(map,aaa,spx_string_len(ddd),(void **) &newddd,&newdlen);

    err = spx_map_out(map,aaa,spx_string_len(aaa),(void **) &newaaa,&newalen);
    err = spx_map_out(map,aaa,spx_string_len(bbb),(void **) &newbbb,&newblen);

    err = spx_map_delete(map,ccc,spx_string_len(ccc));
    err = spx_map_delete(map,ddd,spx_string_len(ddd));

    err = spx_map_insert(map,aaa,spx_string_len(aaa),\
            aaa,spx_string_len(aaa));
    err = spx_map_insert(map,bbb,spx_string_len(bbb),\
            bbb,spx_string_len(bbb));
    err = spx_map_insert(map,ccc,spx_string_len(ccc),\
            ccc,spx_string_len(ccc));
    err = spx_map_insert(map,ddd,spx_string_len(ddd),\
            ddd,spx_string_len(ddd));

    struct spx_map_iter *iter = spx_map_iter_new(map,&err);
    struct spx_map_node *node = NULL;
    while(NULL != (node = spx_map_iter_next(iter,&err))){
        string_t ks = node->k;
        size_t kl = node->kl;
        string_t vs = node->v;
        size_t vl = node->vl;
        printf("key:%s,key size:%lld,value:%s,value size:%lld.",\
                ks,(long long)kl,vs,(long long)vl);
    }
    err = spx_map_iter_destory(&iter);

    err = spx_map_destory(&map);
    return 0;
}
Exemplo n.º 6
0
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#include "spx_alloc.h"
#include "spx_errno.h"
#include "spx_message.h"
#include "spx_types.h"
#include "spx_string.h"
#include "spx_defs.h"

union d2i{
    double v;
    uint64_t i;
};

union f2i{
    float v;
    uint32_t i;
};


struct spx_msg *spx_msg_new(const size_t len,err_t *err){/*{{{*/
    if (0 == len){
        *err = EINVAL;
        return NULL;
    }
    struct spx_msg *ctx = spx_alloc_alone(sizeof(*ctx),err);
    if(NULL == ctx){
        return NULL;
    }
    ctx->buf = spx_alloc_alone(len ,err);
    if(NULL == ctx->buf){
        goto r1;
    }
    ctx->last = ctx->buf;
    ctx->s = len;
    ctx->busylen = 0;
    return ctx;
r1:
    SpxFree(ctx);
    return NULL;
}/*}}}*/

err_t spx_msg_free(struct spx_msg **ctx){/*{{{*/
    if(NULL != (*ctx)->buf){
        SpxFree((*ctx)->buf);
    }
    (*ctx)->last = NULL;
    (*ctx)->s = 0;
    SpxFree(*ctx);
    return 0;
}/*}}}*/

err_t spx_msg_seek(struct spx_msg *ctx,off_t offset,int whence){
    if(NULL == ctx || NULL == ctx->buf){
        return EINVAL;
    }
    switch(whence){
        case SpxMsgSeekSet :{
                                ctx->last =(uchar_t *) SpxMemIncr(ctx->buf,offset);
                                break;
                            }
        case SpxMsgSeekCurrent:{
                                   ctx->last =(uchar_t *) SpxMemIncr(ctx->last,offset);
                                   break;
                               }
        case SpxMsgSeekEnd:{
                               ctx->last =(uchar_t *) SpxMemIncr(ctx->buf,spx_msg_size(ctx) + offset);
                               break;
                           }
    }
    return 0;
}

void spx_msg_peek(struct spx_msg *ctx,off_t off){
    ctx->last = (uchar_t*) (ctx->buf + off);
}
    void spx_msg_front(struct spx_msg *ctx){
        ctx->last = ctx->buf;
    }

err_t spx_msg_align(struct spx_msg *ctx,off_t offset){
    return spx_msg_seek(ctx,offset,SpxMsgSeekCurrent);
}

void spx_msg_clear(struct spx_msg *ctx){
    SpxZeroLen(ctx->buf,ctx->s);
    ctx->last = ctx->buf;
    ctx->busylen = 0;
    ctx->err = 0;
}


err_t spx_msg_pack_int( struct spx_msg *ctx,const int v){/*{{{*/
    return spx_msg_pack_i32(ctx,(i32_t) v);
}/*}}}*/

err_t spx_msg_pack_i8(struct spx_msg *ctx,const i8_t v){/*{{{*/
    if(NULL == ctx) return EINVAL;
    *(ctx->last) = (char) v;
    (ctx->last)++;
    ctx->busylen++;
    return 0;
}/*}}}*/

err_t spx_msg_pack_i32( struct spx_msg *ctx,const i32_t v){/*{{{*/
    if(NULL == ctx) return EINVAL;
    spx_msg_i2b(ctx->last,v);
    (ctx->last) += sizeof(i32_t);
    ctx->busylen += sizeof(i32_t);
    return 0;
}/*}}}*/

err_t spx_msg_pack_i64( struct spx_msg *ctx,const i64_t v) {/*{{{*/
    if (NULL == ctx) return EINVAL;
    spx_msg_l2b(ctx->last,v);
    (ctx->last) += sizeof(i64_t);
    ctx->busylen += sizeof(i64_t);
    return 0;
}/*}}}*/
err_t spx_msg_pack_u8( struct spx_msg *ctx,const u8_t v){/*{{{*/
    if (NULL == ctx) return EINVAL;
    *(ctx->last) = (uchar_t) v;
    (ctx->last)++;
    ctx->busylen ++;
    return 0;
}/*}}}*/
err_t spx_msg_pack_u32( struct spx_msg *ctx,const u32_t v){/*{{{*/
    if(NULL == ctx) return EINVAL;
    spx_msg_i2b(ctx->last,(i32_t) v);
    (ctx->last) += sizeof(u32_t);
    ctx->busylen += sizeof(u32_t);
    return 0;
}/*}}}*/
err_t spx_msg_pack_u64( struct spx_msg *ctx,const u64_t v){/*{{{*/
    if(NULL == ctx) return EINVAL;
    spx_msg_l2b(ctx->last,(i64_t) v);
    (ctx->last) += sizeof(u64_t);
    ctx->busylen += sizeof(u64_t);
    return 0;
}/*}}}*/
err_t spx_msg_pack_double( struct spx_msg *ctx,const double v){/*{{{*/
    if (NULL == ctx) return EINVAL;
    union d2i n;
    SpxZero(n);
    n.v = v;
    spx_msg_l2b(ctx->last,n.i);
    (ctx->last) += sizeof(n.i);
    (ctx->busylen) += sizeof(n.i);
    return 0;
}/*}}}*/
err_t spx_msg_pack_float( struct spx_msg *ctx,const float v){/*{{{*/
    if (NULL == ctx) return EINVAL;
    union f2i n;
    SpxZero(n);
    n.v = v;
    spx_msg_i2b(ctx->last,n.i);
    (ctx->last) += sizeof(n.i);
    (ctx->busylen) += sizeof(n.i);
    return 0;
}/*}}}*/
err_t spx_msg_pack_true( struct spx_msg *ctx){/*{{{*/
    if (NULL == ctx) return EINVAL;
    *(ctx->last) = (uchar_t) true;
    (ctx->last)++;
    ctx->busylen ++;
    return 0;
}/*}}}*/
err_t spx_msg_pack_false( struct spx_msg *ctx){/*{{{*/
    if (NULL == ctx) return EINVAL;
    *(ctx->last) = (uchar_t) false;
    (ctx->last)++;
    ctx->busylen ++;
    return 0;
}/*}}}*/
err_t spx_msg_pack_string( struct spx_msg *ctx,string_t s){/*{{{*/
    if (NULL == ctx) return EINVAL;
    ctx->last = SpxMemcpy(ctx->last,s,spx_string_len(s));
    ctx->busylen += spx_string_len(s);
    return 0;
}/*}}}*/
Exemplo n.º 7
0
void logdb_tracker_config_line_parser_handle(string_t line,void *config,err_t *err){
    struct logdb_tracker_configurtion *c = (struct logdb_tracker_configurtion *) config;
    int count = 0;
    string_t *kv = spx_string_splitlen(line,\
            spx_string_len(line),"=",strlen("="),&count,err);
    if(NULL == kv){
        return;
    }

    spx_string_rtrim(*kv," ");
    if(2 == count){
        spx_string_ltrim(*(kv + 1)," ");
    }

    //ip
    if(0 == spx_string_casecmp(*kv,"ip")){
        if(2 == count && !SpxStringIsEmpty(*(kv + 1))){
            if(spx_socket_is_ip(*(kv + 1))){
                c->ip =spx_string_dup(*(kv + 1),err);
                if(NULL == c->ip){
                    SpxLog2(c->log,SpxLogError,*err,\
                            "dup the ip from config operator is fail.");
                }
            } else {
                string_t ip = spx_socket_getipbyname(*(kv + 1),err);
                if(NULL == ip){
                    SpxLogFmt2(c->log,SpxLogError,*err,\
                            "get local ip by hostname:%s is fail.",*(kv + 1));
                    goto r1;
                }
                c->ip = ip;
            }
        } else{
            SpxLog1(c->log,SpxLogWarn,"use the default ip.");
            string_t ip = spx_socket_getipbyname(NULL,err);
            if(NULL == ip){
                SpxLog2(c->log,SpxLogError,*err,\
                        "get local ip by default hostname is fail.");
                goto r1;
            }
            c->ip = ip;
        }
        goto r1;
    }

    //port
    if(0 == spx_string_casecmp(*kv,"port")){
        if(1 == count || SpxStringIsEmpty(*(kv + 1))){
            SpxLogFmt1(c->log,SpxLogWarn,"the port is use default:%d.",c->port);
            goto r1;
        }
        i32_t port = strtol(*(kv + 1),NULL,10);
        if(ERANGE == port) {
            SpxLog1(c->log,SpxLogError,"bad the configurtion item of port.");
            goto r1;
        }
        c->port = port;
        goto r1;
    }

    //timeout
    if(0 == spx_string_casecmp(*kv,"timeout")){
        if(1 == count || SpxStringIsEmpty(*(kv + 1))){
            SpxLogFmt1(c->log,SpxLogWarn,"use default timeout:%d.",c->timeout);
        } else {
            u32_t timeout = logdb_tracker_configurtion_timespan_convert(c->log,*(kv + 1),
                    SpxSecondTick,
                "bad the configurtion item of timeout.",err);
            if(0 != *err) {
                SpxLog1(c->log,SpxLogError,"bad the configurtion item of timeout.");
                goto r1;
            }
            c->timeout = timeout;
        }
        goto r1;
    }

    //waitting
    if(0 == spx_string_casecmp(*kv,"waitting")){
        if(1 == count || SpxStringIsEmpty(*(kv + 1))){
            SpxLogFmt1(c->log,SpxLogWarn,"use default waitting:%d.",c->waitting);
        } else {
            u32_t waitting = logdb_tracker_configurtion_timespan_convert(c->log,*(kv + 1),
                    SpxSecondTick,
                "bad the configurtion item of waitting.",err);
            if(0 != *err) {
                SpxLog1(c->log,SpxLogError,"bad the configurtion item of waitting.");
                goto r1;
            }
            c->waitting = waitting;
        }
        goto r1;
    }

    //trytimes
    if(0 == spx_string_casecmp(*kv,"trytim")){
        if(1 == count || SpxStringIsEmpty(*(kv + 1))){
            SpxLogFmt1(c->log,SpxLogWarn,"the trytimes is use default:%d.",c->trytimes);
            goto r1;
        }
        i32_t trytimes = strtol(*(kv + 1),NULL,10);
        if(ERANGE == trytimes) {
            SpxLog1(c->log,SpxLogError,"bad the configurtion item of trytim.");
            goto r1;
        }
        c->trytimes = trytimes;
        goto r1;
    }

    //daemon
    if(0 == spx_string_casecmp(*kv,"daemon")){
        if(1 == count || SpxStringIsEmpty(*(kv + 1))){
            SpxLogFmt1(c->log,SpxLogWarn,"instance use default daemon:%d.",c->daemon);
        } else {
            string_t s = *(kv + 1);
            if(0 == spx_string_casecmp(s,spx_bool_desc[false])){
                c->daemon = false;
            } else if(0 == spx_string_casecmp(s,spx_bool_desc[true])){
                c->daemon = true;
            } else {
                c->daemon = true;
            }
        }
        goto r1;
    }

    if(0 == spx_string_casecmp(*kv,"stacksize")){
        if(1 == count){
            SpxLogFmt1(c->log,SpxLogWarn,"stacksize use default:%lld.",c->stacksize);
        } else {
            u64_t size = logdb_tracker_configurtion_iosize_convert(
                    c->log,*(kv + 1),SpxKB,
                    "convert stacksize is fail.",err);
            if(0 != *err){
                goto r1;
            }
            c->stacksize = size;
        }
        goto r1;
    }

    //network_module_thread_size
    if(0 == spx_string_casecmp(*kv,"network_module_thread_size")){
        if(1 == count || SpxStringIsEmpty(*(kv + 1))){
            SpxLogFmt1(c->log,SpxLogWarn,"network module thread size use default:%d.",c->network_module_thread_size);
        } else {
            u32_t network_module_thread_size = strtol(*(kv + 1),NULL,10);
            if(ERANGE == network_module_thread_size) {
                SpxLog1(c->log,SpxLogError,"bad the configurtion item of network_module_thread_size.");
                goto r1;
            }
            c->network_module_thread_size = network_module_thread_size;
        }
        goto r1;
    }

    //notifier_module_thread_size
//    if(0 == spx_string_casecmp(*kv,"notifier_module_thread_size")){
//        if(1 == count || SpxStringIsEmpty(*(kv + 1))){
//            SpxLogFmt1(c->log,SpxLogWarn,
//                    "notifier module thread size use default:%d.",c->notifier_module_thread_size);
//        } else {
//            u32_t notifier_module_thread_size = strtol(*(kv + 1),NULL,10);
//            if(ERANGE == notifier_module_thread_size) {
//                SpxLog1(c->log,SpxLogError,"bad the configurtion item of notifier_module_thread_size.");
//                goto r1;
//            }
//            c->notifier_module_thread_size = notifier_module_thread_size;
//        }
//        goto r1;
//    }

    //task_module_thread_size
    if(0 == spx_string_casecmp(*kv,"task_module_thread_size")){
        if(1 == count || SpxStringIsEmpty(*(kv + 1))){
            SpxLogFmt1(c->log,SpxLogWarn,\
                    "task module thread size use default:%d.",c->task_module_thread_size);
        } else {
            u32_t task_module_thread_size = strtol(*(kv + 1),NULL,10);
            if(ERANGE == task_module_thread_size) {
                SpxLog1(c->log,SpxLogError,"bad the configurtion item of task_module_thread_size.");
                goto r1;
            }
            c->task_module_thread_size = task_module_thread_size;
        }
        goto r1;
    }

    //context size
    if(0 == spx_string_casecmp(*kv,"context_size")){
        if(1 == count || SpxStringIsEmpty(*(kv + 1))){
            SpxLogFmt1(c->log,SpxLogWarn,\
                    "context size use default:%d.",c->context_size);
        } else {
            u32_t context_size = strtol(*(kv + 1),NULL,10);
            if(ERANGE == context_size) {
                SpxLog1(c->log,SpxLogError,"bad the configurtion item of context_size.");
                goto r1;
            }
            c->context_size = context_size;
        }
        goto r1;
    }

    //heartbeat
    if(0 == spx_string_casecmp(*kv,"heartbeat")){
        if(1 == count){
            SpxLogFmt1(c->log,SpxLogWarn,\
                    "heartbeat use default:%d.",c->heartbeat);
        } else {
            u32_t heartbeat = logdb_tracker_configurtion_timespan_convert(
                    c->log,*(kv + 1),SpxSecondTick,
                    "bad configurtion item of heartheat.",err);
            if(0 != *err) {
                goto r1;
            }
            c->heartbeat = heartbeat;
        }
        goto r1;
    }

    //basepath
    if(0 == spx_string_casecmp(*kv,"basepath")){
        if(1 == count || SpxStringIsEmpty(*(kv + 1))){
            SpxLog1(c->log,SpxLogError,\
                    "bad the configurtion item of basepath.and basepath is empty.");
            goto r1;
        }
        c->basepath = spx_string_dup(*(kv + 1),err);
        if(NULL == c->basepath){
            SpxLog2(c->log,SpxLogError,*err,\
                    "dup the string for basepath is fail.");
        }
        goto r1;
    }

    //logpath
    if(0 == spx_string_casecmp(*kv,"logpath")){
        if(1 == count || SpxStringIsEmpty(*(kv + 1))){
            c->logpath = spx_string_new("/opt/ydb/log/tracker/",err);
            if(NULL == c->logpath){
                SpxLog2(c->log,SpxLogError,*err,\
                        "alloc default logpath is fail.");
                goto r1;
            }
            SpxLogFmt1(c->log,SpxLogWarn,\
                    "logpath use default:%s.",c->logpath);
        }else {
            c->logpath = spx_string_dup(*(kv + 1),err);
            if(NULL == c->logpath){
                SpxLog2(c->log,SpxLogError,*err,\
                        "dup the string for logpath is fail.");
            }
        }
        goto r1;
    }

    //logprefix
    if(0 == spx_string_casecmp(*kv,"logprefix")){
        if(1 == count || SpxStringIsEmpty(*(kv + 1))){
            c->logprefix = spx_string_new("ydb-tracker",err);
            if(NULL == c->logprefix){
                SpxLog2(c->log,SpxLogError,*err,\
                        "alloc default logprefix is fail.");
                goto r1;
            }
            SpxLogFmt1(c->log,SpxLogWarn,\
                    "logprefix use default:%s.",c->logprefix);
        } else {
            c->logprefix = spx_string_dup(*(kv + 1),err);
            if(NULL == c->logprefix){
                SpxLog2(c->log,SpxLogError,*err,\
                        "dup the string for logprefix is fail.");
            }
        }
        goto r1;
    }

    //logsize
    if(0 == spx_string_casecmp(*kv,"logsize")){
        if(1 == count){
            SpxLogFmt1(c->log,SpxLogWarn,\
                    "logsize use default:%lld.",c->logsize);
        } else {
            u64_t size = logdb_tracker_configurtion_iosize_convert(
                    c->log,*(kv + 1),SpxMB,
                    "convert logsize is fail.",err);
            if(0 != *err){
                goto r1;
            }
            c->logsize = size;
        }
        goto r1;
    }

    //loglevel
    if(0 == spx_string_casecmp(*kv,"loglevel")){
        if(1 == count || SpxStringIsEmpty(*(kv + 1))){
            SpxLogFmt1(c->log,SpxLogWarn,\
                    "loglevel use default:%s",SpxLogDesc[c->loglevel]);
        } else {
            string_t s = *(kv + 1);
            if(0 == spx_string_casecmp(s,"debug")){
                c->loglevel = SpxLogDebug;
            } else if(0 == spx_string_casecmp(s,"info")){
                c->loglevel = SpxLogInfo;
            }else if(0 == spx_string_casecmp(s,"warn")){
                c->loglevel = SpxLogWarn;
            }else if(0 == spx_string_casecmp(s,"error")){
                c->loglevel = SpxLogError;
            } else {
                c->loglevel = SpxLogInfo;
            }
        }
        goto r1;
    }

    //balance
    if(0 == spx_string_casecmp(*kv,"balance")){
        if(1 == count || SpxStringIsEmpty(*(kv + 1))){
            SpxLogFmt1(c->log,SpxLogWarn,\
                    "mountpoint balance use default:%s",\
                    tracker_balance_mode_desc[c->balance]);
            goto r1;
        }
        string_t s = *(kv + 1);
        if(0 == spx_string_casecmp(s,\
                    tracker_balance_mode_desc[YDB_TRACKER_BALANCE_LOOP])){
            c->balance = YDB_TRACKER_BALANCE_LOOP;
        } else if(0 == spx_string_casecmp(s,\
                    tracker_balance_mode_desc[YDB_TRACKER_BALANCE_TURN])){
            c->balance = YDB_TRACKER_BALANCE_TURN;
        }else if(0 == spx_string_casecmp(s,\
                    tracker_balance_mode_desc[YDB_TRACKER_BALANCE_MAXDISK])){
            c->balance = YDB_TRACKER_BALANCE_MAXDISK;
        }else if(0 == spx_string_casecmp(s,\
                    tracker_balance_mode_desc[YDB_TRACKER_BALANCE_MASTER])){
            c->balance = YDB_TRACKER_BALANCE_MASTER;
        } else {
            c->balance = YDB_TRACKER_BALANCE_LOOP;
        }
        goto r1;
    }

    //master
    if(0 == spx_string_casecmp(*kv,"master")){
        if(1 == count || SpxStringIsEmpty(*(kv + 1))){
            SpxLog1(c->log,SpxLogWarn,
                    "disable the master.");
            goto r1;
        }
        c->master = spx_string_dup(*(kv + 1),err);
        if(NULL == c->master){
            SpxLog2(c->log,SpxLogError,*err,\
                    "dup master is fail.");
        }
        goto r1;
    }

r1:
    spx_string_free_splitres(kv,count);
    return;
}