-
Notifications
You must be signed in to change notification settings - Fork 3.9k
Modify default queue type injection logic #13837
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
The correct place for the `default_queue_type` property is inside the `metadata` block. However, right now we'd always export the value outside of `metadata` AND only export it inside `metadata`, if it was not `undefined`. This value outside of `metadata` was just misleading: if a user exported the definitins from a fresh node, changed `classic` to `quorum` and imported such modified values, the DQT would still be `classic`, because RMQ looks for the value inside `metadata`. Just to make it more confusing, if the DQT was changed successfully one way or another, the value outside of `metadata` would reflect that (it always shows the correct value, but is ignored on import).
Rather than injecting node-level DQT when exporting definitions, inject it into vhost's metadata when a vhost is created.
Vhosts that currently don't have their own default queue type, now inherit it from the node configuration and store it in their metadata going forward.
@lukebakken @mkuratczyk and I have discussed this in detail, there is also at least one related change in With this change, the injection of the DQT moves from definition export time to virtual host creation time, which is easier to reason about and avoids inconsistent or surprising behavior in a number of scenarios. |
@mkuratczyk FTR, the |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM. It seems the cleanest and simplest way to present the info.
Modify default queue type injection logic (backport #13837)
There were a few issues:
rabbitmqctl export definitions -
would export thedefault_queue_type
within vhost's metadata if set explicitly (correct) but also outside of themetadata
block even if not set explicitly for the vhost (not correct)rabbitmqadmin
would always export the default queue type in both placesmetadata
block is just redundantmetadata
block is inconsistent withrabbitmqctl export_definitions
(the difference stems from the fact that CTL only exports existing vhosts' metadata, while HTTP API injects the configuration-level DQT into each vhost'smetadata
upon export)This PR changes the DQT logic: no DQT is injected upon export because it's injected/inherited from the node's configuration into vhost's metadata when a vhost is declared. Therefore each vhost has its own DQT explicitly defined and it's always present in any export (both CTL and HTTP API).
The downsides of this approach is that export/import between systems with a different configuration-level DQT will now require adjusting the DQT in the JSON file
However the logic is should be easier now and more consistent with how queue-level DQT works: when a queue is declared without a type, the default queue type is injected. Going forward, DQT changes don't affect the queue. Similarly, now if a vhost with no DQT is declared, configuration-level DQT is injected and configuration changes don't affect existing vhosts.