@@ -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+
438529static 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
443538static 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