瀏覽代碼

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
Rich Megginson 12 年之前
父節點
當前提交
bde43727d1

+ 9 - 2
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",
 									(long long unsigned int)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)
 				{

+ 32 - 1
ldap/servers/slapd/libglobs.c

@@ -261,6 +261,7 @@ slapi_onoff_t init_connection_nocanon;
 slapi_onoff_t init_plugin_logging;
 slapi_int_t init_connection_buffer;
 slapi_int_t init_listen_backlog_size;
+slapi_onoff_t init_ignore_time_skew;
 #ifdef MEMPOOL_EXPERIMENTAL
 slapi_onoff_t init_mempool_switch;
 #endif
@@ -1067,7 +1068,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,
@@ -1510,6 +1515,7 @@ FrontendConfig_init () {
   init_connection_nocanon = cfg->connection_nocanon = LDAP_ON;
   init_plugin_logging = cfg->plugin_logging = LDAP_OFF;
   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;
@@ -6988,6 +6994,18 @@ config_get_unhashed_pw_switch()
     return retVal;
 }
 
+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_enable_turbo_mode( const char *attrname, char *value,
                             char *errorbuf, int apply )
@@ -7014,6 +7032,19 @@ config_set_connection_nocanon( const char *attrname, char *value,
     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_plugin_logging( const char *attrname, char *value,
                             char *errorbuf, int apply )

+ 2 - 0
ldap/servers/slapd/proto-slap.h

@@ -397,6 +397,7 @@ int config_set_unhashed_pw_switch(const char *attrname, char *value, char *error
 int config_set_return_orig_type_switch(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 );
@@ -576,6 +577,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 * );

+ 2 - 0
ldap/servers/slapd/slap.h

@@ -2121,6 +2121,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"
@@ -2366,6 +2367,7 @@ typedef struct _slapdFrontendConfig {
   slapi_int_t connection_buffer; /* values are CONNECTION_BUFFER_* below */
   slapi_onoff_t connection_nocanon; /* if "on" sets LDAP_OPT_X_SASL_NOCANON */
   slapi_onoff_t plugin_logging; /* log all internal plugin operations */
+  slapi_onoff_t ignore_time_skew;
 } slapdFrontendConfig_t;
 
 /* possible values for slapdFrontendConfig_t.schemareplace */