[Date Prev][Date Next] [Chronological] [Thread] [Top]

(ITS#9150) olcDbNoSync: FALSE has the same effect as olcDbNoSync: TRUE



Full_Name: Maxime Besson
Version: 2.4.48
OS: Debian Buster / CentOS7
URL: ftp://ftp.openldap.org/incoming/
Submission from: (NULL) (2a01:cb00:802:8400:2cbe:3c60:fca6:e50b)


While migrating configuration from slapd.conf to cn=config, I noticed something
pretty strange related to the dbnosync option

The result of converting the following config:

include		./core.schema
pidfile		./slapd.1.pid
argsfile	./slapd.1.args


database	mdb
suffix		"dc=example,dc=com"
rootdn		"cn=Manager,dc=example,dc=com"
rootpw		secret
directory	db.1.a
index		objectClass	eq
index		cn,sn,uid	pres,eq,sub
index		entryUUID,entryCSN	eq


Is (only interested in MDB config):
# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
# CRC32 3df9c3d6
dn: olcDatabase={1}mdb
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: {1}mdb
olcSuffix: dc=example,dc=com
olcAddContentAcl: FALSE
olcLastMod: TRUE
olcMaxDerefDepth: 15
olcReadOnly: FALSE
olcRootDN: cn=Manager,dc=example,dc=com
olcRootPW:: c2VjcmV0
olcSyncUseSubentry: FALSE
olcMonitoring: TRUE
olcDbDirectory: db.1.a
olcDbNoSync: FALSE
olcDbIndex: objectClass eq
olcDbIndex: entryUUID eq
olcDbIndex: entryCSN eq
olcDbIndex: cn pres,eq,sub
olcDbIndex: uid pres,eq,sub
olcDbIndex: sn pres,eq,sub
olcDbMaxReaders: 0
olcDbMaxSize: 10485760
olcDbMode: 0600
olcDbSearchStack: 16
olcDbMaxEntrySize: 0
olcDbRtxnSize: 10000


As you can see, olcDbNoSync has the value FALSE, because there was no "dbnosync"
option in slapd.conf, however, performance testing shows a dramatic increase in
write speed after slapd.d migration. Which seems odd to me. It seems like the
MDB database was not syncing to disk anymore despite olcDbNoSync being FALSE

Removing olcDbNoSync: FALSE from cn=config did restore previous performance and
syncing behavior

Looking at  servers/slapd/back-mdb/config.c:723 I found this: 

  case MDB_DBNOSYNC:
    if ( c->value_int )
            mdb->mi_dbenv_flags |= MDB_NOSYNC;
        else
            mdb->mi_dbenv_flags ^= MDB_NOSYNC;
           

The else case seems wrong, I replaced it with 

  case MDB_DBNOSYNC:
   if ( c->value_int )
            mdb->mi_dbenv_flags |= MDB_NOSYNC;
        else
            mdb->mi_dbenv_flags &= ~MDB_NOSYNC;
 
And it solves the issue on my system.

Reproduced on master, and 2.4.48, on Debian