Fix ProxySQL rule sanity check to support username-based routing

Kolla Ansible now generates ProxySQL query rules not only based on
the schema name (schemaname), but also on the username. This is
needed to properly route queries that are executed before a database
schema is selected, such as `SET AUTOCOMMIT` or `ROLLBACK`.

To support this, the ProxySQL config sanity check must correctly
deduplicate rules based on both `schemaname` and `username`, and
avoid false positives when both types are used simultaneously.

This change adjusts the logic in `kolla_proxysql_config_sync` to:
- recognize rules by key `schema:<schemaname>` or `user:<username>`
- assign unique rule IDs only to truly distinct rules
- log and skip exact duplicates with appropriate context

This fix is required to support the Kolla Ansible patch below.

Needed-By: https://review.opendev.org/c/openstack/kolla-ansible/+/951599

Change-Id: I99acd1984ee555a5b6c731e6ee460a33677060d0
This commit is contained in:
Michal Arbet
2025-06-04 09:40:03 +02:00
parent 9a5315e9d2
commit b643e8f9fd

View File

@@ -93,14 +93,24 @@ class ProxySQLConfig:
rules = list()
rule_id = 1
for rule in self.config['mysql_query_rules']:
if rule['schemaname'] not in rules_added:
rules_added.append(rule['schemaname'])
if 'schemaname' in rule:
key = f"schema:{rule['schemaname']}"
elif 'username' in rule:
key = f"user:{rule['username']}"
else:
LOG.warning(
f"Rule without schemaname or username found, skipping: {rule}"
)
continue
if key not in rules_added:
rules_added.append(key)
rule['rule_id'] = rule_id
rules.append(rule)
rule_id += 1
else:
LOG.warning("Rule witch schemaname {} already exist, ignoring."
.format(rule['schemaname']))
LOG.warning("Duplicate rule for {}, ignoring.".format(key))
self.config['mysql_query_rules'] = rules
def _write_dict(self, key, value):