Skip to content

Commit 5947f70

Browse files
committed
muti domains post
1 parent 3b17809 commit 5947f70

File tree

3 files changed

+173
-63
lines changed

3 files changed

+173
-63
lines changed

kdns/src/domain_update.c

Lines changed: 149 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -221,23 +221,36 @@ void doman_msg_slave_process(void){
221221
}
222222
}
223223

224-
static void send_domain_msg_to_master(struct domin_info_update *msg){
224+
static int send_domain_msg_to_master(struct domin_info_update *msg, int tryNum){
225225

226226
unsigned cid_master = get_master_lcore_id();
227227

228228
assert(msg);
229229
int res = rte_ring_enqueue(domian_msg_ring[cid_master],(void *) msg);
230230

231231
if (unlikely(-EDQUOT == res)) {
232+
if (tryNum == 0){
232233
log_msg(LOG_ERR," msg_ring of master lcore %d quota exceeded\n", cid_master);
234+
log_msg(LOG_ERR,"inser domain:%s host :%s err!\n",msg->domain_name, msg->host);
235+
}
236+
free(msg);
237+
return -1;
233238
} else if (unlikely(-ENOBUFS == res)) {
239+
if (tryNum == 0){
234240
log_msg(LOG_ERR," msg_ring of master lcore %d is full\n", cid_master);
241+
log_msg(LOG_ERR,"inser domain:%s host :%s err!\n",msg->domain_name, msg->host);
242+
}
235243
free(msg);
244+
return -1;
236245
} else if (res) {
246+
if (tryNum == 0){
237247
log_msg(LOG_ERR,"unkown error %d for rte_ring_enqueue master lcore %d\n", res,cid_master);
248+
log_msg(LOG_ERR,"inser domain:%s host :%s err!\n",msg->domain_name, msg->host);
249+
}
238250
free(msg);
251+
return -1;
239252
}
240-
return ;
253+
return 0;
241254
}
242255

243256

@@ -248,77 +261,53 @@ static inline int ipv4_address_check(const char *str)
248261
}
249262

250263

