changeset 1387:d70f5f6cb306

rt_ereg: improve logging and locking
author Thomas Klausner <tk@giga.or.at>
date Tue, 15 Oct 2019 16:25:47 +0200
parents 6e4737d332e7
children 61e693afccc6
files extensions/rt_ereg/rtereg.c extensions/rt_ereg/rtereg_conf.l extensions/rt_ereg/rtereg_conf.y
diffstat 3 files changed, 45 insertions(+), 40 deletions(-) [+]
line wrap: on
line diff
--- a/extensions/rt_ereg/rtereg.c	Fri Aug 02 20:46:18 2019 +0200
+++ b/extensions/rt_ereg/rtereg.c	Tue Oct 15 16:25:47 2019 +0200
@@ -93,7 +93,7 @@
 		int err = 0;
 		struct fd_list * c;
 
-		TRACE_DEBUG(ANNOYING, "Attempt pattern matching of '%.*s' with rule '%s'", (int)len, value, r->pattern);
+		LOG_D("[rt_ereg] attempting pattern matching of '%.*s' with rule '%s'", (int)len, value, r->pattern);
 
 		#ifdef HAVE_REG_STARTEND
 		{
@@ -118,7 +118,7 @@
 			size_t bl;
 
 			/* Error while compiling the regex */
-			TRACE_DEBUG(INFO, "Error while executing the regular expression '%s':", r->pattern);
+			LOG_E("[rt_ereg] error while executing the regular expression '%s':", r->pattern);
 
 			/* Get the error message size */
 			bl = regerror(err, &r->preg, NULL, 0);
@@ -128,7 +128,7 @@
 
 			/* Get the error message content */
 			regerror(err, &r->preg, errstr, bl);
-			TRACE_DEBUG(INFO, "\t%s", errstr);
+			LOG_E("\t%s", errstr);
 
 			/* Free the buffer, return the error */
 			free(errstr);
@@ -137,12 +137,7 @@
 		}
 
 		/* From this point, the expression matched the AVP value */
