ldap/servers/plugins/replication/repl_extop.c | 11 +++++++-
ldap/servers/slapd/libglobs.c | 33 +++++++++++++++++++++++++-
ldap/servers/slapd/proto-slap.h | 2 +
ldap/servers/slapd/slap.h | 2 +
4 files changed, 45 insertions(+), 3 deletions(-)
New commits:
commit e61009e49797b130e8d28e78bcb3ed6bf8858e7f
Author: Rich Megginson <rmeggins(a)redhat.com>
Date: Wed Sep 18 12:32:23 2013 -0600
Ticket #47516 replication stops with excessive clock skew
https://fedorahosted.org/389/ticket/47516
Reviewed by: nhosoi (Thanks!)
Branch: master
Fix Description: Add a new configuration parameter to cn=config
nsslapd-ignore-time-skew: on|off - default off
If nsslapd-ignore-time-skew: on, the replication consumer will log errors
about excessive time skew, but will allow replication to proceed, and will
not return a time skew error to the replication supplier.
Platforms tested: RHEL6 x86_64
Flag Day: no
Doc impact: yes - document new config param
diff --git a/ldap/servers/plugins/replication/repl_extop.c
b/ldap/servers/plugins/replication/repl_extop.c
index 9ee5237..e7f33f9 100644
--- a/ldap/servers/plugins/replication/repl_extop.c
+++ b/ldap/servers/plugins/replication/repl_extop.c
@@ -835,12 +835,19 @@ multimaster_extop_StartNSDS50ReplicationRequest(Slapi_PBlock *pb)
rc = replica_update_csngen_state_ext (replica, supplier_ruv, replicacsn); /* too much
skew */
if (rc == CSN_LIMIT_EXCEEDED)
{
- response = NSDS50_REPL_EXCESSIVE_CLOCK_SKEW;
+ extern int config_get_ignore_time_skew();
+
slapi_log_error(SLAPI_LOG_FATAL, repl_plugin_name,
"conn=%" NSPRIu64 " op=%d repl=\"%s\": "
"Excessive clock skew from supplier RUV\n",
connid, opid, repl_root);
- goto send_response;
+ if (!config_get_ignore_time_skew()) {
+ response = NSDS50_REPL_EXCESSIVE_CLOCK_SKEW;
+ goto send_response;
+ } else {
+ /* else just continue */
+ rc = 0;
+ }
}
else if (rc != 0)
{
diff --git a/ldap/servers/slapd/libglobs.c b/ldap/servers/slapd/libglobs.c
index dbd9de2..00db0e0 100644
--- a/ldap/servers/slapd/libglobs.c
+++ b/ldap/servers/slapd/libglobs.c
@@ -253,6 +253,7 @@ int init_disk_monitoring;
int init_disk_logging_critical;
int init_ndn_cache_enabled;
int init_listen_backlog_size;
+int init_ignore_time_skew;
#ifdef MEMPOOL_EXPERIMENTAL
int init_mempool_switch;
@@ -1016,7 +1017,11 @@ static struct config_get_and_set {
{CONFIG_LISTEN_BACKLOG_SIZE, config_set_listen_backlog_size,
NULL, 0,
(void**)&global_slapdFrontendConfig.listen_backlog_size, CONFIG_INT,
- (ConfigGetFunc)config_get_listen_backlog_size, &init_listen_backlog_size}
+ (ConfigGetFunc)config_get_listen_backlog_size, &init_listen_backlog_size},
+ {CONFIG_IGNORE_TIME_SKEW, config_set_ignore_time_skew,
+ NULL, 0,
+ (void**)&global_slapdFrontendConfig.ignore_time_skew,
+ CONFIG_ON_OFF, (ConfigGetFunc)config_get_ignore_time_skew, &init_ignore_time_skew}
#ifdef MEMPOOL_EXPERIMENTAL
,{CONFIG_MEMPOOL_SWITCH_ATTRIBUTE, config_set_mempool_switch,
NULL, 0,
@@ -1445,6 +1450,7 @@ FrontendConfig_init () {
cfg->sasl_max_bufsize = SLAPD_DEFAULT_SASL_MAXBUFSIZE;
init_listen_backlog_size = cfg->listen_backlog_size = DAEMON_LISTEN_SIZE;
+ init_ignore_time_skew = cfg->ignore_time_skew = LDAP_OFF;
#ifdef MEMPOOL_EXPERIMENTAL
init_mempool_switch = cfg->mempool_switch = LDAP_ON;
cfg->mempool_maxfreelist = 1024;
@@ -6690,6 +6696,31 @@ config_set_default_naming_context(const char *attrname,
}
int
+config_get_ignore_time_skew(void)
+{
+ int retVal;
+ slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
+ CFG_LOCK_READ(slapdFrontendConfig);
+ retVal = slapdFrontendConfig->ignore_time_skew;
+ CFG_UNLOCK_READ(slapdFrontendConfig);
+
+ return retVal;
+}
+
+int
+config_set_ignore_time_skew( const char *attrname, char *value,
+ char *errorbuf, int apply )
+{
+ int retVal = LDAP_SUCCESS;
+ slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
+
+ retVal = config_set_onoff(attrname, value,
+ &(slapdFrontendConfig->ignore_time_skew),
+ errorbuf, apply);
+ return retVal;
+}
+
+int
config_set_listen_backlog_size( const char *attrname, char *value,
char *errorbuf, int apply )
{
diff --git a/ldap/servers/slapd/proto-slap.h b/ldap/servers/slapd/proto-slap.h
index 2e000bd..01d114a 100644
--- a/ldap/servers/slapd/proto-slap.h
+++ b/ldap/servers/slapd/proto-slap.h
@@ -396,6 +396,7 @@ int config_set_ndn_cache_enabled(const char *attrname, char *value,
char *errorb
int config_set_ndn_cache_max_size(const char *attrname, char *value, char *errorbuf, int
apply);
int config_set_sasl_maxbufsize(const char *attrname, char *value, char *errorbuf, int
apply );
int config_set_listen_backlog_size(const char *attrname, char *value, char *errorbuf, int
apply);
+int config_set_ignore_time_skew(const char *attrname, char *value, char *errorbuf, int
apply);
#if !defined(_WIN32) && !defined(AIX)
int config_set_maxdescriptors( const char *attrname, char *value, char *errorbuf, int
apply );
@@ -561,6 +562,7 @@ int config_get_listen_backlog_size(void);
PLHashNumber hashNocaseString(const void *key);
PRIntn hashNocaseCompare(const void *v1, const void *v2);
+int config_get_ignore_time_skew();
int is_abspath(const char *);
char* rel2abspath( char * );
diff --git a/ldap/servers/slapd/slap.h b/ldap/servers/slapd/slap.h
index 5d2ae10..e18967f 100644
--- a/ldap/servers/slapd/slap.h
+++ b/ldap/servers/slapd/slap.h
@@ -2063,6 +2063,7 @@ typedef struct _slapdEntryPoints {
#ifndef DAEMON_LISTEN_SIZE
#define DAEMON_LISTEN_SIZE 128
#endif
+#define CONFIG_IGNORE_TIME_SKEW "nsslapd-ignore-time-skew"
#ifdef MEMPOOL_EXPERIMENTAL
#define CONFIG_MEMPOOL_SWITCH_ATTRIBUTE "nsslapd-mempool"
@@ -2286,6 +2287,7 @@ typedef struct _slapdFrontendConfig {
/* normalized dn cache */
int ndn_cache_enabled;
size_t ndn_cache_max_size;
+ int ignore_time_skew;
} slapdFrontendConfig_t;
/* possible values for slapdFrontendConfig_t.schemareplace */