On 08/09/2011 09:56 PM, Tim Beale wrote:
> Hi Steve,
> 
> Thanks for your patch.
> 
> 1. I don't see the initial CLM leave events. But I still see the FAILED TO
> RECEIVE hit on node-3. A couple of nodes don't enter operational on ring 20,
> then after the ring next reforms (ring 24), the FAILED TO RECEIVE happens.
> Attached is the latest debug.
> 

Keep in mind there are two problems here - (1) clm membership is wrong
and (2) fail to recv problem.  They are independent issues.

I definitely want to look into this failed to receive issue.  Can you
try changing "fail_recv_const" on all the nodes to some large value,
such as 5000?

One of 3 things should happen:
1. the protocol blocks forever
2. the protocol enters operational after some short period
3. fail to recv is printed after a long period of time (1-10 minutes).

Please report back which one happens with this tuning.


> I think the problem is some nodes end up missing a message/sequence-number,
> although I'm not sure exactly why. E.g. the token sequence starts off at one
> when they enter operational, but not all nodes receive this.
> 2011 Aug  9 10:07:18 daemon.debug node-3 corosync[1575]:   [TOTEM ]
> totemsrp.c:3785 retrans flag count 4 token aru 0 install seq 0 aru 0 1
> 
> The nodes that were still in recovery will be using different values for
> old_ring_state_high_seq_received and my_old_ring_id. It seems these nodes
> receive msg seq #1, but the others don't and hit the FAILED TO RECEIVE.
> 
> The debug attached has your first memb-list patch popped off, but I've seen 
> the
> same problem happen with it applied too.
> 
> 2. Note that I don't see any CLM leave events at all now, even though after 
> the
> FAILED TO RECEIVE, node-3 kicks all other nodes out of its ring. I think this
> is due to the logic:
>  diff = my_new_memb_list - my_memb_list

This isn't how the difference operation works.  It produces a list of
nodes that are not both in my_new_memb_list and my_memb_list, therefore,
the current and logic should be correct.  I wrote the patch at 2am and
was quite tired, so I'll double check it is correct.

Regards
-steve

