[Freeipa-devel] [PATCH 0098] Log failures detected in CHECK() macro

Adam Tkac atkac at redhat.com
Thu Dec 13 14:07:40 UTC 2012


On Tue, Dec 04, 2012 at 01:24:39PM +0100, Petr Spacek wrote:
> On 11/22/2012 02:05 PM, Adam Tkac wrote:
> >On Tue, Nov 20, 2012 at 02:44:49PM +0100, Petr Spacek wrote:
> >>Hello,
> >>
> >>     Log failures detected in CHECK() macro.
> >>
> >>     Function ldap_query() can return ISC_R_NOTFOUND legitimately.
> >>     For this and similar cases CHECK_CONDLOG macro was introduced.
> >>     It will not log if result != ISC_R_SUCCESS but == ignored_code.
> >>     Nested condition will be eliminated by optimizing compiler
> >>     in cases where ignored_code == ISC_R_SUCCESS.
> >>
> >>     Function add_soa_record() is now called only for zones to prevent
> >>     false error messages.
> >
> >Nack.
> >
> >I don't like second part of the patch much, it adds huge amount of logging
> >and now we will log every error twice because we already log errors explicitly.
> >
> >In my opinion better will be to add new configuration option, for example
> >"debug", and with this option we can emit log messages from CHECK macros (I
> >haven't though about implementation details, yet). Otherwise we should avoid
> >logging because it's useless to log all errors, they are expected in production
> >environment.
> >
> >I also don't like CHECK_CONDLOG macro, it's not intuitive and with it we can end
> >with so called spaghetti code... As I wrote above I would log every CHECK
> >failure with debugging on.
> >
> >However the first patch of the patch is fine (the add_soa_record part).
> Ok, reworked patch is attached. Logging is enabled only if
> configuration option 'verbose_checks yes' is present. I
> decommissioned CHECK_CONDLOG(), so each request for non-existing
> record will log failure: not found (when verbose mode is enabled).

This looks fine for me. In future we might consider to add some rate-limiting
patch for log_error_position() calls because in production environment debug log
can be too huge but this is not blocker for the patch.

Ack

Regards, Adam

> From 0efaa684d8c536805762d9a835897889cac87d25 Mon Sep 17 00:00:00 2001
> From: Petr Spacek <pspacek at redhat.com>
> Date: Tue, 4 Dec 2012 13:12:53 +0100
> Subject: [PATCH] Add option to log all failures detected in CHECK() macro.
> 
> Logging will be enabled if 'verbose_checks' option is set to 'yes'.
> 
> Function add_soa_record() is now called only for zones to prevent
> false error messages.
> 
> Signed-off-by: Petr Spacek <pspacek at redhat.com>
> ---
>  src/ldap_helper.c  |  7 +++----
>  src/settings.c     |  1 +
>  src/util.h         | 15 +++++++--------
>  src/zone_manager.c |  2 ++
>  4 files changed, 13 insertions(+), 12 deletions(-)
> 
> diff --git a/src/ldap_helper.c b/src/ldap_helper.c
> index 7d1febb68a4773d4e1127e8135d30fd855ded6a6..436985247803240f9ec4f2c3e5118adf8466beec 100644
> --- a/src/ldap_helper.c
> +++ b/src/ldap_helper.c
> @@ -1694,10 +1694,9 @@ ldap_parse_rrentry(isc_mem_t *mctx, ldap_entry_t *entry,
>  	const char *dn = "<NULL entry>";
>  	const char *data = "<NULL data>";
>  
> -	result = add_soa_record(mctx, qresult, origin, entry,
> -				rdatalist, fake_mname);
> -	if (result != ISC_R_SUCCESS && result != ISC_R_NOTFOUND)
> -		goto cleanup;
> +	if ((ldap_entry_getclass(entry) & LDAP_ENTRYCLASS_ZONE) != 0)
> +		CHECK(add_soa_record(mctx, qresult, origin, entry,
> +				     rdatalist, fake_mname));
>  
>  	rdclass = ldap_entry_getrdclass(entry);
>  	ttl = ldap_entry_getttl(entry);
> diff --git a/src/settings.c b/src/settings.c
> index 25578ce2687bf12e3a2d387caf0b26ed1a3083b6..08164766172f5f915584ae51b43e3d64798eed71 100644
> --- a/src/settings.c
> +++ b/src/settings.c
> @@ -32,6 +32,7 @@
>  #include "util.h"
>  #include "types.h"
>  
> +isc_boolean_t verbose_checks = ISC_FALSE; /* log each failure in CHECK() macro */
>  
>  /*
>   * Forward declarations.
> diff --git a/src/util.h b/src/util.h
> index c61f4e7a4930717cfd7729caa2c2f36854d1903f..d6d3c73e6d25657805eee904e6047c542e52a656 100644
> --- a/src/util.h
> +++ b/src/util.h
> @@ -21,6 +21,8 @@
>  #ifndef _LD_UTIL_H_
>  #define _LD_UTIL_H_
>  
> +extern isc_boolean_t verbose_checks; /* from settings.c */
> +
>  #include "log.h"
>  
>  #define CLEANUP_WITH(result_code)				\
> @@ -32,15 +34,12 @@
>  #define CHECK(op)						\
>  	do {							\
>  		result = (op);					\
> -		if (result != ISC_R_SUCCESS)			\
> +		if (result != ISC_R_SUCCESS) {			\
> +			if (verbose_checks == ISC_TRUE)		\
> +				log_error_position("check failed: %s",		\
> +						   dns_result_totext(result));	\
>  			goto cleanup;				\
> -	} while (0)
> -
> -#define CHECK_NEXT(op)						\
> -	do {							\
> -		result = (op);					\
> -		if (result != ISC_R_SUCCESS)			\
> -			goto next;				\
> +		}						\
>  	} while (0)
>  
>  #define CHECKED_MEM_ALLOCATE(m, target_ptr, s)			\
> diff --git a/src/zone_manager.c b/src/zone_manager.c
> index 08ef91907a35564520b8ccb8d9993b49fc88a391..c19c3b6c91ff8114fcb15eacba0f74ec46047986 100644
> --- a/src/zone_manager.c
> +++ b/src/zone_manager.c
> @@ -121,6 +121,7 @@ manager_create_db_instance(isc_mem_t *mctx, const char *name,
>  	setting_t manager_settings[] = {
>  		{ "zone_refresh", default_uint(0) },
>  		{ "psearch", default_boolean(0) },
> +		{ "verbose_checks", default_boolean(0) },
>  		end_of_settings
>  	};
>  
> @@ -139,6 +140,7 @@ manager_create_db_instance(isc_mem_t *mctx, const char *name,
>  	/* Parse settings. */
>  	manager_settings[0].target = &zone_refresh;
>  	manager_settings[1].target = &psearch;
> +	manager_settings[2].target = &verbose_checks; /* global variable */
>  	CHECK(set_settings(manager_settings, argv));
>  
>  	CHECKED_MEM_GET_PTR(mctx, db_inst);
> -- 
> 1.7.11.7
> 


-- 
Adam Tkac, Red Hat, Inc.




More information about the Freeipa-devel mailing list