I think the only real thing I could add to this is that it would be nice if we could use the same internal C++ class as part of the C++api, vs wrapping another class around the C API. Jason
From: Leif Hedstrom <zw...@apache.org> To: dev@trafficserver.apache.org Sent: Saturday, June 11, 2016 4:56 PM Subject: Re: API-review: UUID APIs > On Jun 11, 2016, at 11:07 AM, James Peach <jpe...@apache.org> wrote: > >> >> On Jun 10, 2016, at 3:19 PM, Leif Hedstrom <zw...@apache.org> wrote: >> >> Thanks James, as usual great review. Replies inline. >> >>> On Jun 10, 2016, at 2:30 PM, James Peach <jamespe...@me.com> wrote: >>> >>> >>>> On Jun 10, 2016, at 10:29 AM, Leif Hedstrom <zw...@apache.org> wrote: >>>> >>>> Hi, >>>> >>>> as part generalizing the concept from >>>> https://github.com/apache/trafficserver/pull/199 >>>> <https://github.com/apache/trafficserver/pull/199>, I’ve filed a Jira to >>>> add appropriate APIs and I_Machine.h / Machine.cc <http://machine.cc/> >>>> support for the concept of a process UUID. The apidefs.h are >>>> >>>> /* >>>> -------------------------------------------------------------------------- >>>> Interface for the UUID APIs. https://www.ietf.org/rfc/rfc4122.txt >>>><https://www.ietf.org/rfc/rfc4122.txt> . */ >>>> typedef enum { >>>> TS_UUID_V1 = 1, >>>> TS_UUID_V2, >>>> TS_UUID_V3, >>>> TS_UUID_V4, /* At this point, this is the only implemented version (or >>>> variant) */ >>>> TS_UUID_V5, >>>> } TSUuidVersion; >>>> >>>> #define TSUuidStringLen 36 >>> >>> Is this define useful? I think we should drop it ... in libuuid it is >>> mainly used for formatting a string and this API doesn't need that. >> >> Yeah, I’m fine with that, the only time it’d be useful is if you want to >> allocate something on the stack to hold a copy I think, or want to avoid >> doing a strlen() for e.g. a malloc. No strong opinion from me. :) > > That makes sense. It would be useful for TSUuidStringParse too I think. > >>>> typedef struct tsapi_uuid *TSUuid; >>>> >>>> >>>> The ts.h APIs are: >>>> >>>> /* APIs for dealing with UUIDs, either self made, or the system wide >>>> process UUID. */ >>>> tsapi TSUuid TSUuidCreate(TSUuidVersion v); >>> >>> A helpful extension of this might be TSHttpTxnUuidCreate() which would >>> allocate the UUID in the transaction arena. >> >> Yep. I’ll file a Jira if no one else beats me to it. >> >> >>> >>>> tsapi TSReturnCode TSUuidDestroy(TSUuid uuid); >>>> tsapi TSReturnCode TSUuidCopy(TSUuid dest, TSUuid src); >>>> tsapi TSReturnCode TSUuidInitialize(TSUuid uuid); /* Re-generate the UUID >>>> */ >>> >>> If you TSUuidCreate() but don't TSUuidInitialize(), what do you get? >> >> It’ll still be initialized. The Initialize is really just a “re-initialize”, >> to get a new, random UUID. I don’t know how useful it is, but it’s also >> harmless. Maybe we need a better name? TSUuidReinitialize() > > Ok, do we need this at all then? I am not sure why I would get a UUID and > then change its value? The thinking was if you want to generate a new UUID many times, without the allocations necessary to get the “generator” object. Now, after we added the TSUuidStringParse() function (done), I started thinking that maybe a cleaner API is something in the line of (without error checking): uuid = TSUuidCreate(); TSUuidInitialize(uuid, TS_UUID_V4); and uuid = TSUuidCreate(); TSUuidStringParse(uuid, "65c65060-072e-4f9c-a76f-89f5f245354a”); // The string holds the version, so no issue there This definitely seems cleaner to me, specially now that we have at least two ways of “generating” the actual UUID? Thoughts? >> >> Roger. So, >> >> if (TS_SUCCESS == TSUuidStringParse(uuid, >>"8E3C2CA3-3603-4A85-A814-8415F395D904”)) { …}, >> >> right ? Do we want an int len third (optional) parameter? For the case of >> non-null terminated strings. > > I don’t think you need the length since the string is known fixed length. > uuid_parse(3) doesn’t use it either. Though if there’s no length parameter > maybe we should add a constant for the length so the caller can check? Ok, so we agree on: tsapi TSReturnCode TSUuidStringParse(TSUuid uuid, const char *uuid_str); > >>>> and an additional API to expose the already existing HttpSM (Txn) sequence >>>> ID: >>>> >>>> /* Get the Txn's (HttpSM's) unique identifier, which is a sequence number >>>> since server start) */ >>>> tsapi int64_t TSHttpTxnIdGet(); >>> >>> Why int64_t rather than uint64_t? >> >> Cause HttpSM.sm_id is int64_t :-). We’d have to change things in a lot of >> places for that to be addressed, which we can do if you feel strongly, but >> it’s a fair amount of work. > > Yeh I think we should do this. uint64_t wraps nicely. Just cast it for this > API, then come back and change it everywhere. I doubt anyone will ever change the code, and this is borderline bike shedding; It’s clearly a non issue, since we’ll never, ever wrap this ID. Even at 300,000 QPS, it’d take a million years to wrap it. But, I don’t really care, so I’ll change it to uint64_t. Cheers, — leif