i8c-stream-1.4
changed/i8c-stream-1.4/389-ds-base-1.4.3.34-1.module+el8.7.0+18367+58a49cb0
parent
8da546c550
commit
4333218214
@ -1,3 +1,3 @@
|
||||
6dd2b4523735ae964fa5a8519ccd5be258a947c9 SOURCES/389-ds-base-1.4.3.32.tar.bz2
|
||||
204dc26c2d598b837aa4350ddc3df4449c6852ea SOURCES/389-ds-base-1.4.3.34.tar.bz2
|
||||
1c8f2d0dfbf39fa8cd86363bf3314351ab21f8d4 SOURCES/jemalloc-5.3.0.tar.bz2
|
||||
44d04546a521aee1e09e85924e08cbd67d0a2d0c SOURCES/vendor-1.4.3.32-1.tar.gz
|
||||
c24a7ec12257842852fd13c939c777fa4f0a03e4 SOURCES/vendor-1.4.3.34-2.tar.gz
|
||||
|
@ -1,3 +1,3 @@
|
||||
SOURCES/389-ds-base-1.4.3.32.tar.bz2
|
||||
SOURCES/389-ds-base-1.4.3.34.tar.bz2
|
||||
SOURCES/jemalloc-5.3.0.tar.bz2
|
||||
SOURCES/vendor-1.4.3.32-1.tar.gz
|
||||
SOURCES/vendor-1.4.3.34-2.tar.gz
|
||||
|
@ -1,440 +0,0 @@
|
||||
From 9cdb6cb41b9c87c44e788cd1e354b14dbf4eb5f7 Mon Sep 17 00:00:00 2001
|
||||
From: Mark Reynolds <mreynolds@redhat.com>
|
||||
Date: Wed, 16 Nov 2022 16:37:05 -0500
|
||||
Subject: [PATCH 1/3] Issue 5532 - Make db compaction TOD day more robust.
|
||||
|
||||
Bug Description:
|
||||
|
||||
The time of day compaction setting does not promise that the compaction
|
||||
will happen as configured. This is becuase the compaction interval
|
||||
starts when the server is started. Once it wakes up and we are "past"
|
||||
the TOD setting then we compact, but it can happen at any time
|
||||
once the TOD has passed.
|
||||
|
||||
Fix Description:
|
||||
|
||||
Once the compaction interval is hit we create an "event" with the
|
||||
exact time the compaction should start.
|
||||
|
||||
relates: #5532
|
||||
|
||||
Reviewed by: tbordaz & spichugi(Thanks!!)
|
||||
---
|
||||
.../tests/suites/config/compact_test.py | 29 +++--
|
||||
ldap/servers/plugins/replication/cl5_api.c | 58 +++++----
|
||||
.../slapd/back-ldbm/db-bdb/bdb_layer.c | 118 ++++++++++++------
|
||||
.../slapd/back-ldbm/db-bdb/bdb_layer.h | 2 +-
|
||||
4 files changed, 136 insertions(+), 71 deletions(-)
|
||||
|
||||
diff --git a/dirsrvtests/tests/suites/config/compact_test.py b/dirsrvtests/tests/suites/config/compact_test.py
|
||||
index 1f1c097e4..2e8dee4bb 100644
|
||||
--- a/dirsrvtests/tests/suites/config/compact_test.py
|
||||
+++ b/dirsrvtests/tests/suites/config/compact_test.py
|
||||
@@ -2,6 +2,7 @@ import logging
|
||||
import pytest
|
||||
import os
|
||||
import time
|
||||
+import datetime
|
||||
from lib389.tasks import DBCompactTask
|
||||
from lib389.backend import DatabaseConfig
|
||||
from lib389.replica import Changelog5
|
||||
@@ -53,22 +54,34 @@ def test_compaction_interval_and_time(topo):
|
||||
|
||||
inst = topo.ms["supplier1"]
|
||||
|
||||
- # Configure DB compaction
|
||||
- config = DatabaseConfig(inst)
|
||||
- config.set([('nsslapd-db-compactdb-interval', '2'), ('nsslapd-db-compactdb-time', '00:01')])
|
||||
+ # Calculate the compaction time (2 minutes from now)
|
||||
+ now = datetime.datetime.now()
|
||||
+ current_hour = now.hour
|
||||
+ current_minute = now.minute + 2
|
||||
+ if current_hour < 10:
|
||||
+ hour = "0" + str(current_hour)
|
||||
+ else:
|
||||
+ hour = str(current_hour)
|
||||
+ if current_minute < 10:
|
||||
+ minute = "0" + str(current_minute)
|
||||
+ else:
|
||||
+ minute = str(current_minute)
|
||||
+ compact_time = hour + ":" + minute
|
||||
|
||||
# Configure changelog compaction
|
||||
cl5 = Changelog5(inst)
|
||||
cl5.replace_many(
|
||||
('nsslapd-changelogcompactdb-interval', '2'),
|
||||
- ('nsslapd-changelogcompactdb-time', '00:01'),
|
||||
- ('nsslapd-changelogtrim-interval', '2')
|
||||
+ ('nsslapd-changelogcompactdb-time', compact_time),
|
||||
+ ('nsslapd-changelogtrim-interval', '2')
|
||||
)
|
||||
inst.deleteErrorLogs()
|
||||
|
||||
- # Check is compaction occurred
|
||||
- time.sleep(6)
|
||||
- assert inst.searchErrorsLog("Compacting databases")
|
||||
+ # Check compaction occurred as expected
|
||||
+ time.sleep(60)
|
||||
+ assert not inst.searchErrorsLog("compacting replication changelogs")
|
||||
+
|
||||
+ time.sleep(61)
|
||||
assert inst.searchErrorsLog("compacting replication changelogs")
|
||||
inst.deleteErrorLogs(restart=False)
|
||||
|
||||
diff --git a/ldap/servers/plugins/replication/cl5_api.c b/ldap/servers/plugins/replication/cl5_api.c
|
||||
index 43fa5bd46..5d4edea92 100644
|
||||
--- a/ldap/servers/plugins/replication/cl5_api.c
|
||||
+++ b/ldap/servers/plugins/replication/cl5_api.c
|
||||
@@ -103,6 +103,7 @@
|
||||
|
||||
#define NO_DISK_SPACE 1024
|
||||
#define MIN_DISK_SPACE 10485760 /* 10 MB */
|
||||
+#define _SEC_PER_DAY 86400
|
||||
|
||||
/***** Data Definitions *****/
|
||||
|
||||
@@ -293,6 +294,7 @@ static int _cl5FileEndsWith(const char *filename, const char *ext);
|
||||
|
||||
static PRLock *cl5_diskfull_lock = NULL;
|
||||
static int cl5_diskfull_flag = 0;
|
||||
+static PRBool compacting = PR_FALSE;
|
||||
|
||||
static void cl5_set_diskfull(void);
|
||||
static void cl5_set_no_diskfull(void);
|
||||
@@ -3099,7 +3101,7 @@ _cl5TrimCleanup(void)
|
||||
static time_t
|
||||
_cl5_get_tod_expiration(char *expire_time)
|
||||
{
|
||||
- time_t start_time, todays_elapsed_time, now = time(NULL);
|
||||
+ time_t todays_elapsed_time, now = time(NULL);
|
||||
struct tm *tm_struct = localtime(&now);
|
||||
char hour_str[3] = {0};
|
||||
char min_str[3] = {0};
|
||||
@@ -3109,9 +3111,8 @@ _cl5_get_tod_expiration(char *expire_time)
|
||||
|
||||
/* Get today's start time */
|
||||
todays_elapsed_time = (tm_struct->tm_hour * 3600) + (tm_struct->tm_min * 60) + (tm_struct->tm_sec);
|
||||
- start_time = slapi_current_utc_time() - todays_elapsed_time;
|
||||
|
||||
- /* Get the hour and minute and calculate the expiring time. The time was
|
||||
+ /* Get the hour and minute and calculate the expiring TOD. The time was
|
||||
* already validated in bdb_config.c: HH:MM */
|
||||
hour_str[0] = *s++;
|
||||
hour_str[1] = *s++;
|
||||
@@ -3122,7 +3123,34 @@ _cl5_get_tod_expiration(char *expire_time)
|
||||
min = strtoll(min_str, &endp, 10);
|
||||
expiring_time = (hour * 60 * 60) + (min * 60);
|
||||
|
||||
- return start_time + expiring_time;
|
||||
+ /* Calculate the time in seconds when the compaction should start, midnight
|
||||
+ * requires special treatment (for both current time and configured TOD) */
|
||||
+ if (expiring_time == 0) {
|
||||
+ /* Compaction TOD configured for midnight */
|
||||
+ if (todays_elapsed_time == 0) {
|
||||
+ /* It's currently midnight, compact now! */
|
||||
+ return 0;
|
||||
+ } else {
|
||||
+ /* Return the time until it's midnight */
|
||||
+ return _SEC_PER_DAY - todays_elapsed_time;
|
||||
+ }
|
||||
+ } else if (todays_elapsed_time == 0) {
|
||||
+ /* It's currently midnight, just use the configured TOD */
|
||||
+ return expiring_time;
|
||||
+ } else if (todays_elapsed_time > expiring_time) {
|
||||
+ /* We missed TOD today, do it tomorrow */
|
||||
+ return _SEC_PER_DAY - (todays_elapsed_time - expiring_time);
|
||||
+ } else {
|
||||
+ /* Compaction is coming up */
|
||||
+ return expiring_time - todays_elapsed_time;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+do_cl_compact(time_t when, void *arg)
|
||||
+{
|
||||
+ cl5CompactDBs();
|
||||
+ compacting = PR_FALSE;
|
||||
}
|
||||
|
||||
static int
|
||||
@@ -3131,7 +3159,6 @@ _cl5TrimMain(void *param __attribute__((unused)))
|
||||
time_t timePrev = slapi_current_utc_time();
|
||||
time_t timeCompactPrev = slapi_current_utc_time();
|
||||
time_t timeNow;
|
||||
- PRBool compacting = PR_FALSE;
|
||||
int32_t compactdb_time = 0;
|
||||
|
||||
PR_AtomicIncrement(&s_cl5Desc.threadCount);
|
||||
@@ -3144,25 +3171,14 @@ _cl5TrimMain(void *param __attribute__((unused)))
|
||||
_cl5DoTrimming();
|
||||
}
|
||||
|
||||
- if (!compacting) {
|
||||
- /* Once we know we want to compact we need to stop refreshing the
|
||||
- * TOD expiration. Otherwise if the compact time is close to
|
||||
- * midnight we could roll over past midnight during the checkpoint
|
||||
- * sleep interval, and we'd never actually compact the databases.
|
||||
- * We also need to get this value before the sleep.
|
||||
- */
|
||||
- compactdb_time = _cl5_get_tod_expiration(s_cl5Desc.dbTrim.compactTime);
|
||||
- }
|
||||
if ((s_cl5Desc.dbTrim.compactInterval > 0) &&
|
||||
- (timeNow - timeCompactPrev >= s_cl5Desc.dbTrim.compactInterval))
|
||||
+ (timeNow - timeCompactPrev >= s_cl5Desc.dbTrim.compactInterval) &&
|
||||
+ !compacting)
|
||||
{
|
||||
compacting = PR_TRUE;
|
||||
- if (slapi_current_utc_time() > compactdb_time) {
|
||||
- /* time to trim */
|
||||
- timeCompactPrev = timeNow;
|
||||
- cl5CompactDBs();
|
||||
- compacting = PR_FALSE;
|
||||
- }
|
||||
+ compactdb_time = _cl5_get_tod_expiration(s_cl5Desc.dbTrim.compactTime);
|
||||
+ slapi_eq_once_rel(do_cl_compact, NULL, slapi_current_rel_time_t() + compactdb_time);
|
||||
+ timeCompactPrev = timeNow;
|
||||
}
|
||||
if (NULL == s_cl5Desc.clLock) {
|
||||
/* most likely, emergency */
|
||||
diff --git a/ldap/servers/slapd/back-ldbm/db-bdb/bdb_layer.c b/ldap/servers/slapd/back-ldbm/db-bdb/bdb_layer.c
|
||||
index 3e29feb50..b433fa919 100644
|
||||
--- a/ldap/servers/slapd/back-ldbm/db-bdb/bdb_layer.c
|
||||
+++ b/ldap/servers/slapd/back-ldbm/db-bdb/bdb_layer.c
|
||||
@@ -95,6 +95,7 @@ static int trans_batch_txn_max_sleep = 50;
|
||||
static PRBool log_flush_thread = PR_FALSE;
|
||||
static int txn_in_progress_count = 0;
|
||||
static int *txn_log_flush_pending = NULL;
|
||||
+static PRBool compacting = PR_FALSE;
|
||||
|
||||
static pthread_mutex_t sync_txn_log_flush;
|
||||
static pthread_cond_t sync_txn_log_flush_done;
|
||||
@@ -3646,13 +3647,12 @@ log_flush_threadmain(void *param)
|
||||
}
|
||||
|
||||
/*
|
||||
- * This refreshes the TOD expiration. So live changes to the configuration
|
||||
- * will take effect immediately.
|
||||
+ * Get the time in seconds when the compaction should occur
|
||||
*/
|
||||
static time_t
|
||||
bdb_get_tod_expiration(char *expire_time)
|
||||
{
|
||||
- time_t start_time, todays_elapsed_time, now = time(NULL);
|
||||
+ time_t todays_elapsed_time, now = time(NULL);
|
||||
struct tm *tm_struct = localtime(&now);
|
||||
char hour_str[3] = {0};
|
||||
char min_str[3] = {0};
|
||||
@@ -3662,9 +3662,8 @@ bdb_get_tod_expiration(char *expire_time)
|
||||
|
||||
/* Get today's start time */
|
||||
todays_elapsed_time = (tm_struct->tm_hour * 3600) + (tm_struct->tm_min * 60) + (tm_struct->tm_sec);
|
||||
- start_time = slapi_current_utc_time() - todays_elapsed_time;
|
||||
|
||||
- /* Get the hour and minute and calculate the expiring time. The time was
|
||||
+ /* Get the hour and minute and calculate the expiring TOD. The time was
|
||||
* already validated in bdb_config.c: HH:MM */
|
||||
hour_str[0] = *s++;
|
||||
hour_str[1] = *s++;
|
||||
@@ -3675,7 +3674,55 @@ bdb_get_tod_expiration(char *expire_time)
|
||||
min = strtoll(min_str, &endp, 10);
|
||||
expiring_time = (hour * 60 * 60) + (min * 60);
|
||||
|
||||
- return start_time + expiring_time;
|
||||
+ /* Calculate the time in seconds when the compaction should start, midnight
|
||||
+ * requires special treatment (for both current time and configured TOD) */
|
||||
+ if (expiring_time == 0) {
|
||||
+ /* Compaction TOD configured for midnight */
|
||||
+ if (todays_elapsed_time == 0) {
|
||||
+ /* It's currently midnight, compact now! */
|
||||
+ return 0;
|
||||
+ } else {
|
||||
+ /* Return the time until it's midnight */
|
||||
+ return _SEC_PER_DAY - todays_elapsed_time;
|
||||
+ }
|
||||
+ } else if (todays_elapsed_time == 0) {
|
||||
+ /* It's currently midnight, just use the configured TOD */
|
||||
+ return expiring_time;
|
||||
+ } else if (todays_elapsed_time > expiring_time) {
|
||||
+ /* We missed TOD today, do it tomorrow */
|
||||
+ return _SEC_PER_DAY - (todays_elapsed_time - expiring_time);
|
||||
+ } else {
|
||||
+ /* Compaction is coming up */
|
||||
+ return expiring_time - todays_elapsed_time;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+bdb_compact(time_t when, void *arg)
|
||||
+{
|
||||
+ struct ldbminfo *li = (struct ldbminfo *)arg;
|
||||
+ Object *inst_obj;
|
||||
+ ldbm_instance *inst;
|
||||
+ DB *db = NULL;
|
||||
+ int rc = 0;
|
||||
+
|
||||
+ for (inst_obj = objset_first_obj(li->li_instance_set);
|
||||
+ inst_obj;
|
||||
+ inst_obj = objset_next_obj(li->li_instance_set, inst_obj))
|
||||
+ {
|
||||
+ inst = (ldbm_instance *)object_get_data(inst_obj);
|
||||
+ rc = dblayer_get_id2entry(inst->inst_be, &db);
|
||||
+ if (!db || rc) {
|
||||
+ continue;
|
||||
+ }
|
||||
+ slapi_log_err(SLAPI_LOG_NOTICE, "bdb_compact", "Compacting DB start: %s\n",
|
||||
+ inst->inst_name);
|
||||
+ /* Time to compact the DB's */
|
||||
+ dblayer_force_checkpoint(li);
|
||||
+ bdb_do_compact(li);
|
||||
+ dblayer_force_checkpoint(li);
|
||||
+ }
|
||||
+ compacting = PR_FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -3763,15 +3810,6 @@ checkpoint_threadmain(void *param)
|
||||
PR_Lock(li->li_config_mutex);
|
||||
checkpoint_interval_update = (time_t)BDB_CONFIG(li)->bdb_checkpoint_interval;
|
||||
compactdb_interval_update = (time_t)BDB_CONFIG(li)->bdb_compactdb_interval;
|
||||
- if (!compacting) {
|
||||
- /* Once we know we want to compact we need to stop refreshing the
|
||||
- * TOD expiration. Otherwise if the compact time is close to
|
||||
- * midnight we could roll over past midnight during the checkpoint
|
||||
- * sleep interval, and we'd never actually compact the databases.
|
||||
- * We also need to get this value before the sleep.
|
||||
- */
|
||||
- compactdb_time = bdb_get_tod_expiration((char *)BDB_CONFIG(li)->bdb_compactdb_time);
|
||||
- }
|
||||
PR_Unlock(li->li_config_mutex);
|
||||
|
||||
if (compactdb_interval_update != compactdb_interval) {
|
||||
@@ -3861,23 +3899,21 @@ checkpoint_threadmain(void *param)
|
||||
* this could have been a bug in fact, where compactdb_interval
|
||||
* was 0, if you change while running it would never take effect ....
|
||||
*/
|
||||
- if (slapi_timespec_expire_check(&compactdb_expire) == TIMER_EXPIRED) {
|
||||
- compacting = PR_TRUE;
|
||||
- if (slapi_current_utc_time() < compactdb_time) {
|
||||
- /* We have passed the interval, but we need to wait for a
|
||||
- * particular TOD to pass before compacting */
|
||||
- continue;
|
||||
- }
|
||||
+ if (compactdb_interval_update != compactdb_interval ||
|
||||
+ (slapi_timespec_expire_check(&compactdb_expire) == TIMER_EXPIRED && !compacting))
|
||||
+ {
|
||||
+ /* Get the time in second when the compaction should occur */
|
||||
+ PR_Lock(li->li_config_mutex);
|
||||
+ compactdb_time = bdb_get_tod_expiration((char *)BDB_CONFIG(li)->bdb_compactdb_time);
|
||||
+ PR_Unlock(li->li_config_mutex);
|
||||
|
||||
- /* Time to compact the DB's */
|
||||
- dblayer_force_checkpoint(li);
|
||||
- bdb_compact(li);
|
||||
- dblayer_force_checkpoint(li);
|
||||
+ /* Start compaction event */
|
||||
+ compacting = PR_TRUE;
|
||||
+ slapi_eq_once_rel(bdb_compact, (void *)li, slapi_current_rel_time_t() + compactdb_time);
|
||||
|
||||
- /* Now reset the timer and compacting flag */
|
||||
+ /* reset interval timer */
|
||||
compactdb_interval = compactdb_interval_update;
|
||||
slapi_timespec_expire_at(compactdb_interval, &compactdb_expire);
|
||||
- compacting = PR_FALSE;
|
||||
}
|
||||
}
|
||||
slapi_log_err(SLAPI_LOG_HOUSE, "checkpoint_threadmain", "Check point before leaving\n");
|
||||
@@ -6210,14 +6246,14 @@ ldbm_back_compact(Slapi_Backend *be)
|
||||
|
||||
li = (struct ldbminfo *)be->be_database->plg_private;
|
||||
dblayer_force_checkpoint(li);
|
||||
- rc = bdb_compact(li);
|
||||
+ rc = bdb_do_compact(li);
|
||||
dblayer_force_checkpoint(li);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
int32_t
|
||||
-bdb_compact(struct ldbminfo *li)
|
||||
+bdb_do_compact(struct ldbminfo *li)
|
||||
{
|
||||
Object *inst_obj;
|
||||
ldbm_instance *inst;
|
||||
@@ -6237,7 +6273,7 @@ bdb_compact(struct ldbminfo *li)
|
||||
if (!db || rc) {
|
||||
continue;
|
||||
}
|
||||
- slapi_log_err(SLAPI_LOG_NOTICE, "bdb_compact", "Compacting DB start: %s\n",
|
||||
+ slapi_log_err(SLAPI_LOG_NOTICE, "bdb_do_compact", "Compacting DB start: %s\n",
|
||||
inst->inst_name);
|
||||
|
||||
/*
|
||||
@@ -6249,15 +6285,15 @@ bdb_compact(struct ldbminfo *li)
|
||||
DBTYPE type;
|
||||
rc = db->get_type(db, &type);
|
||||
if (rc) {
|
||||
- slapi_log_err(SLAPI_LOG_ERR, "bdb_compact",
|
||||
- "compactdb: failed to determine db type for %s: db error - %d %s\n",
|
||||
+ slapi_log_err(SLAPI_LOG_ERR, "bdb_do_compact",
|
||||
+ "Failed to determine db type for %s: db error - %d %s\n",
|
||||
inst->inst_name, rc, db_strerror(rc));
|
||||
continue;
|
||||
}
|
||||
|
||||
rc = dblayer_txn_begin(inst->inst_be, NULL, &txn);
|
||||
if (rc) {
|
||||
- slapi_log_err(SLAPI_LOG_ERR, "bdb_compact", "compactdb: transaction begin failed: %d\n", rc);
|
||||
+ slapi_log_err(SLAPI_LOG_ERR, "bdb_do_compact", "Transaction begin failed: %d\n", rc);
|
||||
break;
|
||||
}
|
||||
/*
|
||||
@@ -6274,26 +6310,26 @@ bdb_compact(struct ldbminfo *li)
|
||||
rc = db->compact(db, txn.back_txn_txn, NULL /*start*/, NULL /*stop*/,
|
||||
&c_data, compact_flags, NULL /*end*/);
|
||||
if (rc) {
|
||||
- slapi_log_err(SLAPI_LOG_ERR, "bdb_compact",
|
||||
- "compactdb: failed to compact %s; db error - %d %s\n",
|
||||
+ slapi_log_err(SLAPI_LOG_ERR, "bdb_do_compact",
|
||||
+ "Failed to compact %s; db error - %d %s\n",
|
||||
inst->inst_name, rc, db_strerror(rc));
|
||||
if ((rc = dblayer_txn_abort(inst->inst_be, &txn))) {
|
||||
- slapi_log_err(SLAPI_LOG_ERR, "bdb_compact", "compactdb: failed to abort txn (%s) db error - %d %s\n",
|
||||
+ slapi_log_err(SLAPI_LOG_ERR, "bdb_do_compact", "Failed to abort txn (%s) db error - %d %s\n",
|
||||
inst->inst_name, rc, db_strerror(rc));
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
- slapi_log_err(SLAPI_LOG_NOTICE, "bdb_compact",
|
||||
- "compactdb: compact %s - %d pages freed\n",
|
||||
+ slapi_log_err(SLAPI_LOG_NOTICE, "bdb_do_compact",
|
||||
+ "compact %s - %d pages freed\n",
|
||||
inst->inst_name, c_data.compact_pages_free);
|
||||
if ((rc = dblayer_txn_commit(inst->inst_be, &txn))) {
|
||||
- slapi_log_err(SLAPI_LOG_ERR, "bdb_compact", "compactdb: failed to commit txn (%s) db error - %d %s\n",
|
||||
+ slapi_log_err(SLAPI_LOG_ERR, "bdb_do_compact", "failed to commit txn (%s) db error - %d %s\n",
|
||||
inst->inst_name, rc, db_strerror(rc));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
- slapi_log_err(SLAPI_LOG_NOTICE, "bdb_compact", "Compacting databases finished.\n");
|
||||
+ slapi_log_err(SLAPI_LOG_NOTICE, "bdb_do_compact", "Compacting databases finished.\n");
|
||||
|
||||
return rc;
|
||||
}
|
||||
diff --git a/ldap/servers/slapd/back-ldbm/db-bdb/bdb_layer.h b/ldap/servers/slapd/back-ldbm/db-bdb/bdb_layer.h
|
||||
index e3a49dbac..65a633193 100644
|
||||
--- a/ldap/servers/slapd/back-ldbm/db-bdb/bdb_layer.h
|
||||
+++ b/ldap/servers/slapd/back-ldbm/db-bdb/bdb_layer.h
|
||||
@@ -97,7 +97,7 @@ int bdb_db_size(Slapi_PBlock *pb);
|
||||
int bdb_upgradedb(Slapi_PBlock *pb);
|
||||
int bdb_upgradednformat(Slapi_PBlock *pb);
|
||||
int bdb_upgradeddformat(Slapi_PBlock *pb);
|
||||
-int32_t bdb_compact(struct ldbminfo *li);
|
||||
+int32_t bdb_do_compact(struct ldbminfo *li);
|
||||
int bdb_restore(struct ldbminfo *li, char *src_dir, Slapi_Task *task);
|
||||
int bdb_cleanup(struct ldbminfo *li);
|
||||
int bdb_txn_begin(struct ldbminfo *li, back_txnid parent_txn, back_txn *txn, PRBool use_lock);
|
||||
--
|
||||
2.38.1
|
||||
|
@ -1,30 +0,0 @@
|
||||
From adb1baa6fd9fcfa0ca6d4a84d918e25adc405afd Mon Sep 17 00:00:00 2001
|
||||
From: Mark Reynolds <mreynolds@redhat.com>
|
||||
Date: Mon, 28 Nov 2022 09:47:09 -0500
|
||||
Subject: [PATCH 2/3] Issue 5544 - Increase default task TTL
|
||||
|
||||
Description: Increase the Time To Live of tasks from 1 hour to 12 hours
|
||||
|
||||
relates: https://github.com/389ds/389-ds-base/issues/5544
|
||||
|
||||
Reviewed by: progier(Thanks!)
|
||||
---
|
||||
ldap/servers/slapd/task.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/ldap/servers/slapd/task.c b/ldap/servers/slapd/task.c
|
||||
index 71d5a2fb5..1a8be6c85 100644
|
||||
--- a/ldap/servers/slapd/task.c
|
||||
+++ b/ldap/servers/slapd/task.c
|
||||
@@ -48,7 +48,7 @@ static uint64_t shutting_down = 0;
|
||||
#define TASK_DATE_NAME "nsTaskCreated"
|
||||
#define TASK_WARNING_NAME "nsTaskWarning"
|
||||
|
||||
-#define DEFAULT_TTL "3600" /* seconds */
|
||||
+#define DEFAULT_TTL "43200" /* 12 hours in seconds */
|
||||
#define TASK_SYSCONFIG_FILE_ATTR "sysconfigfile" /* sysconfig reload task file attr */
|
||||
#define TASK_SYSCONFIG_LOGCHANGES_ATTR "logchanges"
|
||||
#define TASK_TOMBSTONE_FIXUP "fixup tombstones task"
|
||||
--
|
||||
2.38.1
|
||||
|
@ -1,219 +0,0 @@
|
||||
From 59ebf6618126547f3861fbef0b9a268f40ccb2bd Mon Sep 17 00:00:00 2001
|
||||
From: Mark Reynolds <mreynolds@redhat.com>
|
||||
Date: Tue, 13 Dec 2022 09:41:34 -0500
|
||||
Subject: [PATCH 3/3] Issue 5413 - Allow mutliple MemberOf fixup tasks with
|
||||
different bases/filters
|
||||
|
||||
Description:
|
||||
|
||||
A change was made to only allow a single fixup task at a time, but there are
|
||||
cases where you would want to run mutliple tasks but on different branches/filters.
|
||||
|
||||
Now we maintain a linked list of bases/filters of the current running tasks to
|
||||
monitor this.
|
||||
|
||||
relates: https://github.com/389ds/389-ds-base/issues/5413
|
||||
|
||||
Reviewed by: tbordaz(Thanks!)
|
||||
---
|
||||
.../suites/memberof_plugin/fixup_test.py | 5 +-
|
||||
ldap/servers/plugins/memberof/memberof.c | 101 ++++++++++++++----
|
||||
2 files changed, 85 insertions(+), 21 deletions(-)
|
||||
|
||||
diff --git a/dirsrvtests/tests/suites/memberof_plugin/fixup_test.py b/dirsrvtests/tests/suites/memberof_plugin/fixup_test.py
|
||||
index 9566e144c..d5369439f 100644
|
||||
--- a/dirsrvtests/tests/suites/memberof_plugin/fixup_test.py
|
||||
+++ b/dirsrvtests/tests/suites/memberof_plugin/fixup_test.py
|
||||
@@ -59,12 +59,15 @@ def test_fixup_task_limit(topo):
|
||||
with pytest.raises(ldap.UNWILLING_TO_PERFORM):
|
||||
memberof.fixup(DEFAULT_SUFFIX)
|
||||
|
||||
+ # Add second task but on different suffix which should be allowed
|
||||
+ memberof.fixup("ou=people," + DEFAULT_SUFFIX)
|
||||
+
|
||||
# Wait for first task to complete
|
||||
task.wait()
|
||||
|
||||
# Add new task which should be allowed now
|
||||
memberof.fixup(DEFAULT_SUFFIX)
|
||||
-
|
||||
+
|
||||
|
||||
if __name__ == '__main__':
|
||||
# Run isolated
|
||||
diff --git a/ldap/servers/plugins/memberof/memberof.c b/ldap/servers/plugins/memberof/memberof.c
|
||||
index f3f817f89..a5f48d2c0 100644
|
||||
--- a/ldap/servers/plugins/memberof/memberof.c
|
||||
+++ b/ldap/servers/plugins/memberof/memberof.c
|
||||
@@ -52,7 +52,6 @@ static Slapi_DN* _pluginDN = NULL;
|
||||
MemberOfConfig *qsortConfig = 0;
|
||||
static int usetxn = 0;
|
||||
static int premodfn = 0;
|
||||
-static PRBool fixup_running = PR_FALSE;
|
||||
static PRLock *fixup_lock = NULL;
|
||||
static int32_t fixup_progress_count = 0;
|
||||
static int64_t fixup_progress_elapsed = 0;
|
||||
@@ -65,6 +64,15 @@ typedef struct _memberofstringll
|
||||
void *next;
|
||||
} memberofstringll;
|
||||
|
||||
+typedef struct _fixup_ll
|
||||
+{
|
||||
+ Slapi_DN *sdn;
|
||||
+ char *filter_str;
|
||||
+ void *next;
|
||||
+} mo_fixup_ll;
|
||||
+
|
||||
+static mo_fixup_ll *fixup_list = NULL;
|
||||
+
|
||||
typedef struct _memberof_get_groups_data
|
||||
{
|
||||
MemberOfConfig *config;
|
||||
@@ -438,6 +446,15 @@ memberof_postop_close(Slapi_PBlock *pb __attribute__((unused)))
|
||||
PR_DestroyLock(fixup_lock);
|
||||
fixup_lock = NULL;
|
||||
|
||||
+ mo_fixup_ll *fixup_task = fixup_list;
|
||||
+ while (fixup_task != NULL) {
|
||||
+ mo_fixup_ll *tmp = fixup_task;
|
||||
+ fixup_task = fixup_task->next;
|
||||
+ slapi_sdn_free(&tmp->sdn);
|
||||
+ slapi_ch_free_string(&tmp->filter_str);
|
||||
+ slapi_ch_free((void**)&tmp);
|
||||
+ }
|
||||
+
|
||||
slapi_log_err(SLAPI_LOG_TRACE, MEMBEROF_PLUGIN_SUBSYSTEM,
|
||||
"<-- memberof_postop_close\n");
|
||||
return 0;
|
||||
@@ -2817,7 +2834,6 @@ memberof_fixup_task_thread(void *arg)
|
||||
}
|
||||
|
||||
PR_Lock(fixup_lock);
|
||||
- fixup_running = PR_TRUE;
|
||||
fixup_progress_count = 0;
|
||||
fixup_progress_elapsed = slapi_current_rel_time_t();
|
||||
fixup_start_time = slapi_current_rel_time_t();
|
||||
@@ -2849,11 +2865,10 @@ memberof_fixup_task_thread(void *arg)
|
||||
/* Mark this as a task operation */
|
||||
configCopy.fixup_task = 1;
|
||||
configCopy.task = task;
|
||||
-
|
||||
+ Slapi_DN *sdn = slapi_sdn_new_dn_byref(td->dn);
|
||||
if (usetxn) {
|
||||
- Slapi_DN *sdn = slapi_sdn_new_dn_byref(td->dn);
|
||||
Slapi_Backend *be = slapi_be_select_exact(sdn);
|
||||
- slapi_sdn_free(&sdn);
|
||||
+
|
||||
if (be) {
|
||||
fixup_pb = slapi_pblock_new();
|
||||
slapi_pblock_set(fixup_pb, SLAPI_BACKEND, be);
|
||||
@@ -2894,14 +2909,37 @@ done:
|
||||
fixup_progress_count, slapi_current_rel_time_t() - fixup_start_time);
|
||||
slapi_task_inc_progress(task);
|
||||
|
||||
+ /* Cleanup task linked list */
|
||||
+ PR_Lock(fixup_lock);
|
||||
+ mo_fixup_ll *prev = NULL;
|
||||
+ for (mo_fixup_ll *curr = fixup_list; curr; curr = curr->next) {
|
||||
+ mo_fixup_ll *next = curr->next;
|
||||
+ if (slapi_sdn_compare(curr->sdn, sdn) == 0 &&
|
||||
+ strcasecmp(curr->filter_str, td->filter_str) == 0)
|
||||
+ {
|
||||
+ /* free current code */
|
||||
+ slapi_sdn_free(&curr->sdn);
|
||||
+ slapi_ch_free_string(&curr->filter_str);
|
||||
+ slapi_ch_free((void**)&curr);
|
||||
+
|
||||
+ /* update linked list */
|
||||
+ if (prev == NULL) {
|
||||
+ /* first node */
|
||||
+ fixup_list = next;
|
||||
+ } else {
|
||||
+ prev->next = next;
|
||||
+ }
|
||||
+ break;
|
||||
+ }
|
||||
+ prev = curr;
|
||||
+ }
|
||||
+ PR_Unlock(fixup_lock);
|
||||
+ slapi_sdn_free(&sdn);
|
||||
+
|
||||
/* this will queue the destruction of the task */
|
||||
slapi_task_finish(task, rc);
|
||||
slapi_task_dec_refcount(task);
|
||||
|
||||
- PR_Lock(fixup_lock);
|
||||
- fixup_running = PR_FALSE;
|
||||
- PR_Unlock(fixup_lock);
|
||||
-
|
||||
slapi_log_err(SLAPI_LOG_INFO, MEMBEROF_PLUGIN_SUBSYSTEM,
|
||||
"memberof_fixup_task_thread - Memberof task finished (processed %d entries in %ld seconds)\n",
|
||||
fixup_progress_count, slapi_current_rel_time_t() - fixup_start_time);
|
||||
@@ -2919,23 +2957,13 @@ memberof_task_add(Slapi_PBlock *pb,
|
||||
int rv = SLAPI_DSE_CALLBACK_OK;
|
||||
task_data *mytaskdata = NULL;
|
||||
Slapi_Task *task = NULL;
|
||||
+ Slapi_DN *sdn = NULL;
|
||||
char *bind_dn;
|
||||
const char *filter;
|
||||
const char *dn = 0;
|
||||
|
||||
*returncode = LDAP_SUCCESS;
|
||||
|
||||
- PR_Lock(fixup_lock);
|
||||
- if (fixup_running) {
|
||||
- PR_Unlock(fixup_lock);
|
||||
- *returncode = LDAP_UNWILLING_TO_PERFORM;
|
||||
- slapi_log_err(SLAPI_LOG_ERR, MEMBEROF_PLUGIN_SUBSYSTEM,
|
||||
- "memberof_task_add - there is already a fixup task running\n");
|
||||
- rv = SLAPI_DSE_CALLBACK_ERROR;
|
||||
- goto out;
|
||||
- }
|
||||
- PR_Unlock(fixup_lock);
|
||||
-
|
||||
/* get arg(s) */
|
||||
if ((dn = slapi_entry_attr_get_ref(e, "basedn")) == NULL) {
|
||||
*returncode = LDAP_OBJECT_CLASS_VIOLATION;
|
||||
@@ -2949,6 +2977,39 @@ memberof_task_add(Slapi_PBlock *pb,
|
||||
goto out;
|
||||
}
|
||||
|
||||
+ PR_Lock(fixup_lock);
|
||||
+ sdn = slapi_sdn_new_dn_byval(dn);
|
||||
+ if (fixup_list == NULL) {
|
||||
+ fixup_list = (mo_fixup_ll *)slapi_ch_calloc(1, sizeof(mo_fixup_ll));
|
||||
+ fixup_list->sdn = sdn;
|
||||
+ fixup_list->filter_str = slapi_ch_strdup(filter);
|
||||
+ } else {
|
||||
+ for (mo_fixup_ll *fixup_task = fixup_list; fixup_task; fixup_task = fixup_task->next) {
|
||||
+ if (slapi_sdn_compare(sdn, fixup_task->sdn) == 0 &&
|
||||
+ strcasecmp(filter, fixup_task->filter_str) == 0)
|
||||
+ {
|
||||
+ /* Found an identical running task, reject it */
|
||||
+ PR_Unlock(fixup_lock);
|
||||
+ slapi_log_err(SLAPI_LOG_ERR, MEMBEROF_PLUGIN_SUBSYSTEM,
|
||||
+ "memberof_task_add - there is already an identical fixup task running: base: %s filter: %s\n",
|
||||
+ slapi_sdn_get_dn(sdn), filter);
|
||||
+ slapi_sdn_free(&sdn);
|
||||
+ *returncode = LDAP_UNWILLING_TO_PERFORM;
|
||||
+ rv = SLAPI_DSE_CALLBACK_ERROR;
|
||||
+ goto out;
|
||||
+ }
|
||||
+ }
|
||||
+ /* Add the new task DN to the top of the list */
|
||||
+ mo_fixup_ll *head = fixup_list;
|
||||
+ mo_fixup_ll *new_task = (mo_fixup_ll *)slapi_ch_calloc(1, sizeof(mo_fixup_ll));
|
||||
+ new_task->sdn = sdn;
|
||||
+ new_task->filter_str = slapi_ch_strdup(filter);
|
||||
+ new_task->next = head;
|
||||
+ fixup_list = new_task;
|
||||
+ }
|
||||
+ PR_Unlock(fixup_lock);
|
||||
+
|
||||
+
|
||||
/* setup our task data */
|
||||
slapi_pblock_get(pb, SLAPI_REQUESTOR_DN, &bind_dn);
|
||||
mytaskdata = (task_data *)slapi_ch_malloc(sizeof(task_data));
|
||||
--
|
||||
2.38.1
|
||||
|
@ -1,28 +0,0 @@
|
||||
From 7f0d007f3d15dec801acdaf3794f4e37db9c9875 Mon Sep 17 00:00:00 2001
|
||||
From: James Chapman <jachapma@redhat.com>
|
||||
Date: Wed, 9 Nov 2022 09:49:47 +0000
|
||||
Subject: [PATCH 1/2] Issue 5505 - Fix compiler warning (#5506)
|
||||
|
||||
relates: https://github.com/389ds/389-ds-base/issues/5505
|
||||
|
||||
Reviewed by: @Firstyear (Thanks)
|
||||
---
|
||||
ldap/servers/plugins/retrocl/retrocl_trim.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/ldap/servers/plugins/retrocl/retrocl_trim.c b/ldap/servers/plugins/retrocl/retrocl_trim.c
|
||||
index 37e5fbea7..d6b24c8bf 100644
|
||||
--- a/ldap/servers/plugins/retrocl/retrocl_trim.c
|
||||
+++ b/ldap/servers/plugins/retrocl/retrocl_trim.c
|
||||
@@ -23,7 +23,7 @@ typedef struct _trim_status
|
||||
int ts_s_trimming; /* non-zero if trimming in progress */
|
||||
PRLock *ts_s_trim_mutex; /* protects ts_s_trimming */
|
||||
} trim_status;
|
||||
-static trim_status ts = {0L, 0L, 0, 0, NULL};
|
||||
+static trim_status ts = {0};
|
||||
|
||||
/*
|
||||
* All standard changeLogEntry attributes (initialized in get_cleattrs)
|
||||
--
|
||||
2.38.1
|
||||
|
@ -1,85 +0,0 @@
|
||||
From 1a192048a49fcdfa8bcfe79e2fa86153b339fac1 Mon Sep 17 00:00:00 2001
|
||||
From: Mark Reynolds <mreynolds@redhat.com>
|
||||
Date: Tue, 13 Dec 2022 17:00:28 -0500
|
||||
Subject: [PATCH 2/2] Issue 5565 - Change default password storage scheme
|
||||
|
||||
Descriptrion: Becuase of replication we need to use a default storage scheme
|
||||
that works on 389-ds-base-1.3.10
|
||||
|
||||
relates: https://github.com/389ds/389-ds-base/issues/5565
|
||||
|
||||
Reviewed by: spichugi & firstyear(thanks!!)
|
||||
---
|
||||
.../tests/suites/healthcheck/health_security_test.py | 8 ++++----
|
||||
dirsrvtests/tests/suites/password/pwp_test.py | 2 +-
|
||||
ldap/servers/slapd/pw.c | 3 ++-
|
||||
src/lib389/lib389/config.py | 2 +-
|
||||
4 files changed, 8 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/dirsrvtests/tests/suites/healthcheck/health_security_test.py b/dirsrvtests/tests/suites/healthcheck/health_security_test.py
|
||||
index 519107365..d14b52c7a 100644
|
||||
--- a/dirsrvtests/tests/suites/healthcheck/health_security_test.py
|
||||
+++ b/dirsrvtests/tests/suites/healthcheck/health_security_test.py
|
||||
@@ -1,5 +1,5 @@
|
||||
# --- BEGIN COPYRIGHT BLOCK ---
|
||||
-# Copyright (C) 2020 Red Hat, Inc.
|
||||
+# Copyright (C) 2022 Red Hat, Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# License: GPL (version 3 or any later version).
|
||||
@@ -113,9 +113,9 @@ def test_healthcheck_insecure_pwd_hash_configured(topology_st):
|
||||
standalone.config.set('passwordStorageScheme', 'SSHA512')
|
||||
standalone.config.set('nsslapd-rootpwstoragescheme', 'SSHA512')
|
||||
else:
|
||||
- log.info('Set passwordStorageScheme and nsslapd-rootpwstoragescheme to PBKDF2-SHA512')
|
||||
- standalone.config.set('passwordStorageScheme', 'PBKDF2-SHA512')
|
||||
- standalone.config.set('nsslapd-rootpwstoragescheme', 'PBKDF2-SHA512')
|
||||
+ log.info('Set passwordStorageScheme and nsslapd-rootpwstoragescheme to PBKDF2_SHA256')
|
||||
+ standalone.config.set('passwordStorageScheme', 'PBKDF2_SHA256')
|
||||
+ standalone.config.set('nsslapd-rootpwstoragescheme', 'PBKDF2_SHA256')
|
||||
|
||||
run_healthcheck_and_flush_log(topology_st, standalone, json=False, searched_code=CMD_OUTPUT)
|
||||
run_healthcheck_and_flush_log(topology_st, standalone, json=True, searched_code=JSON_OUTPUT)
|
||||
diff --git a/dirsrvtests/tests/suites/password/pwp_test.py b/dirsrvtests/tests/suites/password/pwp_test.py
|
||||
index ce45bc364..190881222 100644
|
||||
--- a/dirsrvtests/tests/suites/password/pwp_test.py
|
||||
+++ b/dirsrvtests/tests/suites/password/pwp_test.py
|
||||
@@ -27,7 +27,7 @@ else:
|
||||
if is_fips():
|
||||
DEFAULT_PASSWORD_STORAGE_SCHEME = 'SSHA512'
|
||||
else:
|
||||
- DEFAULT_PASSWORD_STORAGE_SCHEME = 'PBKDF2-SHA512'
|
||||
+ DEFAULT_PASSWORD_STORAGE_SCHEME = 'PBKDF2_SHA256'
|
||||
|
||||
|
||||
def _create_user(topo, uid, cn, uidNumber, userpassword):
|
||||
diff --git a/ldap/servers/slapd/pw.c b/ldap/servers/slapd/pw.c
|
||||
index 825498858..566ba87dd 100644
|
||||
--- a/ldap/servers/slapd/pw.c
|
||||
+++ b/ldap/servers/slapd/pw.c
|
||||
@@ -280,7 +280,8 @@ pw_name2scheme(char *name)
|
||||
} else {
|
||||
/* if not, let's setup pbkdf2 */
|
||||
#ifdef RUST_ENABLE
|
||||
- char *pbkdf = "PBKDF2-SHA512";
|
||||
+ /* until 1.3.10 supports Rust hashers we can't use PBKDF2-SHA512 by default */
|
||||
+ char *pbkdf = "PBKDF2_SHA256";
|
||||
#else
|
||||
char *pbkdf = "PBKDF2_SHA256";
|
||||
#endif
|
||||
diff --git a/src/lib389/lib389/config.py b/src/lib389/lib389/config.py
|
||||
index c7abdf778..c178eb02f 100644
|
||||
--- a/src/lib389/lib389/config.py
|
||||
+++ b/src/lib389/lib389/config.py
|
||||
@@ -209,7 +209,7 @@ class Config(DSLdapObject):
|
||||
yield report
|
||||
|
||||
def _lint_passwordscheme(self):
|
||||
- allowed_schemes = ['SSHA512', 'PBKDF2-SHA512', 'GOST_YESCRYPT']
|
||||
+ allowed_schemes = ['SSHA512', 'PBKDF2_SHA256', 'GOST_YESCRYPT']
|
||||
u_password_scheme = self.get_attr_val_utf8('passwordStorageScheme')
|
||||
u_root_scheme = self.get_attr_val_utf8('nsslapd-rootpwstoragescheme')
|
||||
if u_root_scheme not in allowed_schemes or u_password_scheme not in allowed_schemes:
|
||||
--
|
||||
2.38.1
|
||||
|
Loading…
Reference in new issue