TechnitiumSoftware/DnsServer · error · DnsServerException
Failed to initialize Cluster: the zone '{clusterCatalogZoneI
Error message
Failed to initialize Cluster: the zone '{clusterCatalogZoneInfo.Name}' already exists and is not a Catalog zone. Please delete the existing zone or use a different Cluster domain name. What it means
Thrown by InitializeCluster when the catalog zone name ('cluster-catalog.' + clusterDomain) already exists but is not of type AuthZoneType.Catalog. The catalog zone is a special zone type used for XFR-based replication of member zones; a non-catalog zone under that name cannot serve that purpose, so initialization aborts.
Source
Thrown at DnsServerCore/Cluster/ClusterManager.cs:573
}
else if (clusterZoneInfo.Type != AuthZoneType.Primary)
{
throw new DnsServerException($"Failed to initialize Cluster: the zone '{clusterZoneInfo.Name}' already exists and is not a Primary zone. Please delete the existing zone or use a different Cluster domain name.");
}
//create cluster catalog zone
string clusterCatalogDomain = "cluster-catalog." + clusterDomain;
AuthZoneInfo clusterCatalogZoneInfo = _dnsWebService.DnsServer.AuthZoneManager.GetAuthZoneInfo(clusterCatalogDomain);
if (clusterCatalogZoneInfo is null)
{
clusterCatalogZoneInfo = _dnsWebService.DnsServer.AuthZoneManager.CreateCatalogZone(clusterCatalogDomain);
if (clusterCatalogZoneInfo is null)
throw new DnsServerException($"Failed to initialize Cluster: failed to create the Cluster Catalog zone '{clusterCatalogDomain}'. Please try again.");
}
else if (clusterCatalogZoneInfo.Type != AuthZoneType.Catalog)
{
throw new DnsServerException($"Failed to initialize Cluster: the zone '{clusterCatalogZoneInfo.Name}' already exists and is not a Catalog zone. Please delete the existing zone or use a different Cluster domain name.");
}
//set cluster primary zone permissions
_dnsWebService.AuthManager.SetPermission(PermissionSection.Zones, clusterZoneInfo.Name, _dnsWebService.AuthManager.GetGroup(Group.ADMINISTRATORS), PermissionFlag.ViewModifyDelete);
_dnsWebService.AuthManager.SetPermission(PermissionSection.Zones, clusterZoneInfo.Name, _dnsWebService.AuthManager.GetGroup(Group.DNS_ADMINISTRATORS), PermissionFlag.View);
//set cluster catalog zone permissions
_dnsWebService.AuthManager.SetPermission(PermissionSection.Zones, clusterCatalogZoneInfo.Name, _dnsWebService.AuthManager.GetGroup(Group.ADMINISTRATORS), PermissionFlag.ViewModifyDelete);
_dnsWebService.AuthManager.SetPermission(PermissionSection.Zones, clusterCatalogZoneInfo.Name, _dnsWebService.AuthManager.GetGroup(Group.DNS_ADMINISTRATORS), PermissionFlag.View);
//ensure cluster zone is a member of cluster catalog zone
if (clusterZoneInfo.CatalogZoneName is null)
_dnsWebService.DnsServer.AuthZoneManager.AddCatalogMemberZone(clusterCatalogZoneInfo.Name, clusterZoneInfo);
else if (!clusterZoneInfo.CatalogZoneName.Equals(clusterCatalogZoneInfo.Name, StringComparison.OrdinalIgnoreCase))
_dnsWebService.DnsServer.AuthZoneManager.ChangeCatalogMemberZoneOwnership(clusterZoneInfo, clusterCatalogZoneInfo.Name);
//sign cluster zone
if (clusterZoneInfo.ApexZone.DnssecStatus == AuthZoneDnssecStatus.Unsigned)View on GitHub (pinned to d0484b6c1e)
Solutions
- Delete the existing zone named 'cluster-catalog.{domain}' so InitializeCluster can create a proper catalog zone, then retry.
- Use a different cluster domain name to avoid the naming collision entirely.
Example fix
// before
_dnsWebService.ClusterManager.InitializeCluster("dns.example.com", ips, session);
// after
var catalogZone = _dnsWebService.DnsServer.AuthZoneManager.GetAuthZoneInfo("cluster-catalog.dns.example.com");
if (catalogZone is not null && catalogZone.Type != AuthZoneType.Catalog)
_dnsWebService.DnsServer.AuthZoneManager.DeleteZone(catalogZone.Name);
_dnsWebService.ClusterManager.InitializeCluster("dns.example.com", ips, session); Defensive patterns
Strategy: validation
Validate before calling
// Check for a conflicting non-catalog catalog-zone before initializing
string clusterDomain = "dns.example.com";
string catalogDomain = "cluster-catalog." + clusterDomain;
var catalogZone = _dnsWebService.DnsServer.AuthZoneManager.GetAuthZoneInfo(catalogDomain);
if (catalogZone is not null && catalogZone.Type != AuthZoneType.Catalog)
throw new InvalidOperationException($"Zone '{catalogZone.Name}' exists as {catalogZone.Type}; delete it before InitializeCluster.");
_dnsWebService.ClusterManager.InitializeCluster(clusterDomain, ips, session); Type guard
static bool IsCatalogZoneSafeForClusterInit(AuthZoneInfo zone, string catalogDomain)
=> zone is null || (zone.Name.Equals(catalogDomain, StringComparison.OrdinalIgnoreCase) && zone.Type == AuthZoneType.Catalog); Try / catch
try
{
_dnsWebService.ClusterManager.InitializeCluster(clusterDomain, ips, session);
}
catch (DnsServerException ex) when (ex.Message.Contains("already exists and is not a Catalog zone"))
{
throw new InvalidOperationException("The cluster-catalog zone name is taken by a non-catalog zone. Delete it or use a different domain.", ex);
} Prevention
- Before InitializeCluster, check GetAuthZoneInfo for 'cluster-catalog.{domain}' and ensure it is absent or Catalog type.
- Do not manually create zones with the 'cluster-catalog.' prefix.
- Clean up catalog zones left by aborted cluster setups.
When it happens
Trigger: InitializeCluster is called when GetAuthZoneInfo('cluster-catalog.{domain}') returns a non-null zone whose Type is not AuthZoneType.Catalog (e.g., it was created as Primary, Secondary, Stub, or Forwarder). The else-if at line 571 fires.
Common situations: Leftover catalog zone from a previous cluster that was manually converted to another type; a user-created zone with the 'cluster-catalog.' prefix; partial cleanup after a failed or aborted cluster initialization that left a primary zone behind under the catalog name.
Related errors
- Failed to initialize Cluster: the zone '{clusterZoneInfo.Nam
- Failed to initialize Cluster: failed to create the Cluster z
- Failed to initialize Cluster: failed to create the Cluster C
- Failed to initialize Cluster: the Cluster is already initial
- Failed to initialize Cluster: a SSO user cannot initialize c
AI-assisted analysis of TechnitiumSoftware/DnsServer@d0484b6c1e (2026-08-13).
Data as JSON: /api/errors/c156d535107bcfc5.
Report an issue: GitHub.