Summary
After a Class of Service is deleted, accounts that still reference it keep the dangling zimbraCOSId. LDAP-side lookups fall back to the default COS, but the mailbox service keeps serving the old COS's values from its account cache, so the two views of the same account disagree until the account cache is flushed.
What we saw
- About 190 accounts on one server had
zimbraCOSIdset to three COS ids that no longer existed (carbonio prov gaclisted onlydefaultanddefaultExternal; no domain default COS). carbonio prov mc default zimbraFeatureMailSendLaterEnabled TRUE, then:carbonio prov -l ga user@example.com zimbraFeatureMailSendLaterEnabledreturns TRUE (LDAP, falls back to default)carbonio prov ga user@example.com zimbraFeatureMailSendLaterEnabledreturns FALSE (mailbox service)carbonio prov fc -a cosdid not change the second result.
carbonio prov mc <dangling-cos-id> ...givesERROR: account.NO_SUCH_COS.- Only
carbonio prov fc accountmade the mailbox service return TRUE. Accounts that were not in the cache already returned TRUE.
Expected: either deleting a COS that accounts still reference is refused (or the accounts are moved to the domain/global default), or the mailbox service resolves a missing COS the same way as the LDAP lookup and a COS change/flush reaches it.
Steps to reproduce
- Create COS
tmp, assign it to an account, log in to that account (so it is cached). - Delete COS
tmp(the account keepszimbraCOSId= the deleted id). - Change an attribute on
default, e.g.zimbraFeatureMailSendLaterEnabled TRUE, andprov fc -a cos. - Compare
prov -l ga <account> <attr>withprov ga <account> <attr>.
Environment: Carbonio CE 25.x (4.25.2_ZEXTRAS_202603), Ubuntu 24.04, single server, 307 mailboxes. How the COSes came to be deleted is not known (older admin action).
Also filed on GitHub: https://github.com/zextras/carbonio-mailbox/issues/1172
