Hi Olivier,
On Mon, Aug 07, 2017 at 07:29:23PM +0200, Olivier Houchard wrote:
> > What makes the distinction between an SRV record and a real hostname here ?
> > Just the leading underscore, or the plain "_http." maybe ? I'm not expecting
> > any problem with this given that the underscore is not allowed as a regular
> > hostname character (except under windows). But at least this will deserve
> > a mention in the doc where the server's address is described, so that anyone
> > experiencing trouble could spot this easily.
> >
>
> Yes, whatever starts with an underscore, I didn't want to rely on _http, as
> it may not be http. As underscores aren't supposed to be present in hostnames,
> and I certainly hope even people using them don't have hostname starting with
> one, I thought it was OK.
> It is documented in the updated patches attached.
OK fine, thanks!
> > > - for (dns_answer_record_id = 0; dns_answer_record_id <
> > > dns_p->header.ancount; dns_answer_record_id++) {
> > > + for (int i = 0; i < dns_p->header.ancount; i++) {
> >
> > "for (int i ...)" will not build here, it's only C99 and we don't enforce
> > this (and personally I hate this form as it's the only exception I know
> > of where a variable declaration is used outside of the scope it's declared
> > in.
> >
>
> Bah, I happen to like it, but I understand C99 is still a bit experimental,
Not experimental, it's in the future... on some of my machines :-)
> so it's gone in the updated patch set.
Thank you.
> > > + char weight[9];
> > > +
> > > + snprintf(weight,
> > > sizeof(weight),
> > > + "%d",
> > > item1->weight);
> > > +
> > > server_parse_weight_change_request(srv, weight);
> >
> >
> > Next time, you can use ultoa() as a replacement for snprintf(str, size,
> > "%d"),
> > which also ensures you'll use a large enough string for the largest
> > supported
> > integer types, there's also U2A() which uses a rotating buffer and which can
> > be used multiple times in a single function call.
> >
>
> Hmm, if we ever want to move to a multithreaded version, I'd rather not use
> ultoa() :)
Good point but no in fact. It's used a lot (via U2A and I don't remember
which one as well) for stats dump because it's convenient. I understood
that the buffers were simply made thread-local instead of global. They're
very small, nobody will notice.
> > I think we'll have to add some easier conversion functions, like unaligned
> > reads using something like this to make such manipulation less of a pain :
> >
> > static inline uint16_t readu16(const void *p)
> > {
> > union { const void *p; uint16_t u16; } __attribute__((packed)) u = {
> > .p = p };
> > return u.u16;
> > }
> >
> > static inline uint16_t readbe16(const void *p)
> > {
> > return ((unsigned char *)p)[0] << 8 +
> > ((unsigned char *)p)[1];
> > }
> >
> > The the code above simply becomes :
> >
> > reader += sizeof(uint16_t);
> > dns_answer_record->weight = readbe16(reader);
> >
> > and for cases where native-endian word is needed instead :
> >
> > reader += sizeof(uint16_t);
> > dns_answer_record->weight = readu16(reader);
> >
>
> Ok you got me convinced gcc can do the right thing for architectures that
> have hard alignment requirements, so as we discussed, the updated patch
> provides those kind of helper functions.
Thank you, this way we may even think about doing some cleanup passes
on other areas before the release :-)
> > > From 899413f3a965feeaa96ffb5b284b504dbdb01fa1 Mon Sep 17 00:00:00 2001
> > > From: Olivier Houchard <[email protected]>
> > > Date: Fri, 4 Aug 2017 18:39:01 +0200
> > > Subject: [PATCH 4/4] MINOR: check: Fix checks when using SRV records.
> > >
> > > When started, a server may not yet have an associated protocol, so don't
> > > bother trying to run the checks until it is there.
> > > ---
> > > src/checks.c | 2 +-
> > > 1 file changed, 1 insertion(+), 1 deletion(-)
> > >
> > > diff --git a/src/checks.c b/src/checks.c
> > > index 7938b873..fc92a243 100644
> > > --- a/src/checks.c
> > > +++ b/src/checks.c
> > > @@ -1557,7 +1557,7 @@ static int connect_conn_chk(struct task *t)
> > > }
> > >
> > > ret = SF_ERR_INTERNAL;
> > > - if (proto->connect)
> > > + if (proto && proto->connect)
> > > ret = proto->connect(conn, check->type, quickack ? 2 : 0);
> > > if (s->check.send_proxy && !(check->state & CHK_ST_AGENT)) {
> > > conn->send_proxy_ofs = 1;
> >
> > Do you think this one might be triggered before SRV records ? If so
> > we'd need to tag it for backporting. If you're unsure we should also
> > backport it, of course :-)
> >
>
> That is a good question, I think not, but I wouldn't swear it :)
OK, let's not backport it then.
Thanks. I'll wait for Baptiste's ack and will take it if OK.
Willy