RFC: state entities, replace globalKey() with .Tag().String()

Tim Penhey tim.penhey at canonical.com
Wed Sep 24 07:09:53 UTC 2014


On 24/09/14 18:02, Dimiter Naydenov wrote:
> On 24.09.2014 06:53, Tim Penhey wrote:
>> Hi folks,
> 
>> I have been going through much of the code in the state package
>> looking at the work to migrate all the collection keys to handle
>> multiple environments.
> 
>> In the long and distant past (earlier this year), the Tag() method 
>> returned a string.  There is a second tag like thing in the state 
>> package called the "globalKey". This is used as a collection
>> independent key into annotations, presence, settings, networks and
>> status.  It seems that the only things we ever use for this are
>> entities that have their own tag types.
> 
>> If we ignore actions (which I don't think should bother
>> implementing globalKey), then we are talking about: machine,
>> service, unit, and network.
> 
>> I propose that we replace all occurrences of the globalKey with a
>> string representation of the Tag for that entity.
> 
> Why? Global keys are a shorter than tags, and in several places we use
> fast regular expression searches using a prefix based on the global key.
> So instead of having "m#0#n#juju-public" as global key for a port
> ranges document, we'll have to use "machine-0<*>network-juju-public",
> where "<*>" is some unambiguous separator. The same is valid for
> service settings - "s#wordpress" will become "service-wordpress".

Sorry, but this is terrible.  The regex searches we have are needlessly
complicated, and the documents should have real fields rather than
disassembling the _id field.  I think that having a slightly longer
value stored in mongo is worth the code when it means we go from having
two ways to identity an entity down to one.

> I'd rather have a transparent transformation in place to convert
> global keys to tags, where needed (the only special case I can think
> of is relation tags "relation-123", which cannot be converted back to
> relation names (e.g "wordpress:db mysql:server") without a DB lookup).

I'd rather just have one way to identify an entity in state.

> Also, what I didn't understand is how using tags as global keys will
> solve the case with multiple environments in the same DB?

It doesn't, it is just code cleanup that I think we should do.

Tim



More information about the Juju-dev mailing list