Yeah, maybe it doesn't make sense to update just one backup entry at a time because you'd have to update the order of the rest of the backups as well. Perhaps the POST/PUT endpoints are basically the same and always take the full list of backups. But I think we should still keep each entry as an object with an explicit "order" so that we can extend it more easily in the future. I could easily see us adding a "weight" to each entry, so that a particular cachegroup could split the fallback traffic between multiple cachegroups at a time rather than falling back through them sequentially.
- Rawlin On Mon, Mar 19, 2018 at 2:30 PM, Chris Lemmons <alfic...@gmail.com> wrote: > So, to continue the conversation, it looks like the list of backup > groups is stored as a List<String>. It's currently loaded by iterating > the elements of the json array in order. That looks great to me. > > It seems odd to me to have a separate order parameter in the API. > Since order has to be unique, it's unlikely that you'd be able to > update the order component to do anything other than "move to an end" > without updating about half the rows in the db anyway. It just feels > like we're asking more of the API user. > > On Mon, Mar 19, 2018 at 2:04 PM, Chris Lemmons <alfic...@gmail.com> wrote: >> Moving a conversation started in Slack to the mailing list: >> >> VijayAnand [8:06 AM] >> Hi >> >> This is regarding TR's Backup Cache Group Selection >> which is https://github.com/apache/incubator-trafficcontrol/issues/1907 >> GitHub >> Deterministic Cachegroup failover · Issue #1907 · >> apache/incubator-trafficcontrol >> Currently, if all caches in a cache group are unavailable Traffic >> Router will route clients to the next closest cache group. This works >> great for some networks but could cause problems in others. T... >> Based on Rawlin's review comments on the PR >> https://github.com/apache/incubator-trafficcontrol/pull/1908 >> GitHub >> Changes for Backup Edge Cache Group by Vijay-1 · Pull Request #1908 · >> apache/incubator-trafficcontrol >> This PR implements solution for the issue: #1907 It places the backup >> policy in the CZF file { "coverageZones": { >> "GROUP2": { "backupList": ["GROUP1"], >> &quo... >> I have the following Schema to support this which is in-sync with >> Rawlin's comments >> CREATE TABLE cachegroup_fallbacks ( >> primary_cg bigint, >> backup_cg bigint CHECK (primary_cg != backup_cg), >> set_order bigint DEFAULT 0, >> CONSTRAINT fk_primary_cg FOREIGN KEY (primary_cg) REFERENCES >> cachegroup(id) ON DELETE CASCADE, >> CONSTRAINT fk_backup_cg FOREIGN KEY (backup_cg) REFERENCES >> cachegroup(id) ON DELETE CASCADE, >> UNIQUE (primary_cg, backup_cg), >> UNIQUE (primary_cg, set_order) >> ); >> >> ALTER TABLE cachegroup ADD COLUMN fallback_to_closest BOOLEAN DEFAULT TRUE; >> Would like to get your views before i start coding for the same >> >> Eric Friedrich [8:15 AM] >> why does the set_order get a default? >> >> VijayAnand [8:17 AM] >> aah. that is not needed >> assuming there is a valid input >> for order >> >> Rawlin Peters [9:15 AM] >> yeah a null value there could be interpreted as zero in the API, but >> maybe we should add a NOT NULL constraint to the columns as well? I >> can't think of any reasons why any column should be optional >> >> Eric Friedrich [9:18 AM] >> any preference in the API between >> ```{"list": ["grp1", "grp2"]}``` >> vs >> ```{"list": [{"name": "grp1", "order": 1}, >> {"name": "grp3", "order: 2}, // or 5 or some other >> positive integer >> ] >> }``` >> >> Rawlin Peters [9:36 AM] >> 2nd option would make it easier to extend in the future with weighting >> for instance, we could just add another key/value in that object >> >> Eric Friedrich [9:37 AM] >> good point- i hadn’t thought about that >> >> Chris Lemmons [1:16 PM] >> The second is way harder to parse and handle. I strongly prefer the first. >> Is there a reason to expect such extension? (edited) >> >> Jeff Elsloo [1:30 PM] >> presumably we’re using a library to handle it, so why is it way harder? >> >> Dan Kirkwood [1:33 PM] >> +1 -- it's all just JSON.. >> >> Rob Butts [1:39 PM] >> I don’t agree that we shouldn’t care about the human-readability, >> because we have libraries. Someone might want to write an app in a >> different language. I wouldn’t say “way” harder, but the second >> definitely is harder to read, and unintuitive. I’m +1 on making our >> APIs easy to read and work with natively :confused: >> >> Jeff Elsloo [1:41 PM] >> but a list is just a container >> it contains “things” >> in this case it’s a list of objects with properties >> >> Dylan Volz [1:41 PM] >> agree we shouldn't not care, but most of our apis are lists of json >> objects, and if we need to add a key the the second definition is far >> more easily extensible >> >> Chris Lemmons [1:42 PM] >> True. Are they actually objects with properties? Or are they string values? >> >> Jeff Elsloo [1:42 PM] >> that’s implied by the structure >> >> Chris Lemmons [1:42 PM] >> Either way, I'd prefer not to overload the order as a parameter, >> unless there is a particular reason? >> >> Jeff Elsloo [1:43 PM] >> `{"name": "grp3", "order: 2}` is not a string in JSON >> >> Chris Lemmons [1:43 PM] >> Aye. >> >> Jeff Elsloo [1:43 PM] >> I don’t follow what you mean about order >> >> Chris Lemmons [1:43 PM] >> Are there other parameters (or might there reasonably be in the future)? >> >> Jeff Elsloo [1:43 PM] >> order is just a property and has nothing to do with overloading anything >> in this context, if it has to do with Rawlin’s steering work, yes >> there certainly could be other properties >> which is why the format was suggested >> >> Chris Lemmons [1:45 PM] >> So, for example, using objects: >> >> I prefer `[{"name": "grp1"}, {"name": "grp3"}]` to `[{"name": "grp1", >> "order": 1},{"name": "grp3", "order: 2}]`. >> In both cases, you can easily add a new parameter, for example, if >> groups had an owner. >> But arrays already have orders. >> >> Jeff Elsloo [1:45 PM] >> no >> not in JSON >> >> Chris Lemmons [1:46 PM] >> Yes, they do. >> >> Jeff Elsloo [1:46 PM] >> I’m not going to implicitly trust the order of what’s in the source JSON >> we don’t have the ability to control that >> >> Chris Lemmons [1:46 PM] >> Arrays in JSON are ordered. Objects in JSON are not ordered. >> >> Jeff Elsloo [1:46 PM] >> no they aren’t >> not unless they’re systematically created that way >> which in this case they are not >> we have a property called order and a value >> that could appear in any order of the underlying array >> we would have to do a lot more work to build it properly and then just >> make the assumption in downstream components that the order is >> implicitly correct in JSON >> that is a risky assumption >> >> Chris Lemmons [1:47 PM] >> https://tools.ietf.org/html/rfc7159 >> >>> An array is an ordered sequence of zero or more values. >> >> Jeff Elsloo [1:47 PM] >> seriously Chris? >> do you even know why or how such things are used in Traffic Ops? >> did you know that the orders could be negative? >> I’m not arguing about whether or not JSON supports order in its arrays >> I’m arguing about how the data is put into JSON and how users >> configure the properties >> and what the values can be >> >> Chris Lemmons [1:49 PM] >>> do you even know why or how such things are used in Traffic Ops? >> >> Not in detail, no. Hence my question: >> >>> unless there is a particular reason? >> >> Jeff Elsloo [1:49 PM] >> having to order that in the JSON adds another layer of complexity that >> is unnecessary >> I’ve given you some but you dropped an RFC on me in reply which is >> implicitly saying you don’t agree and won’t >> so for cache group ordering, which is separate from the steering >> ordering issue, I think that stating order specifically will give us >> more options down the road just as it did with steering >> we have multiple ways to order things in the steering case, and we’ve >> extended that, so I don’t see why that precedent wouldn’t also apply >> here >> backup cache group ordering that is >> >> Chris Lemmons [1:55 PM] >> Ah... I think there was a bit of a miscommunication there. To the >> point of the discussion, though... I missed which data this is >> storing. Yeah, we have to store the ordering data explicitly in the >> database, since rows are unordered. >> >> Jeff Elsloo [1:55 PM] >> yes, that’s what I was getting at.. so we’d have to pull the values >> out of the database, sort them properly, then ensure they are written >> that way to the snapshot table >> >> Rawlin Peters [1:55 PM] >> fwiw the particular JSON in question isn't for the steering stuff I'm >> working on, it's for the Cachegroup Failover stuff (i.e. CG1 >> specifically fails over to CG2, CG3, in that order) >> >> Jeff Elsloo [1:55 PM] >> it’s easier to just have the downstream consumer worry about that, as >> they likely would need to worry about it anyway >> yeah Rawlin, I saw that eventually :slightly_smiling_face: >> >> Rawlin Peters [1:56 PM] >> sorry just catching up too >> >> Jeff Elsloo [1:56 PM] >> but to me it’s a similar concept as steering >> we have an ordering mechanism based on an int value today >> maybe that changes in the future >> as things in our world tend to >> I agree with keeping the content the API spits out as simple as >> possible, but not to the extent that it makes us have to do more work >> just for sake of readability >> >> Chris Lemmons [1:58 PM] >> So, what happens if ordering is equivalent? >> >> Rawlin Peters [1:58 PM] >> yeah plus we need a way to update the order of a particular relation, >> which is why we can't just keep it as a simple list of strings >> there's a uniqueness constraint on (primary_cg, order), so a >> particular cachegroup can only declare one backup CG at that >> particular ordering >> >> Chris Lemmons [2:01 PM] >> Ok. So if you want to change ordering other than "move to end" or >> "move to beginning", you'll probably need to update half of the >> relations? >> >> Dave Neuman [2:01 PM] >> All of this ^^ should be done on the mailing list (edited) >> any of the decisions made here don't count >> unless you want to come to some consensus here, put it on the mailing >> list, and have everyone +1 >> which is against the spirit of the mailing list (edited)