Add unique constraint to IntegerKeyValueSetting.key
IntegerKeyValueSetting is used as a singleton-style key/value store: callers do get(key=...) and get_or_create(key=..., ...) and assume at most one row per key. The model, however, did not enforce uniqueness on the key field, so nothing prevented duplicate rows at the database level. This was a real race for _create_soa_rdataset in catalog_zone_manager, which calls get_or_create without select_for_update (unlike increment_soa_serial, which does take a lock). Two concurrent AXFR queries for a catalog zone could both pass the get_or_create existence check and both insert a row for key='catalog-zone-soa-serial'. Every subsequent IntegerKeyValueSetting.objects.get(key=...) call would then raise MultipleObjectsReturned, breaking catalog-zone SOA rendering and serial increments. Add unique=True to the key CharField and ship migration 0003 to enforce the invariant at the database level. Existing deployments are assumed to have clean state (no duplicate keys); if duplicates exist, the migration should be preceded by manual deduplication.
This commit is contained in:
1 parent
55c562d5a7
commit
ad0397bf61
2 files changed
+17
-1
No files matched your search
@@ -0,0 +1,16 @@
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
("netbox_dns_bridge", "0002_alter_integerkeyvaluesetting_options_and_more"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name="integerkeyvaluesetting",
|
||||
name="key",
|
||||
field=models.CharField(max_length=64, unique=True),
|
||||
),
|
||||
]
|
||||
Reference in new issue
Block a user