#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; }/*}}}*/
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); }/*}}}*/
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; }/*}}}*/
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; }/*}}}*/
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; }
#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; }/*}}}*/
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; }