There are a number of different DS settings at play that can
potentially cause conflicts. The question is: do we want to get into
the business of enumerating all those possible conflicting settings or
just simply prohibit duplicate origins altogether? I think we can dig
in and get that "sufficiently advanced sql query" to check for
conflicting origins, but is that something we want to carry along for
the foreseeable future? Aren't CNAMEs relatively cheaper than
developing and maintaining that code and the mental overhead required
in understanding why you're getting an error that says your requested
DS would cause an origin conflict? I think at the point you've
requested a DS that would create a conflict, you've chosen those
settings for a reason and would probably prefer to just create/use a
CNAME in your new DS and keep the rest of your settings the same.

Thinking in terms of errors, I'm imagining:
"cannot create delivery service: origin fqdn 'foo.example.com' already in use"
vs
"cannot create delivery service: origin fqdn 'foo.example.com' already
in use as type DNS_LIVE_NATNL, which is incompatible with your chosen
type of HTTP_NO_CACHE"

At that point you'd probably say to yourself, "uh, I need
HTTP_NO_CACHE, so what am I supposed to do now?"

As a lazy developer I'm +1 on prohibiting duplicate origin fqdns
because the resulting code will be simpler, but I think eliminating
the mental overhead for operators could be worthwhile too. If we can
agree on an end state of prohibiting duplicate origins altogether, we
can start working on a design to smoothly transition us to that point.
Are we willing to live with "just CNAME your origin fqdn" as the
standard solution to duplicates?

- Rawlin