251-
static void* domaindata_parse(enum db_action action,struct connection_info_struct *con_info , int * len_response)
252-
{
253-
char * post_ok = strdup("OK\n");
254-
char * parseErr = NULL;
255-
256-
if (action == DOMAN_ACTION_ADD){
257-
log_msg(LOG_INFO,"add data = %s\n",(char *)con_info->uploaddata);
258-
}else{
259-
log_msg(LOG_INFO,"del data = %s\n",(char *)con_info->uploaddata);
260-
}
261-
*len_response = strlen(post_ok);
262-
264+
static struct domin_info_update * do_domaindata_parse(enum db_action action, json_t *json_data){
263265

264266
struct domin_info_update *update = calloc(1,sizeof(struct domin_info_update));
265267
update->action = action;
266268
/* parse json object */
267-
json_error_t jerror;
268269
const char * value ;
269-
json_t *json_response = json_loads(con_info->uploaddata, 0, &jerror);
270-
if (!json_response) {
271-
log_msg(LOG_ERR,"load json string failed: %s %s (line %d, col %d)\n",
272-
jerror.text, jerror.source, jerror.line, jerror.column);
273-
goto parse_err;
274-
}
275-
if (!json_is_object(json_response)) {
276-
log_msg(LOG_ERR,"load json string failed: not an object!\n");
277-
json_decref(json_response);
278-
goto parse_err;
279-
}
280-
281270
/* get zone name */
282-
json_t *json_key = json_object_get(json_response, "zoneName");
271+
json_t *json_key = json_object_get(json_data, "zoneName");
283272
if (!json_key || !json_is_string(json_key)) {
284273
log_msg(LOG_ERR,"zoneName does not exist or is not string!");
285-
json_decref(json_response);
274+
json_decref(json_data);
286275
goto parse_err;
287276
}
288277
value = json_string_value(json_key);
289278
snprintf(update->zone_name, strlen(value)+1, "%s", value);
290279

291280
/* get domain name */
292-
json_key = json_object_get(json_response, "domainName");
281+
json_key = json_object_get(json_data, "domainName");
293282
if (!json_key || !json_is_string(json_key)) {
294283
log_msg(LOG_ERR,"domainName does not exist or is not string!");
295-
json_decref(json_response);
284+
json_decref(json_data);
296285
goto parse_err;
297286
}
298287
value = json_string_value(json_key);
299288
snprintf(update->domain_name, strlen(value)+1, "%s", value);
300289

301290
/* get ttl */
302-
json_key = json_object_get(json_response, "ttl");
291+
json_key = json_object_get(json_data, "ttl");
303292
if (!json_key || !json_is_integer(json_key)) {
304293
update->ttl = 30;
305294
}else{
306295
update->ttl= json_integer_value(json_key);
307296
}
308297

309298
/* get maxAnswer */
310-
json_key = json_object_get(json_response, "maxAnswer");
299+
json_key = json_object_get(json_data, "maxAnswer");
311300
if (!json_key || !json_is_integer(json_key)) {
312301
update->maxAnswer = 0;
313302
}else{
314303
update->maxAnswer = json_integer_value(json_key);
315304
}
316305

317306
/* get type name */
318-
json_key = json_object_get(json_response, "type");
307+
json_key = json_object_get(json_data, "type");
319308
if (!json_key || !json_is_string(json_key)) {
320309
log_msg(LOG_ERR,"type does not exist or is not string!");
321-
json_decref(json_response);
310+
json_decref(json_data);
322311
goto parse_err;
323312
}
324313
value = json_string_value(json_key);
@@ -333,26 +322,26 @@ static void* domaindata_parse(enum db_action action,struct connection_info_str
333322
update->type = TYPE_SRV;
334323
}else{
335324
log_msg(LOG_ERR,"type not support!");
336-
json_decref(json_response);
325+
json_decref(json_data);
337326
goto parse_err;
338327
}
339328
if (update->type == TYPE_A){
340329
/* get view name */
341-
json_key = json_object_get(json_response, "viewName");
330+
json_key = json_object_get(json_data, "viewName");
342331
if (!json_key || !json_is_string(json_key)) {
343332
memcpy(update->view_name, DEFAULT_VIEW_NAME, strlen(DEFAULT_VIEW_NAME));
344333
}else{
345334
value = json_string_value(json_key);
346335
snprintf(update->view_name, strlen(value)+1, "%s", value);
347336
}
348337
/* get lb info*/
349-
json_key = json_object_get(json_response, "lbMode");
338+
json_key = json_object_get(json_data, "lbMode");
350339
if (!json_key || !json_is_integer(json_key)) {
351340
update->lb_mode = 0;
352341
}else{
353342
update->lb_mode= json_integer_value(json_key);
354343
}
355-
json_key = json_object_get(json_response, "lbWeight");
344+
json_key = json_object_get(json_data, "lbWeight");
356345
if (!json_key || !json_is_integer(json_key)) {
357346
update->lb_weight = 0;
358347
}else{
@@ -362,71 +351,172 @@ static void* domaindata_parse(enum db_action action,struct connection_info_str
362351
update->lb_weight = 1;
363352
}
364353
/* get ip addr */
365-
json_key = json_object_get(json_response, "host");
354+
json_key = json_object_get(json_data, "host");
366355
if (!json_key || !json_is_string(json_key)) {
367356
log_msg(LOG_ERR,"host does not exist or is not string!");
368-
json_decref(json_response);
357+
json_decref(json_data);
369358
goto parse_err;
370359
}
371360
value = json_string_value(json_key);
372361
if (ipv4_address_check(value) <= 0){
373362
log_msg(LOG_ERR,"host is not an ipv4 addr\n!");
374-
json_decref(json_response);
363+
json_decref(json_data);
375364
goto parse_err;
376365
}
377366
snprintf(update->host, strlen(value)+1, "%s", value);
378367
} else if (update->type == TYPE_PTR || update->type == TYPE_CNAME){
379368
/* get host */
380-
json_key = json_object_get(json_response, "host");
369+
json_key = json_object_get(json_data, "host");
381370
if (!json_key || !json_is_string(json_key)) {
382371
log_msg(LOG_ERR,"host does not exist or is not string!");
383-
json_decref(json_response);
372+
json_decref(json_data);
384373
goto parse_err;
385374
}
386375
value = json_string_value(json_key);
387376
snprintf(update->host, strlen(value)+1, "%s", value);
388377
} else if (update->type == TYPE_SRV){
389378
/* get host */
390-
json_key = json_object_get(json_response, "host");
379+
json_key = json_object_get(json_data, "host");
391380
if (!json_key || !json_is_string(json_key)) {
392381
log_msg(LOG_ERR,"ipAddr does not exist or is not string!");
393-
json_decref(json_response);
382+
json_decref(json_data);
394383
goto parse_err;
395384
}
396385
value = json_string_value(json_key);
397386
snprintf(update->host, strlen(value)+1, "%s", value);
398387

399388
/* get priority */
400-
json_key = json_object_get(json_response, "priority");
389+
json_key = json_object_get(json_data, "priority");
401390
if (!json_key || !json_is_integer(json_key)) {
402391
log_msg(LOG_ERR,"priority does not exist or is not int!");
403-
json_decref(json_response);
392+
json_decref(json_data);
404393
goto parse_err;
405394
}
406395
update->prio = json_integer_value(json_key);
407396

408397
/* get weight */
409-
json_key = json_object_get(json_response, "weight");
398+
json_key = json_object_get(json_data, "weight");
410399
if (!json_key || !json_is_integer(json_key)) {
411400
log_msg(LOG_ERR,"weight does not exist or is not int!");
412-
json_decref(json_response);
401+
json_decref(json_data);
413402
goto parse_err;
414403
}
415404
update->weight= json_integer_value(json_key);
416405

417406
/* get port */
418-
json_key = json_object_get(json_response, "port");
407+
json_key = json_object_get(json_data, "port");
419408
if (!json_key || !json_is_integer(json_key)) {
420409
log_msg(LOG_ERR,"port does not exist or is not int!");
421-
json_decref(json_response);
410+
json_decref(json_data);
422411
goto parse_err;
423412
}
424413
update->port = json_integer_value(json_key);
425414
}
426415

427-
send_domain_msg_to_master(update);
416+
return update;
417+
418+
parse_err:
419+
free(update);
420+
return NULL;
421+
422+
}
423+
424+
425+
static void* domaindata_parse(enum db_action action,struct connection_info_struct *con_info , int * len_response)
426+
{
427+
char * post_ok = strdup("OK\n");
428+
char * parseErr = NULL;
428429

430+
if (action == DOMAN_ACTION_ADD){
431+
log_msg(LOG_INFO,"add data = %s\n",(char *)con_info->uploaddata);
432+
}else{
433+
log_msg(LOG_INFO,"del data = %s\n",(char *)con_info->uploaddata);
434+
}
435+
*len_response = strlen(post_ok);
436+
json_error_t jerror;
437+
438+
439+
json_t *json_response = json_loads(con_info->uploaddata, 0, &jerror);
440+
if (!json_response) {
441+
log_msg(LOG_ERR,"load json string failed: %s %s (line %d, col %d)\n",
442+
jerror.text, jerror.source, jerror.line, jerror.column);
443+
goto parse_err;
444+
}
445+
if (!json_is_object(json_response)) {
446+
log_msg(LOG_ERR,"load json string failed: not an object!\n");
447+
json_decref(json_response);
448+
goto parse_err;
449+
}
450+
451+
452+
struct domin_info_update *update = do_domaindata_parse(action, json_response);
453+
if (update != NULL) {
454+
send_domain_msg_to_master(update,10);
455+
json_decref(json_response);
456+
return post_ok;
457+
}
458+
parse_err:
459+
parseErr = strdup("parse data err\n");
460+
*len_response = strlen(parseErr);
461+
return (void* )parseErr;
462+
}
463+
464+
465+
static void* domaindata_parse_all(enum db_action action,struct connection_info_struct *con_info , int * len_response)
466+
{
467+
char * post_ok = strdup("OK\n");
468+
char * parseErr = NULL;
469+
/*
470+
if (action == DOMAN_ACTION_ADD){
471+
log_msg(LOG_INFO,"add data = %s\n",(char *)con_info->uploaddata);
472+
}else{
473+
log_msg(LOG_INFO,"del data = %s\n",(char *)con_info->uploaddata);
474+
}*/
475+
*len_response = strlen(post_ok);
476+
// printf("\n\n %s\n",con_info->uploaddata);
477+
478+
json_error_t jerror;
479+
480+
json_t *json_response = json_loads(con_info->uploaddata, 0, &jerror);
481+
if (!json_response) {
482+
log_msg(LOG_ERR,"load json string failed: %s %s (line %d, col %d)\n",
483+
jerror.text, jerror.source, jerror.line, jerror.column);
484+
goto parse_err;
485+
}
486+
487+
if (!json_is_array(json_response)){
488+
log_msg(LOG_ERR, "load json string failed: not an array!");
429489
json_decref(json_response);
490+
goto parse_err;
491+
}
492+
size_t domains_count = json_array_size(json_response);
493+
size_t i_num;
494+
495+
for (i_num = 0; i_num < domains_count; i_num++){
496+
struct domin_info_update *update;
497+
int retry_num = 5;
498+
int ret = 0;
499+
json_t *array_elem = json_array_get(json_response, i_num);
500+
if (!json_is_object(array_elem)) {
501+
log_msg(LOG_ERR,"load json string failed: not an object!\n");
502+
json_decref(array_elem);
503+
goto parse_err;
504+
}
505+
506+
retry:
507+
update = do_domaindata_parse(action, array_elem);
508+
if (update != NULL) {
509+
ret = send_domain_msg_to_master(update, retry_num);
510+
if ((ret <0) && (retry_num >0)){
511+
retry_num--;
512+
//100ms
513+
usleep(200000);
514+
goto retry;
515+
}
516+
json_decref(array_elem);
517+
}
518+
}
519+
// log_msg(LOG_INFO, "%d domains insert\n",domains_count);
430520

431521
return post_ok;
432522

@@ -435,10 +525,15 @@ static void* domaindata_parse(enum db_action action,struct connection_info_str
435525
*len_response = strlen(parseErr);
436526
return (void* )parseErr;
437527
}
528+
438529
static void* domain_post(struct connection_info_struct *con_info ,__attribute__((unused))char *url, int * len_response){
439530
return domaindata_parse(DOMAN_ACTION_ADD,con_info,len_response);
440531
}
441532

533+
static void* domains_post_all(struct connection_info_struct *con_info ,__attribute__((unused))char *url, int * len_response){
534+
return domaindata_parse_all(DOMAN_ACTION_ADD,con_info,len_response);
535+
}
536+
442537

443538
static void* domain_del(struct connection_info_struct *con_info ,__attribute__((unused))char *url, int * len_response){
444539
return domaindata_parse(DOMAN_ACTION_DEL,con_info,len_response);
@@ -707,6 +802,7 @@ void domian_info_exchange_run( int port){
707802

708803
dins = webserver_new(port);
709804
web_endpoint_add("POST","/kdns/domain",dins,&domain_post);
805+
web_endpoint_add("POST","/kdns/alldomains",dins,&domains_post_all);
710806
web_endpoint_add("GET","/kdns/domain",dins,&domains_get);
711807
web_endpoint_add("GET","/kdns/perdomain/",dins,&domain_get);
712808
web_endpoint_add("DELETE","/kdns/domain",dins,&domain_del);

0 commit comments

Comments
 (0)