-		TRACE_DEBUG(FULL, "[rt_ereg] Match: '%s' to value '%.*s' => '%s' += %d",
-					r->pattern,
-					(int)len,
-					value,
-					r->server,
-					r->score);
+		LOG_D("[rt_ereg] Match: '%s' to value '%.*s' => '%s' += %d", r->pattern, (int)len, value, r->server, r->score);
 
 		for (c = candidates->next; c != candidates; c = c->next) {
 			struct rtd_candidate * cand = (struct rtd_candidate *)c;
@@ -167,7 +162,7 @@
 	/* iterate over all AVPs and try to find a match */
 //	for (i = 0; i<rtereg_conf[j].level; i++) {
 	if (level > rtereg_conf[conf_index].level) {
-		TRACE_DEBUG(INFO, "internal error, dug too deep");
+		LOG_E("internal error, dug too deep");
 		return 1;
 	}
 	what = rtereg_conf[conf_index].avps[level];
@@ -178,11 +173,15 @@
 		CHECK_FCT(fd_msg_avp_hdr(nextavp, &avp_hdr));
 		if ((avp_hdr->avp_code == dictdata.avp_code) && (avp_hdr->avp_vendor == dictdata.avp_vendor)) {
 			if (level != rtereg_conf[conf_index].level - 1) {
-				TRACE_DEBUG(INFO, "[rt_ereg] found grouped AVP %d (vendor %d), digging deeper", avp_hdr->avp_code, avp_hdr->avp_vendor);
+				LOG_D("[rt_ereg] found grouped AVP %d (vendor %d), digging deeper", avp_hdr->avp_code, avp_hdr->avp_vendor);
 				CHECK_FCT(find_avp(nextavp, conf_index, level+1, candidates));
 			} else {
-				TRACE_DEBUG(INFO, "[rt_ereg] found AVP %d (vendor %d)", avp_hdr->avp_code, avp_hdr->avp_vendor);
+				struct dictionary * dict;
+				LOG_D("[rt_ereg] found AVP %d (vendor %d)", avp_hdr->avp_code, avp_hdr->avp_vendor);
+				CHECK_FCT(fd_dict_getdict(what, &dict));
+				CHECK_FCT_DO(fd_msg_parse_dict(nextavp, dict, NULL), /* nothing */);
 				if (avp_hdr->avp_value != NULL) {
+					LOG_A("avp_hdr->avp_value NOT NULL, matching");
 #ifndef HAVE_REG_STARTEND
 					int ret;
 
@@ -223,7 +222,7 @@
 	msg_or_avp *where;
 	int j, ret;
 
-	TRACE_ENTRY("%p %p %p", cbdata, *pmsg, candidates);
+	LOG_A("[rt_ereg] rtereg_out arguments: %p %p %p", cbdata, *pmsg, candidates);
 
 	CHECK_PARAMS(pmsg && *pmsg && candidates);
 
@@ -238,7 +237,7 @@
 
 		for (j=0; j<rtereg_conf_size; j++) {
 			where = *pmsg;
-			TRACE_DEBUG(INFO, "[rt_ereg] iterating over AVP group %d", j);
+			LOG_D("[rt_ereg] iterating over AVP group %d", j);
 			if ((ret=find_avp(where, j, 0, candidates)) != 0) {
 				break;
 			}
@@ -301,12 +300,12 @@
 /* entry point */
 static int rtereg_entry(char * conffile)
 {
-	TRACE_ENTRY("%p", conffile);
+	LOG_A("[rt_ereg] started with conffile '%p'", conffile);
 
 	rt_ereg_config_file = conffile;
 
 	if (rtereg_init() != 0) {
-	    return 1;
+		return 1;
 	}
 
 	/* Register reload callback */
@@ -321,8 +320,8 @@
 {
 	/* Initialize the configuration */
 	if ((rtereg_conf=malloc(sizeof(*rtereg_conf))) == NULL) {
-	    TRACE_DEBUG(INFO, "malloc failured");
-	    return 1;
+		LOG_E("[rt_ereg] malloc failured");
+		return 1;
 	}
 	rtereg_conf_size = 1;
 	memset(rtereg_conf, 0, sizeof(*rtereg_conf));
@@ -366,19 +365,27 @@
 /* Unload */
 static void rtereg_fini(void)
 {
-	TRACE_ENTRY();
-
 	/* Unregister the cb */
 	CHECK_FCT_DO( fd_rt_out_unregister ( rtereg_hdl, NULL ), /* continue */ );
 
+#ifndef HAVE_REG_STARTEND
+	free(buf);
+	buf = NULL;
+#endif /* HAVE_REG_STARTEND */
+
+	if (pthread_rwlock_wrlock(&rte_lock) != 0) {
+		fd_log_error("%s: write-locking failed in fini, giving up", MODULE_NAME);
+		return;
+	}
 	/* Destroy the data */
 	rtereg_conf_free(rtereg_conf, rtereg_conf_size);
 	rtereg_conf = NULL;
 	rtereg_conf_size = 0;
-#ifndef HAVE_REG_STARTEND
-	free(buf);
-	buf = NULL;
-#endif /* HAVE_REG_STARTEND */
+
+	if (pthread_rwlock_unlock(&rte_lock) != 0) {
+		fd_log_error("%s: write-unlocking failed in fini", MODULE_NAME);
+		return;
+	}
 
 	/* Done */
 	return ;
--- a/extensions/rt_ereg/rtereg_conf.l	Fri Aug 02 20:46:18 2019 +0200
+++ b/extensions/rt_ereg/rtereg_conf.l	Tue Oct 15 16:25:47 2019 +0200
@@ -80,7 +80,7 @@
 				/* Match a quoted string. */
 				CHECK_MALLOC_DO( yylval->string = strdup(yytext+1), 
 				{
-					TRACE_DEBUG(INFO, "Unable to copy the string '%s': %s", yytext, strerror(errno));
+					LOG_E("[rt_ereg] unable to copy the string '%s': %s", yytext, strerror(errno));
 					return LEX_ERROR; /* trig an error in yacc parser */
 				} );
 				yylval->string[strlen(yytext) - 2] = '\0';
--- a/extensions/rt_ereg/rtereg_conf.y	Fri Aug 02 20:46:18 2019 +0200
+++ b/extensions/rt_ereg/rtereg_conf.y	Tue Oct 15 16:25:47 2019 +0200
@@ -61,15 +61,13 @@
 	extern FILE * rtereg_confin;
 	int ret;
 
-	TRACE_ENTRY("%p", conffile);
-
-	TRACE_DEBUG (FULL, "Parsing configuration file: %s...", conffile);
+	LOG_D("[rt_ereg] parsing configuration file '%s'", conffile);
 
 	rtereg_confin = fopen(conffile, "r");
 	if (rtereg_confin == NULL) {
 		ret = errno;
 		fd_log_debug("Unable to open extension configuration file %s for reading: %s", conffile, strerror(ret));
-		TRACE_DEBUG (INFO, "rt_ereg: error occurred, message logged -- configuration file.");
+		LOG_E("[rt_ereg] error occurred, message logged -- configuration file.");
 		return ret;
 	}
 
@@ -79,19 +77,19 @@
 	fclose(rtereg_confin);
 
 	if (rtereg_conf[rtereg_conf_size-1].finished == 0) {
-		TRACE_DEBUG(INFO, "rt_ereg: configuration invalid, AVP ended without OCTETSTRING AVP");
+		LOG_E("[rt_ereg] configuration invalid, AVP ended without OCTETSTRING AVP");
 		return EINVAL;
 	}
 
 	if (ret != 0) {
-		TRACE_DEBUG(INFO, "rt_ereg: unable to parse the configuration file.");
+		LOG_E("[rt_ereg] unable to parse the configuration file.");
 		return EINVAL;
 	} else {
 		int i, sum = 0;
 		for (i=0; i<rtereg_conf_size; i++) {
 			sum += rtereg_conf[i].rules_nb;
 		}
-		TRACE_DEBUG(FULL, "[rt-ereg] Added %d rules successfully.", sum);
+		LOG_D("[rt-ereg] Added %d rules successfully.", sum);
 	}
 
 	return 0;
@@ -104,25 +102,25 @@
 
 	if (rtereg_conf[rtereg_conf_size-1].finished) {
 		if ((ret = realloc(rtereg_conf, sizeof(*rtereg_conf)*(rtereg_conf_size+1))) == NULL) {
-			TRACE_DEBUG(INFO, "rt_ereg: realloc failed");
+			LOG_E("[rt_ereg] realloc failed");
 			return -1;
 		}
 		rtereg_conf_size++;
 		rtereg_conf = ret;
 		memset(&rtereg_conf[rtereg_conf_size-1], 0, sizeof(*rtereg_conf));
-		TRACE_DEBUG(INFO, "rt_ereg: New AVP group found starting with %s", name);
+		LOG_D("[rt_ereg] New AVP group found starting with %s", name);
 	}
 	level = rtereg_conf[rtereg_conf_size-1].level + 1;
 
 	if ((ret = realloc(rtereg_conf[rtereg_conf_size-1].avps, sizeof(*rtereg_conf[rtereg_conf_size-1].avps)*level)) == NULL) {
-		TRACE_DEBUG(INFO, "rt_ereg: realloc failed");
+		LOG_E("[rt_ereg] realloc failed");
 		return -1;
 	}
 	rtereg_conf[rtereg_conf_size-1].avps = ret;
 
 	CHECK_FCT_DO( fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME_ALL_VENDORS, name, &rtereg_conf[rtereg_conf_size-1].avps[level-1], ENOENT ),
 		      {
-			      TRACE_DEBUG(INFO, "rt_ereg: Unable to find '%s' AVP in the loaded dictionaries.", name);
+			      LOG_E("[rt_ereg] Unable to find '%s' AVP in the loaded dictionaries.", name);
 			      return -1;
 		      } );
 
@@ -133,7 +131,7 @@
 		if (data.avp_basetype == AVP_TYPE_OCTETSTRING) {
 			rtereg_conf[rtereg_conf_size-1].finished = 1;
 		} else if (data.avp_basetype != AVP_TYPE_GROUPED) {
-			TRACE_DEBUG(INFO, "rt_ereg: '%s' AVP is not an OCTETSTRING nor GROUPED AVP (%d).", name, data.avp_basetype);
+			LOG_E("[rt_ereg] '%s' AVP is not an OCTETSTRING nor GROUPED AVP (%d).", name, data.avp_basetype);
 			return -1;
 		}
 	}
@@ -147,7 +145,7 @@
 /* Function to report the errors */
 void yyerror (YYLTYPE *ploc, char * conffile, char const *s)
 {
-	TRACE_DEBUG(INFO, "rt_ereg: error in configuration parsing");
+	LOG_E("[rt_ereg] error in configuration parsing");
 
 	if (ploc->first_line != ploc->last_line)
 		fd_log_debug("%s:%d.%d-%d.%d : %s", conffile, ploc->first_line, ploc->first_column, ploc->last_line, ploc->last_column, s);
@@ -222,7 +220,7 @@
 						size_t bl;
 
 						/* Error while compiling the regex */
-						TRACE_DEBUG(INFO, "rt_ereg: error while compiling the regular expression '%s':", new->pattern);
+						LOG_E("[rt_ereg] error while compiling the regular expression '%s':", new->pattern);
 
 						/* Get the error message size */
 						bl = regerror(err, &new->preg, NULL, 0);
@@ -232,7 +230,7 @@
 
 						/* Get the error message content */
 						regerror(err, &new->preg, buf, bl);
-						TRACE_DEBUG(INFO, "\t%s", buf);
+						LOG_E("\t%s", buf);
 
 						/* Free the buffer, return the error */
 						free(buf);
"Welcome to our mercurial repository"