Hello Willy,

Apologies for the delay.

Thank you for taking the time to review.


> On Jun 2, 2019, at 10:11 PM, Willy Tarreau <w...@1wt.eu> wrote:
> 
> Hi Daniel,
> 
> On Thu, May 30, 2019 at 12:57:10AM -0400, Daniel Corbett wrote:
>> Hello,
>> 
>> 
>> When communicating over SPOP the AGENT-HELLO, AGENT-DISCONNECT,
>> and ACK frames must have the FIN flag set.
>> 
>> This patch also upgrades the SPOP_VERSION to 2.0 and adds the
>> "ip_score" transaction variable to the python & lua scripts.
>> 
>> Thanks to Christopher for giving me the answer on how to solve this issue.
> 
> Are all these changes related ?  It seems to me these are distinct
> features, or maybe even a bug fix plus an extra feature, in which
> case these should be separate patches.


Something like that :)  

They are all changes to make the spoa_server work out of the box as currently 
it's not working with 2.0-dev.

I have gone ahead and separated the patches.


> 
> I'm having a few quick questions below.
> 
>> From e0e7992b3b2af3ac0e898d48d6ce5f7e9416b568 Mon Sep 17 00:00:00 2001
>> From: Daniel Corbett <dcorb...@haproxy.com>
>> Date: Wed, 29 May 2019 17:44:05 -0400
>> Subject: [PATCH] BUG/MEDIUM: contrib/spoa_server: Set FIN flag on agent 
>> frames
>> 
>> When communicating over SPOP the AGENT-HELLO, AGENT-DISCONNECT,
>> and ACK frames must have the FIN flag set.
>> 
>> This patch also upgrades the SPOP_VERSION to 2.0 and adds the
>> "ip_score" transaction variable to the python & lua scripts.
> (...)
>> diff --git a/contrib/spoa_server/ps_lua.lua b/contrib/spoa_server/ps_lua.lua
>> index 26620459..aaf373c6 100644
>> --- a/contrib/spoa_server/ps_lua.lua
>> +++ b/contrib/spoa_server/ps_lua.lua
>> @@ -14,4 +14,5 @@ spoa.register_message("check-client-ip", function(args)
>>      spoa.set_var_ipv6("ipv6", spoa.scope.txn, "1::f")
>>      spoa.set_var_str("str", spoa.scope.txn, "1::f")
>>      spoa.set_var_bin("bin", spoa.scope.txn, "1::f")
>> +        spoa.set_var_int32("ip_score", spoa.scope.txn, 77)
> 
> Be careful, your editor seems to have mixed spaces and tabs here, and
> a few other times in the same patch.
> 


Sorry about that.  I believe it was mainly due to python indention errors that 
I was dealing with :(


>> diff --git a/contrib/spoa_server/spoa-server.conf 
>> b/contrib/spoa_server/spoa-server.conf
>> index 13bd126a..87bbb721 100644
>> --- a/contrib/spoa_server/spoa-server.conf
>> +++ b/contrib/spoa_server/spoa-server.conf
>> @@ -1,5 +1,6 @@
>> global
>>      debug
>> +    nbthread 1
> 
> What is the reason for forcing nbthread to 1 here ? Did you face a
> particular bug revealed by threads ? Given that many people use example
> configs as starting point for theirs, I'd rather avoid doing this, or
> this will last 10 years just like "option httpclose" or even the funny
> "ssl-engine rdrand" which in addition to being wrong was so much copied
> that google now auto-completes it when searching "ssl-engine haproxy"!
> 


Yes I have hit a bug where the SPOA results are blank between requests if 
threading is enabled.  I found the quick fix to be setting nbthread to 1 -- 
however, I agree with you that we must be careful with these settings as I 
realize they can persist for long after their intended need.

Unfortunately, I'm not really sure where to start fixing this issue.


>> diff --git a/contrib/spoa_server/spoa.c b/contrib/spoa_server/spoa.c
>> index a958f222..8cb40c54 100644
>> --- a/contrib/spoa_server/spoa.c
>> +++ b/contrib/spoa_server/spoa.c
>> @@ -679,13 +679,16 @@ error:
>>  * the number of written bytes otherwise. */
>> static void prepare_agentack(struct worker *w)
>> {
>> +    unsigned int flags = SPOE_FRM_FL_FIN;
>> +
>>      w->ack_len = 0;
>> 
>>      /* Frame type */
>>      w->ack[w->ack_len++] = SPOE_FRM_T_AGENT_ACK;
>> 
>> -    /* No flags for now */
>> -    memset(w->ack + w->ack_len, 0, 4); /* No flags */
>> +    /* Set flags */
>> +    flags = htonl(flags);
> 
> In general it's not a good idea to have the same variable hold two
> different endian versions of a same value. You can be certain that
> at one point something will be added above or below and will use the
> wrong one. Better simply do "flags = htonl(SPOE_FRM_FL_FIN)" or even
> better, preset flags to zero at the beginning of the function, and
> then add this flag this way : "flags |= htonl(SPOE_FRM_FL_FIN)".
> 
>> +    memcpy(w->ack + w->ack_len, (char *)&flags, 4);
> 
> You don't need the "(char*)" cast here, "&flags" is correct.
> 
> The same applies to the two or three other locations. Thanks!
> Willy
> 


Thanks for the info.  Truthfully, I copied most of this from 
contrib/spoa_example/spoa.c 

I've fixed with your recommendations.

Thanks,
-- Daniel


Attachment: 0001-MINOR-contrib-spoa_server-Upgrade-SPOP-to-2.0.patch
Description: Binary data

Attachment: 0002-BUG-MEDIUM-contrib-spoa_server-Set-FIN-flag-on-agent.patch
Description: Binary data

Attachment: 0003-MINOR-contrib-spoa_server-Add-random-IP-score.patch
Description: Binary data

Attachment: 0004-DOC-MINOR-contrib-spoa_server-Fix-typo-in-README.patch
Description: Binary data



Reply via email to