diff options
author | Martin Polden <mpolden@mpolden.no> | 2020-06-17 13:30:55 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2020-06-17 13:56:59 +0200 |
commit | 68c3ecd41b82efe6fb30645774d5349b2fd37c48 (patch) | |
tree | c6c31f84c5ab7bb137306c6901b3a53068933e2f /controller-api | |
parent | 544ba2e3d8cc1e4f1766ead5651712401d98a86f (diff) |
Handle existing A record for config server LB
Diffstat (limited to 'controller-api')
-rw-r--r-- | controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/MemoryNameService.java | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/MemoryNameService.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/MemoryNameService.java index b54446c071e..59324079e6f 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/MemoryNameService.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/dns/MemoryNameService.java @@ -5,6 +5,7 @@ package com.yahoo.vespa.hosted.controller.api.integration.dns; import java.util.Collections; import java.util.Comparator; import java.util.List; +import java.util.Optional; import java.util.Set; import java.util.TreeSet; import java.util.stream.Collectors; @@ -22,11 +23,11 @@ public class MemoryNameService implements NameService { return Collections.unmodifiableSet(records); } - private void add(Record record) { - if (records.stream().anyMatch(r -> r.type().equals(record.type()) && - r.name().equals(record.name()) && - r.data().equals(record.data()))) { - throw new IllegalArgumentException("Record already exists: " + record); + public void add(Record record) { + Optional<Record> conflict = records.stream().filter(r -> conflicts(r, record)).findFirst(); + if (conflict.isPresent()) { + throw new AssertionError("'" + record + "' conflicts with existing record '" + + conflict.get() + "'"); } records.add(record); } @@ -45,8 +46,9 @@ public class MemoryNameService implements NameService { .map(target -> new Record(Record.Type.ALIAS, name, target.asData())) .collect(Collectors.toList()); // Satisfy idempotency contract of interface - removeRecords(records); - records.forEach(this::add); + records.stream() + .filter(r -> !this.records.contains(r)) + .forEach(this::add); return records; } @@ -108,4 +110,15 @@ public class MemoryNameService implements NameService { this.records.removeAll(records); } + /** + * Returns whether record r1 and r2 can co-exist in a name service. This attempts to enforce the same constraints as + * most real name services. + */ + private static boolean conflicts(Record r1, Record r2) { + if (!r1.name().equals(r2.name())) return false; // Distinct names never conflict + if (r1.type() == Record.Type.ALIAS && r1.type() == r2.type()) // ALIAS records only require distinct data + return r1.data().equals(r2.data()); + return true; // Anything else is considered a conflict + } + } |