> The diff doesn't include any nodes that are in my_memb_list but not in
> my_new_memb_list, i.e. left nodes. I guess you could get all the differences
> by doing the following:
>  memb_set_subtract( diff1, my_new_memb_list, my_memb_list )
>  memb_set_subtract( diff2, my_memb_list, my_new_memb_list )
>  memb_set_and( diff1, diff2, diff )
> 
> Thanks,
> Tim
> 
> On Mon, Aug 8, 2011 at 9:45 PM, Steven Dake <sd...@redhat.com> wrote:
>> On 08/08/2011 12:10 AM, Tim Beale wrote:
>>> Hi Steve,
>>>
>>> Thanks for your help. I tried out your patch but the problem still
>>> occurs. The problem looks to me due to the ring-IDs used when forming
>>> the transitional memb-list, rather than with the memb-list itself. The
>>> ring-ID of the nodes still in Recovery is older than the rest of the
>>> nodes who have already shifted to Operational.
>>>
>>> Attached is my attempt at fixing the problem. The idea is to delay the
>>> nodes processing a Memb-Join immediately after shifting to
>>> Operational, until the token has rotated the ring once.
>>>
>>> It doesn't quite work either though. The nodes are still re-entering
>>> gather before all have left recovery. This time it's due to processing
>>> a Merge-Detect message. One node has just started up and set itself to
>>> the rep, and sends out a Merge-Detect which triggers the other nodes
>>> to enter gather and reform the ring.
>>>
>>> Let me know if you have any other advice.
>>>
>>
>> the problem is clear from the blackbox - 8 nodes enter operational while
>> 1 in recovery is interrupted by a join message.  this interrupted node
>> then proceeds with a transitional membership of 1 node (which is correct).
>>
>> The joined and left lists use the transitional list to determine their
>> contents, which is not correct.  This results in incorrect data
>> delivered to clm.  Try the follow-up patch which should correctly
>> calculate the joined and left lists.
>>
>>
>>> Thanks,
>>> Tim
>>>
>>> On Mon, Aug 8, 2011 at 6:08 AM, Steven Dake <sd...@redhat.com> wrote:
>>>> On 08/03/2011 10:32 PM, Tim Beale wrote:
>>>>> Hi,
>>>>>
>>>>> It looks to me that the way the transition from Recovery to Operational 
>>>>> works,
>>>>> we can't guarantee that all nodes in the ring have entered Operational 
>>>>> before
>>>>> a node processes another Memb-Join message from a new node. E.g. we can't
>>>>> guarantee the token has rotated right the way around the ring.
>>>>>
>>>>> When this happens, the nodes still in Recovery will still use the older 
>>>>> ring
>>>>> ID. So they won't get added to the transitional membership, and CLM will 
>>>>> report
>>>>> leave events for these nodes. (Plus there might be other side-effects, 
>>>>> like the
>>>>> FAILED TO RECEIVE problem - I haven't quite worked out why that's 
>>>>> happening).
>>>>>
>>>>
>>>> Thanks for the pointer here - patch on ml.
>>>>
>>>>> We are currently using CLM to check the health of a node, i.e. so we can 
>>>>> detect
>>>>> if it locks up. My questions are:
>>>>> i) Are there config settings we could change to improve this, like 
>>>>> increasing
>>>>> the 'join' timeout?
>>>>> ii) Should I try to make a code change to fix the problem? E.g. delay
>>>>> processing the Memb-Join message if the node's only just entered 
>>>>> operational.
>>>>> iii) Should we not be using CLM like this? I.e. should we just learn to 
>>>>> live
>>>>> with CLM/CPG sometimes reporting nodes as leaving when they're perfectly
>>>>> healthy.
>>>>>
>>>>> Thanks for your help.
>>>>> Tim
>>>>>
>>>>
>>>> Tim please try the patch I have recently posted:
>>>> [PATCH] Set my_new_memb_list in recovery enter
>>>>
>>>> First and foremost, let me know if it resolves your 10 node startup case
>>>> which fails 10% of the time.  Then let me know if it treats other symptoms.
>>>>
>>>> Regards
>>>> -steve
>>>>
>>>>
>>>>> On Wed, Aug 3, 2011 at 3:28 PM, Tim Beale <tlbe...@gmail.com> wrote:
>>>>>> Hi,
>>>>>>
>>>>>> We're booting up a 10-node cluster (with all nodes starting corosync at 
>>>>>> roughly
>>>>>> the same time) and approx 1 in 10 times we see some problems:
>>>>>> a) CLM is reporting nodes as leaving and then immediately rejoining (not 
>>>>>> sure
>>>>>> if this is valid behaviour?)
>>>>>> b) Probably an unrelated oddity, but we're getting flow control enabled 
>>>>>> on a
>>>>>> client daemon using CLM that's only sending one request 
>>>>>> (saClmClusterTrack()).
>>>>>> c) A node is hitting the FAILED TO RECEIVE case
>>>>>> d) After c) there seems to be a lot of churn as the cluster tries to 
>>>>>> reform
>>>>>> e) During the processing of node leave events, the CPG client can 
>>>>>> sometimes get
>>>>>> broken so it no longer processes *any* CPG events
>>>>>>
>>>>>> Corosync debug is attached (I commented out some of the noisier debug 
>>>>>> around
>>>>>> message delivery). We don't really know enough about corosync to tell 
>>>>>> what
>>>>>> exactly is incorrect behaviour and what should be fixed. But here's what 
>>>>>> we've
>>>>>> noticed:
>>>>>> 1). Node-4 joins soon after node-1. When this happens all nodes except 
>>>>>> node-12
>>>>>> have entered operational state (see node-12.txt line 235). It looks like 
>>>>>> maybe
>>>>>> node-12 hasn't received enough rotations of the token to enter 
>>>>>> operational yet.
>>>>>> Node-12's resulting transitional config consists of just itself. All 
>>>>>> nodes then
>>>>>> report node-1 and node-12 as leaving and immediately rejoining.
>>>>>> 2) After this config change, node-3 eventually hits the FAILED TO 
>>>>>> RECEIVE case
>>>>>> (node-3.txt line 380). At this point node-1 and node-12 have an ARU 
>>>>>> matching
>>>>>> the high_seq_received, all other nodes have an ARU of zero.
>>>>>> 3) Node-3 entering gather seems to result in a lot of config change churn
>>>>>> across the cluster.
>>>>>> 4) While processing the config changes on node-3, the CPG downlist it 
>>>>>> uses
>>>>>> contains itself. When node-3 sends leave events for the nodes in the 
>>>>>> downlist
>>>>>> (including itself), it sets its own cpd state to CPD_STATE_UNJOINED and 
>>>>>> clears
>>>>>> the cpd->group_name. This means it no longer sends any CPG events to the 
>>>>>> CPG
>>>>>> client.
>>>>>>
>>>>>> We tried cherry-picking this commit to fix the problem (#4) with the CPG 
>>>>>> client.
>>>>>> http://www.corosync.org/git/?p=corosync.git;a=commit;h=956a1dcb4236acbba37c07e2ac0b6c9ffcb32577
>>>>>> It helped a bit, but didn't fix it completely. We've made an interim 
>>>>>> change
>>>>>> (attached) to avoid this problem.
>>>>>>
>>>>>> We're using corosync v1.3.1 on an embedded linux system (with a low-spec 
>>>>>> CPU).
>>>>>> Corosync is running over a basic ethernet interface (no 
>>>>>> hubs/routers/etc).
>>>>>>
>>>>>> Any help would be appreciated. Let me know if there's any other debug I 
>>>>>> can
>>>>>> provide.
>>>>>>
>>>>
>>>>
>>>>
>>>>>> Thanks,
>>>>>> Tim
>>>>>>
>>>>> _______________________________________________
>>>>> Openais mailing list
>>>>> Openais@lists.linux-foundation.org
>>>>> https://lists.linux-foundation.org/mailman/listinfo/openais
>>>>
>>>>
>>
>>

_______________________________________________
Openais mailing list
Openais@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/openais

Reply via email to