Knowledge base

Different domains in one queue, because the gateway is the same

critical

MX rollup
The mechanism without which a per-provider limit does not work

A receiving server sees not domains but its own infrastructure. Five corporate domains on one Exchange, ten thousand domains at a hosting provider, msn.com, live.com and hotmail.com behind one gateway — to it this is a single entrance, and it counts the load by that. The node, by default, counts by the recipient domain: five domains mean five queues, each with its own rate, and the gateway receives their sum.

Rollup fixes the discrepancy. Domains whose lowest-priority MX records match the configured list go into one queue, and everything counted “per receiver” — rate, connection ceiling, backoff mode, metrics — is counted by it.

There are two kinds of rollup, and they are not equal. The explicit one is the <mx-rollup-list> block, where you list the MX records and the queue name yourself. The automatic one is auto-mx-rollup, where the node itself groups domains with the same set of lowest-priority MX records. The explicit one takes precedence: the automatic one is considered only where no match was found in the list. You can opt a specific domain out of both with the disable-mx-rollup line.

The main trap is a silent mismatch. If the list names more lowest-priority MX records for the queue than DNS actually returns, no match happens. It is neither a configuration error nor a log entry: the domain simply keeps going through its own queue, while you believe it is rolled up and wonder why the limit does not hold.
What the Hub does. It does not use it: it writes no rollup lists, and there is no auto-mx-rollup in its configuration. The Hub groups providers on its own side — in analytics and in policy rules — while the queues on the node remain per-domain. This discrepancy is deliberate: rollup changes the structure of queues, and a human should decide on it.
Example configuration
# explicit rollup: we list the lowest-priority MX records and the queue name
<mx-rollup-list>
    mx mx1.hotmail.com hotmail.rollup
    mx mx2.hotmail.com hotmail.rollup
    mx *.mail.protection.outlook.com outlook.rollup rollup-by-ip</mx-rollup-list>

# the rolled-up queue is described separately — exactly as the vendor advises
<domain hotmail.rollup>
    max-smtp-out 20
    smtp-hosts lookup-mx:hotmail.com
</domain>
The queue name must end in .rollup. For a queue with a wildcard and without the rollup-by-ip flag, the smtp-hosts line is required: the node cannot derive MX records for all the domains of such a queue.
yellow — — directive names, blue — blocks. They are highlighted the same way in the text of the card.
▲

Common mistakes and problems

what people get wrong and how it ends3 mistakes▶

Listing all MX records, not just the lowest-priority ones

§ 11.16

What it costsThere will be no match: the node compares the set of lowest-priority MX records, and an extra line in the list cancels it. The error is silent — no refusal, no log entry; the domain simply goes through its own queue.
How to spot itA .rollup queue has been created, but the receiver does not get into it.
How to do it rightLeave only the records with the lowest priority in the list (dig +short MX and take the top group).

Creating a wildcard queue without smtp-hosts

§ 11.16

What it costsThe node cannot derive MX records for all the domains of such a queue and does not know where to knock. The manual makes this line a requirement, not a recommendation.
How to spot itThe queue exists, messages sit in it, there are no connections.
How to do it rightSet smtp-hosts in the rolled-up queue’s block — or add the rollup-by-ip flag, and then the node will fill in the hosts itself.

Configuring a rollup-by-ip queue by its name from the list

§ 11.16

What it costsWhen grouping by address, the node makes up the queue names itself and adds a numeric prefix: q1.outlook.rollup, q2.outlook.rollup. A block named outlook.rollup will not fit any of them, and the settings will not apply.
How to spot itThe rolled-up queue’s settings are ignored; the list of queues has names with a q prefix and a digit.
How to do it rightDescribe such queues with the [*].outlook.rollup pattern.
Compatibility
PowerMTA 6.0
described in the manual of this version · platform: any
The vendor does not state the first version for every directive — there is no note here. The name also appears in the 5.0 edition of the manual.
How to check on the node
Rollup shows in the list of queues: a rolled-up queue’s name ends in .rollup, and it contains more than one domain:
pmta show queues | grep -i rollup
dig +short MX example.com | sort -n | head -3
The second command shows the receiver’s lowest-priority MX records — these are what to compare with the list: an extra line in the list silently cancels the match. The Hub shows rolled-up queues in telemetry as regular ones.
In the Hub
Cost of a mistake
reversible: harms only while it is set
Scenarios
Capacity planning · Tune the pace for a provider
Priority
critical