On Tue, Dec 18, 2018 at 1:27 PM Gelinas, Derek
<[email protected]> wrote:
>
> The only situation in which they can share origins is if a) the origins are 
> shared in an MSO configuration but still have different defined origin fields 
> in the delivery service, or if they're assigned to completely different 
> cachegroups.  It's when two delivery services share the same edges that 
> there's an issue, because you end up with parent.config issues.  Actually you 
> could even get away with it in mids as long as you weren't doing anything 
> like MSO to it.
>
> Could get messy real fast, though.  Best to just create a second FQDN.
>
> Derek
>
> On 12/18/18, 3:23 PM, "Fieck, Brennan" <[email protected]> wrote:
>
>     So no two Delivery Services may share an origin *regardless of cache 
> hierarchy* ? I've been told that DNS Delivery Services can have the same 
> origin as HTTP Delivery Services because they obey the same cache hierarchy. 
> You're saying that would still produce invalid output and/or is explicitly 
> disallowed by ATS?
>     ________________________________________
>     From: Robert Butts <[email protected]>
>     Sent: Tuesday, December 18, 2018 1:09 PM
>     To: [email protected]
>     Subject: Re: [EXTERNAL] Re: Origins assigned to Multipe Delivery Services 
> produces indeterminate parent.config
>
>     >can you give an example of what parent.config looks like when 2 ds's 
> share
>     an origin and have different a different topology?
>
>     Answering because I encountered this directly, when rewriting 
> parent.config.
>
>     For example: Suppose you have one Delivery Service:
>     XML_ID: foo
>     Type: HTPT_LIVE_NATL
>     Query String Handling: 1 - ignore in cache key, and pass up
>     Origin Server Base URL: http://foo.example.net
>
>     And another Delivery Service:
>     XML_ID: bar
>     Type: HTPT_LIVE_NATL
>     Query String Handling: 1 - ignore in cache key, and pass up
>     Origin Server Base URL: http://foo.example.net
>
>     ATS only supports unique `dest_domain` entries in parent.config. 
> Therefore,
>     the parent.config generated for a server assigned to both of these 
> Delivery
>     Services with either be:
>
>     dest_domain=foo.example.net port=80 go_direct=true
>
>     Or
>
>     dest_domain=foo.example.net port=80 go_direct=false qstring=consider
>
>     Right now, it's arbitrary which Perl Traffic Ops inserts, and Perl 
> provides
>     no warning or error of any kind (the pending Go parent.config PR logs an
>     error).
>
>     Whichever is arbitrarily inserted, the resulting remaps for the other
>     delivery service will be wrong. Either `foo` requests will drop the query
>     string when they shouldn't, and go to the mid when they shouldn't; or 
> `bar`
>     requests will use the query string and skip the mid when it shouldn't.
>
>
>     Does that make sense? The only correct solution, is to somehow prevent
>     different DSes having the same origin, and tell tenants they must use
>     CNAMEs if they need.
>
>     This isn't a bug in Traffic Control. ATS fundamentally doesn't support
>     multiple remap rules with the same parent FQDN with different
>     configurations. Hence, Traffic Control needs to prohibit that.
>
>
>     On Tue, Dec 18, 2018 at 12:24 PM Jeremy Mitchell <[email protected]>
>     wrote:
>
>     > brennan,
>     >
>     > can you give an example of what parent.config looks like when 2 ds's 
> share
>     > an origin and have different a different topology?
>     >
>     > jeremy
>     >
>     > On Tue, Dec 18, 2018 at 11:39 AM Fieck, Brennan 
> <[email protected]
>     > >
>     > wrote:
>     >
>     > > To be clear, the "Warning" I'm talking about would happen at startup, 
> but
>     > > I'd like a UI-only constraint to come with that to disallow using the 
> API
>     > > to bind the same origin to multiple Delivery Services with varying
>     > > topography requirements. It wouldn't change the existing data, but
>     > prevent
>     > > users from creating more bad data.
>     > >
>     > > "warning" doesn't really sufficiently describe that, my bad.
>     > > ________________________________________
>     > > From: Fieck, Brennan <[email protected]>
>     > > Sent: Tuesday, December 18, 2018 11:24 AM
>     > > To: [email protected]
>     > > Subject: Re: [EXTERNAL] Re: Origins assigned to Multipe Delivery 
> Services
>     > > produces indeterminate parent.config
>     > >
>     > > Well the cost of fixing this bug is a constraint on the data. Unless 
> we
>     > > make it a UI-only constraint - which I'm personally against - there 
> must
>     > be
>     > > some point in the future where ATC cannot reasonably be expected to 
> work
>     > > with data that violates that constraint. The question is when that 
> should
>     > > occur, which should likely happen at a minor version release. Minor 
> not
>     > > major because it doesn't involve a change in data structures, merely
>     > > relationships between them - in my opinion that's a minor version 
> change
>     > > but that's definitely up for debate. With several release candidates 
> for
>     > > 3.0.0 that _doesn't_ include this restriction already in the wild, I
>     > > wouldn't recommend putting it in there. That means to fix the bug as 
> soon
>     > > as possible it should go in 3.1.0 which should be the target of 
> "master"
>     > > after the 3.0.0 release is cut from it.
>     > >
>     > > So I'd recommend immediately implementing the constraint in master 
> with a
>     > > refusal to upgrade with bad data, and backport a warning about the 
> future
>     > > behavior into 3.0.0 or as part of a 3.0.1 provided we had more changes
>     > that
>     > > would warrant a micro version bump.
>     > > ________________________________________
>     > > From: Gray, Jonathan <[email protected]>
>     > > Sent: Tuesday, December 18, 2018 9:34 AM
>     > > To: [email protected]
>     > > Subject: Re: [EXTERNAL] Re: Origins assigned to Multipe Delivery 
> Services
>     > > produces indeterminate parent.config
>     > >
>     > > -1 Holding an ATC upgrade hostage to data cleanup seems like a bad 
> idea.
>     > > The issue isn't great, but it's also not new.  We should allow teams 
> to
>     > fix
>     > > their data at their normal paces if it doesn't create significant
>     > overhead
>     > > or an inherant blocker for new functionality or correction of other 
> major
>     > > problems imho.
>     > >
>     > > Jonathan G
>     > >
>     > >
>     > > On 12/18/18, 9:28 AM, "Fieck, Brennan" <[email protected]>
>     > wrote:
>     > >
>     > >     Another option is we could detect collisions at startup and simply
>     > > refuse to continue with the upgrade until the data is fixed. That 
> would
>     > > allow people using the now-unsupported data format to continue to use
>     > their
>     > > old versions of Traffic Ops without wrecking their database, but also
>     > > provide an incentive to clean up the data.
>     > >     ________________________________________
>     > >     From: Gray, Jonathan <[email protected]>
>     > >     Sent: Tuesday, December 18, 2018 5:12 AM
>     > >     To: [email protected]
>     > >     Subject: Re: [EXTERNAL] Re: Origins assigned to Multipe Delivery
>     > > Services produces indeterminate parent.config
>     > >
>     > >     I'm generally a fan of constrain your data in your database, but 
> not
>     > > necessarily exclusively.  I see this as a one-way cleanup/conversion 
> so
>     > it
>     > > doesn't need to be configurable; otherwise you have to ask the 
> question
>     > > what happens if someone turns it off.  That said, something in the UI
>     > layer
>     > > would be nice to prevent spending significant quantities of time
>     > building a
>     > > complex DS only to have it fail to post for reasons that could have 
> been
>     > > known earlier.
>     > >
>     > >     The way my brain works in this case:
>     > >     If !unique_constraint_exists_query()
>     > >             If has_duplicates_query()
>     > >                     show_warning()
>     > >             else
>     > >                     add_unique_constraint()
>     > >
>     > >     to which the API and UI configuration could also make use of
>     > > unique_constraint_exists_query() to drive additional layer 
> constraints if
>     > > desired.
>     > >
>     > >     Jonathan G
>     > >
>     > >     On 12/17/18, 1:11 PM, "Rawlin Peters" <[email protected]>
>     > wrote:
>     > >
>     > >         That is an interesting idea...detect at TO startup whether or 
> not
>     > >         there are duplicate origins and operate in a "prevent 
> duplicate
>     > >         origins" state if no duplicates are found or "prevent 
> conflicting
>     > > DS
>     > >         topologies" state if duplicates are found? So once operators 
> have
>     > >         replaced all the duplicate origins with CNAMEs, TO will
>     > essentially
>     > >         operate in a "prohibit all duplicate origins" state. That 
> would
>     > >         probably make for a simpler transition, but I'd want to remove
>     > that
>     > >         logic in a following release that strictly prohibits duplicate
>     > > origins
>     > >         (assuming that the community agrees we should prohibit 
> duplicate
>     > >         origins altogether).
>     > >
>     > >         As for DB constraints vs UI, I was thinking those DS-type
>     > > constraints
>     > >         I pointed out would live in the API. It would basically be 
> added
>     > >         validation in the deliveryservices POST/PUT endpoint that 
> checks
>     > > the
>     > >         DB for existing DSes that conflict with the requested DS.
>     > >
>     > >         - Rawlin
>     > >
>     > >         On Mon, Dec 17, 2018 at 12:35 PM Gray, Jonathan
>     > >         <[email protected]> wrote:
>     > >         >
>     > >         > These kinds of conditions should be detectable with a
>     > > sufficiently advanced SQL query.  Is it possible to add the 
> constraint if
>     > > it passes and emit a warning during TO startup otherwise?  That would 
> let
>     > > you know the condition exists at startup but not getting in your way 
> and
>     > > keep you out of trouble once you've cleaned up.  We made a mistake 
> early
>     > > on, but this would acknowledge it was bad and encourage it to be 
> fixed at
>     > > the speed of operations teams.  Also this puts the constraint in the
>     > > database rather than the UI which is really where the contention is 
> for
>     > > usability.
>     > >         >
>     > >         > Jonathan G
>     > >         >
>     > >         >
>     > >         > On 12/17/18, 11:38 AM, "Rawlin Peters" <
>     > [email protected]>
>     > > wrote:
>     > >         >
>     > >         >     We occasionally discuss this issue but haven't tackled 
> it
>     > > yet. I think
>     > >         >     the main issue is just that duplicate origins have been
>     > > allowed since
>     > >         >     the beginning, and now everyone's Traffic Ops could be
>     > > littered with
>     > >         >     duplicate origins. Also, depending on the config of the
>     > > duplicate
>     > >         >     delivery services, the origins might not be in conflict 
> at
>     > > all (if
>     > >         >     they don't have different topology constraints). I would
>     > > love for us
>     > >         >     to just add a uniqueness constraint, but there would 
> need
>     > to
>     > > be a fair
>     > >         >     amount of warning to the community before doing so and
>     > might
>     > >         >     invalidate a significant amount of valid use cases.
>     > > Operators would
>     > >         >     need time to make DNS CNAME records for the duplicate
>     > > origins and
>     > >         >     update their DSes to use the different CNAMEs.
>     > >         >
>     > >         >     I think as a good first step to eliminating the use of
>     > > duplicate
>     > >         >     origins altogether, we should identify which "topology
>     > > constraints"
>     > >         >     actually cause conflicting config when used with 
> duplicate
>     > > origins and
>     > >         >     prevent creating DSes with duplicate origins _if it 
> would
>     > > cause a
>     > >         >     conflict with an existing DS that uses the same origin_.
>     > >         >
>     > >         >     For instance, I believe an HTTP and DNS-type DS can live
>     > > happily
>     > >         >     side-by-side using the same origin (probably need 
> different
>     > >         >     routing_names?), but scenarios like HTTP and HTTP_LIVE, 
> or
>     > > DNS and
>     > >         >     HTTP_NO_CACHE sharing the same origin will cause 
> conflicts
>     > > for sure.
>     > >         >     So maybe we can start by making sure the DS types 
> "match"
>     > > when using
>     > >         >     the same origin:
>     > >         >     HTTP + DNS: possibly good, if they have different 
> routing
>     > > names?
>     > >         >     HTTP_LIVE + HTTP_LIVE_NATNL: bad
>     > >         >     HTTP_NO_CACHE + [any other type]: bad
>     > >         >     HTTP_LIVE + HTTP: bad
>     > >         >     etc.
>     > >         >
>     > >         >     There are most likely other conflict scenarios that 
> don't
>     > > involve the
>     > >         >     DS types, but I think this would be a good start. In the
>     > > future with
>     > >         >     Delivery Service Topologies (aka Flexible Cachegroups 
> aka
>     > > Bring Your
>     > >         >     Own Topology), we might be able to prohibit assigning a 
> DS
>     > > to a
>     > >         >     Topology if the DS's origin is already used by another 
> DS
>     > in
>     > > a
>     > >         >     different Topology.
>     > >         >
>     > >         >     - Rawlin
>     > >         >
>     > >         >     On Mon, Dec 17, 2018 at 10:52 AM Fieck, Brennan
>     > >         >     <[email protected]> wrote:
>     > >         >     >
>     > >         >     > As some of you may be aware, `parent.config` files
>     > > generated by Traffic Ops can vary wildly when an origin is assigned to
>     > > multiple Delivery Services. This results in undefined behavior. I'm 
> told
>     > > that the conflict only happens when two Delivery Services with 
> different
>     > > "topology requirements" use the same origin, whatever that means 
> (content
>     > > routing type?). Regardless, the issue should be addressed. The obvious
>     > > solution is to put in place a database constraint that prevents an 
> origin
>     > > from being assigned to more that one Delivery Service with API checks 
> in
>     > > place that would provide helpful error messages when an attempt is 
> made
>     > to
>     > > violate the constraint. However, would that mess with things like
>     > > Multi-Site Origin? Or is it just not viable for some other reason? If 
> it
>     > is
>     > > a good solution, I'm prepared to work on a fix that utilizes it.
>     > >         >
>     > >         >
>     > >
>     > >
>     > >
>     > >
>     > >
>     >
>
>

Reply via email to