User Directory (Active Directory) Synchronisation is failing with 'NullPointerException' at MicrosoftActiveDirectory.fetchInvocationId
Platform notice: Server and Data Center only. This article only applies to Atlassian products on the Server and Data Center platforms.
Support for Server* products ended on February 15th 2024. If you are running a Server product, you can visit the Atlassian Server end of support announcement to review your migration options.
*Except Fisheye and Crucible
Summary
External User Directory Synchronisation fails with error 'java.lang.NullPointerException' in the logs
Environment
External AD is Microsoft Active Directory.
Diagnosis
Below events can be seen in atlassian-confluence.log:
2023-01-09 14:20:13,617 ERROR [Caesium-1-3] [atlassian.crowd.directory.DbCachingDirectoryPoller] pollChanges Error occurred while refreshing the cache for directory [ XXXXXXXXX ].
java.lang.NullPointerException
at java.naming/javax.naming.ldap.Rfc2253Parser.<init>(Unknown Source)
at java.naming/javax.naming.ldap.LdapName.parse(Unknown Source)
at java.naming/javax.naming.ldap.LdapName.<init>(Unknown Source)
at com.atlassian.crowd.directory.MicrosoftActiveDirectory.fetchInvocationId(MicrosoftActiveDirectory.java:716)
at com.atlassian.crowd.directory.synchronisation.cache.UsnChangedCacheRefresher.synchroniseAll(UsnChangedCacheRefresher.java:179)
at com.atlassian.crowd.directory.DbCachingRemoteDirectory.synchroniseCache(DbCachingRemoteDirectory.java:1098)
at com.atlassian.crowd.manager.directory.DirectorySynchroniserImpl.lambda$synchronise$0(DirectorySynchroniserImpl.java:82)
at com.atlassian.crowd.audit.NoOpAuditLogContext.withAuditLogSource(NoOpAuditLogContext.java:17)
at com.atlassian.crowd.manager.directory.DirectorySynchroniserImpl.synchronise(DirectorySynchroniserImpl.java:80)
at com.atlassian.crowd.directory.DbCachingDirectoryPoller.pollChanges(DbCachingDirectoryPoller.java:45)
at com.atlassian.crowd.manager.directory.monitor.poller.DirectoryPollerJobRunner.runJob(DirectoryPollerJobRunner.java:92)
Cause
- Taking a close look at the logs will tell us that the sync is failing at "MicrosoftActiveDirectory.fetchInvocationId".
- Confluence tries to get the InvocationID from the AD server, as per this change performed for CWD-2783 - Detect Active Directory server to handle usnChanged attribute correctly.
- Invocation Id is AD instance identifier. Confluence uses it to detect if it is synchronising against the same AD node as in previous synchronisation.
- This is important when AD is load balanced. If AD invocationId is changed, then Confluence will fallback to full synchronisation.
- InvocationId is also fetched during full synchronisation (for future incremental synchronisations - even if incremental synchronisation is disabled).
- Incase the AD returns a Null invocation ID , Confluence will throw a Null pointer exception
- The reason why AD returns a Null Invocation ID , needs to be checked with the AD admin
Solution
- Change the directory type for your user directory to "Generic Directory server"
- When the Directory Type is "Generic Directory server" , invocation Id will not be fetched