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

  1. Delete the existing zone named 'cluster-catalog.{domain}' so InitializeCluster can create a proper catalog zone, then retry.
  2. 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

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


AI-assisted analysis of TechnitiumSoftware/DnsServer@d0484b6c1e (2026-08-13). Data as JSON: /api/errors/c156d535107bcfc5. Report an issue: GitHub.