<!-- 
RSS generated by JIRA (9.4.14#940014-sha1:734e6822bbf0d45eff9af51f82432957f73aa32c) at Sat Feb 10 01:15:53 UTC 2024

It is possible to restrict the fields that are returned in this document by specifying the 'field' parameter in your request.
For example, to request only the issue key and summary append 'field=key&field=summary' to the URL of your request.
-->
<rss version="0.92" >
<channel>
    <title>Whamcloud Community JIRA</title>
    <link>https://jira.whamcloud.com</link>
    <description>This file is an XML representation of an issue</description>
    <language>en-us</language>    <build-info>
        <version>9.4.14</version>
        <build-number>940014</build-number>
        <build-date>05-12-2023</build-date>
    </build-info>


<item>
            <title>[LU-1352] spurious recovery timer resets</title>
                <link>https://jira.whamcloud.com/browse/LU-1352</link>
                <project id="10000" key="LU">Lustre</project>
                    <description>&lt;p&gt;A production MDS in recovery seemed to restart the recovery timer more than we would expect.  Here is a paraphrased transcript of the console log:&lt;/p&gt;

&lt;div class=&quot;preformatted panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;preformattedContent panelContent&quot;&gt;
&lt;pre&gt;Apr 25 12:21:28 roc-mds1 kernel: Lustre: ls5-MDT0000: Starting recovery timer for 5:00
Apr 25 12:21:28 roc-mds1 kernel: Lustre: ls5-MDT0000: Starting recovery timer for 5:00
Apr 25 12:36:03 roc-mds1 kernel: Lustre: ls5-MDT0000: recovery is timed out, evict stale exports
Apr 25 12:36:03 roc-mds1 kernel: Lustre: ls5-MDT0000: Denying connection for new client ..., waiting for 193 clients in recovery for 0:24
(repeats once)                                                                 
Apr 25 12:36:29 roc-mds1 kernel: Lustre: ls5-MDT0000: recovery is timed out, evict stale exports
Apr 25 12:36:29 roc-mds1 kernel: Lustre: ls5-MDT0000: recovery is timed out, evict stale exports
Apr 25 12:36:30 roc-mds1 kernel: Lustre: ls5-MDT0000: recovery is timed out, evict stale exports
Apr 25 12:36:32 roc-mds1 kernel: Lustre: ls5-MDT0000: recovery is timed out, evict stale exports
Apr 25 12:36:33 roc-mds1 kernel: Lustre: ls5-MDT0000: Starting recovery timer for 15:00
Apr 25 12:36:33 roc-mds1 kernel: Lustre: ls4-MDT0000: Denying connection for new client ..., waiting for 100 clients in recovery for 15:00
(repeats about ten times over ten minutes)                                     
Apr 25 12:51:33 roc-mds1 kernel: Lustre: ls5-MDT0000: recovery is timed out, evict stale exports
Apr 25 12:51:34 roc-mds1 kernel: Lustre: ls5-MDT0000: recovery is timed out, evict stale exports
Apr 25 12:51:35 roc-mds1 kernel: Lustre: ls5-MDT0000: recovery is timed out, evict stale exports
Apr 25 12:51:35 roc-mds1 kernel: Lustre: ls5-MDT0000: Starting recovery timer for 15:00
Apr 25 12:55:20 roc-mds1 kernel: Lustre: ls5-MDT0000: Denying connection for new client ..., waiting for 100 clients in recovery for 11:15
Apr 25 13:05:20 roc-mds1 kernel: Lustre: ls5-MDT0000: Denying connection for new client ..., waiting for 100 clients in recovery for 1:15
Apr 25 13:06:35 roc-mds1 kernel: Lustre: ls5-MDT0000: recovery is timed out, evict stale exports
Apr 25 13:06:35 roc-mds1 kernel: Lustre: ls5-MDT0000: recovery is timed out, evict stale exports
Apr 25 13:06:36 roc-mds1 kernel: Lustre: ls5-MDT0000: recovery is timed out, evict stale exports
Apr 25 13:06:37 roc-mds1 kernel: Lustre: ls5-MDT0000: recovery is timed out, evict stale exports
Apr 25 13:06:39 roc-mds1 kernel: Lustre: ls5-MDT0000: recovery is timed out, evict stale exports
Apr 25 13:06:39 roc-mds1 kernel: Lustre: ls5-MDT0000: Starting recovery timer for 15:00
Apr 25 13:15:20 roc-mds1 kernel: Lustre: ls5-MDT0000: Denying connection for new client ..., waiting for 100 clients in recovery for 6:19
Apr 25 13:21:39 roc-mds1 kernel: Lustre: ls5-MDT0000: recovery is timed out, evict stale exports
Apr 25 13:21:40 roc-mds1 kernel: Lustre: ls5-MDT0000: recovery is timed out, evict stale exports
Apr 25 13:21:41 roc-mds1 kernel: Lustre: ls5-MDT0000: Starting recovery timer for 15:00
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This raises several questions.&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Is it unexpected to have multiple &quot;Starting recovery timer&quot; messages, or is this just normal extension of recovery timeout due to new client connections?&lt;/li&gt;
	&lt;li&gt;Should it be possible to start the recovery timer twice in the same second, as at 12:21:28?&lt;/li&gt;
	&lt;li&gt;How many times should &quot;recovery is timed out, evict stale exports&quot; appear?  (Looking at target_recovery_overseer(), it seems it should be at most twice.)&lt;/li&gt;
	&lt;li&gt;In check_and_start_recovery_timer(), is the cfs_timer_is_armed() check sufficient to avoid race conditions, or does it need to also check the obd_device recovery flags?&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Let&apos;s also think about how to improve the code comments, manual, and log messages to make the recovery process more transparent.&lt;/p&gt;</description>
                <environment>&lt;a href=&quot;https://github.com/chaos/lustre/commits/2.1.1-4chaos&quot;&gt;https://github.com/chaos/lustre/commits/2.1.1-4chaos&lt;/a&gt;</environment>
        <key id="14198">LU-1352</key>
            <summary>spurious recovery timer resets</summary>
                <type id="1" iconUrl="https://jira.whamcloud.com/secure/viewavatar?size=xsmall&amp;avatarId=11303&amp;avatarType=issuetype">Bug</type>
                                            <priority id="3" iconUrl="https://jira.whamcloud.com/images/icons/priorities/major.svg">Major</priority>
                        <status id="5" iconUrl="https://jira.whamcloud.com/images/icons/statuses/resolved.png" description="A resolution has been taken, and it is awaiting verification by reporter. From here issues are either reopened, or are closed.">Resolved</status>
                    <statusCategory id="3" key="done" colorName="success"/>
                                    <resolution id="1">Fixed</resolution>
                                        <assignee username="hongchao.zhang">Hongchao Zhang</assignee>
                                    <reporter username="nedbass">Ned Bass</reporter>
                        <labels>
                            <label>llnl</label>
                    </labels>
                <created>Fri, 27 Apr 2012 21:02:06 +0000</created>
                <updated>Sun, 3 Apr 2016 03:07:25 +0000</updated>
                            <resolved>Sun, 3 Apr 2016 03:07:25 +0000</resolved>
                                    <version>Lustre 2.1.1</version>
                                    <fixVersion>Lustre 2.2.0</fixVersion>
                                        <due></due>
                            <votes>0</votes>
                                    <watches>8</watches>
                                                                            <comments>
                            <comment id="35628" author="pjones" created="Sun, 29 Apr 2012 08:47:46 +0000"  >&lt;p&gt;Hongchao&lt;/p&gt;

&lt;p&gt;Could you please look into this one?&lt;/p&gt;

&lt;p&gt;Thanks&lt;/p&gt;

&lt;p&gt;Peter&lt;/p&gt;</comment>
                            <comment id="35947" author="hongchao.zhang" created="Wed, 2 May 2012 08:21:02 +0000"  >&lt;p&gt;in 2.1.1-4chaos, there could be a bug in reset_recovery_timer,&lt;br/&gt;
...&lt;br/&gt;
   left = cfs_time_sub(obd-&amp;gt;obd_recovery_end, now); &amp;lt;-- here, obd-&amp;gt;obd_recovery_end is less than now&lt;/p&gt;

&lt;p&gt;   if (extend &amp;amp;&amp;amp; (duration &amp;gt; left)&lt;br/&gt;
       obd-&amp;gt;obd_recovery_timeout += duration - left;&lt;br/&gt;
   else if (!extend &amp;amp;&amp;amp; (duration &amp;gt; obd-&amp;gt;obd_recovery_timeout))&lt;br/&gt;
       /* Track the client&apos;s largest expected replay time */&lt;br/&gt;
       obd-&amp;gt;obd_recovery_timeout = duration;&lt;br/&gt;
...&lt;/p&gt;

&lt;p&gt;when the recovery timer expired, this function will be called by target_recovery_overseer(in our master branch, this has been&lt;br/&gt;
changed to &quot;extent_recovery_timer&quot;), and obd-&amp;gt;obd_recovery_end is less than &quot;now&quot; and the calculation result could be wrong, &lt;br/&gt;
for the expired callback is only about 1 second interval (btw, cfs_time_t is &quot;unsigned long&quot; and cfs_duration_t is &quot;long&quot;)&lt;br/&gt;
...&lt;br/&gt;
Apr 25 12:36:29 roc-mds1 kernel: Lustre: ls5-MDT0000: recovery is timed out, evict stale exports&lt;br/&gt;
Apr 25 12:36:29 roc-mds1 kernel: Lustre: ls5-MDT0000: recovery is timed out, evict stale exports&lt;br/&gt;
Apr 25 12:36:30 roc-mds1 kernel: Lustre: ls5-MDT0000: recovery is timed out, evict stale exports..&lt;br/&gt;
Apr 25 12:36:32 roc-mds1 kernel: Lustre: ls5-MDT0000: recovery is timed out, evict stale exports&lt;br/&gt;
...&lt;/p&gt;

&lt;p&gt;-Is it unexpected to have multiple &quot;Starting recovery timer&quot; messages, or is this just normal extension of recovery timeout due to new client connections?&lt;/p&gt;

&lt;p&gt;it&apos;s not a extension of recovery timer, and there is a chance for target_handle_connect/target_start_and_reset_recovery_timer&lt;br/&gt;
to start a new recovery timer during these short timer armed by target_recovery_overseer/reset_recovery_timer&lt;/p&gt;

&lt;p&gt;-Should it be possible to start the recovery timer twice in the same second, as at 12:21:28?&lt;/p&gt;

&lt;p&gt;there is a race in check_and_start_recovery_timer (in our master branch, it has been fixed)&lt;br/&gt;
static void check_and_start_recovery_timer(struct obd_device *obd)&lt;br/&gt;
{&lt;br/&gt;
        cfs_spin_lock(&amp;amp;obd-&amp;gt;obd_recovery_task_lock);&lt;br/&gt;
        if (cfs_timer_is_armed(&amp;amp;obd-&amp;gt;obd_recovery_timer)) &lt;/p&gt;
{
                cfs_spin_unlock(&amp;amp;obd-&amp;gt;obd_recovery_task_lock);
                return;
        }
&lt;p&gt;        LCONSOLE_INFO(&quot;%s: Starting recovery timer for %d:%.02d\n&quot;,&lt;br/&gt;
                      obd-&amp;gt;obd_name, obd-&amp;gt;obd_recovery_timeout / 60,&lt;br/&gt;
                      obd-&amp;gt;obd_recovery_timeout % 60);&lt;br/&gt;
        obd-&amp;gt;obd_recovery_start = cfs_time_current_sec();&lt;br/&gt;
        cfs_spin_unlock(&amp;amp;obd-&amp;gt;obd_recovery_task_lock);            &lt;br/&gt;
                                                                  &amp;lt;-- race here, another call can do it again.&lt;br/&gt;
        reset_recovery_timer(obd, obd-&amp;gt;obd_recovery_timeout, 0);&lt;br/&gt;
}&lt;/p&gt;

&lt;p&gt;-How many times should &quot;recovery is timed out, evict stale exports&quot; appear? (Looking at target_recovery_overseer(), it seems it should be at most twice.)&lt;/p&gt;

&lt;p&gt;it will continue to appear if there are still healthy recovering clients.&lt;/p&gt;

&lt;p&gt;-In check_and_start_recovery_timer(), is the cfs_timer_is_armed() check sufficient to avoid race conditions, or does it need to also check the obd_device recovery flags?&lt;/p&gt;

&lt;p&gt;yes, it isn&apos;t sufficient&lt;/p&gt;</comment>
                            <comment id="38295" author="hongchao.zhang" created="Tue, 8 May 2012 07:00:23 +0000"  >&lt;p&gt;status update:&lt;/p&gt;

&lt;p&gt;the related tickets are: &lt;br/&gt;
ORNL-28 &lt;a href=&quot;http://review.whamcloud.com/1292&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;http://review.whamcloud.com/1292&lt;/a&gt;, &lt;a href=&quot;http://review.whamcloud.com/1293&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;http://review.whamcloud.com/1293&lt;/a&gt;, &lt;a href=&quot;http://review.whamcloud.com/1620&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;http://review.whamcloud.com/1620&lt;/a&gt;&lt;br/&gt;
&lt;a href=&quot;https://jira.whamcloud.com/browse/LU-889&quot; title=&quot;rework extent_recovery_timer()&quot; class=&quot;issue-link&quot; data-issue-key=&quot;LU-889&quot;&gt;&lt;del&gt;LU-889&lt;/del&gt;&lt;/a&gt; &lt;a href=&quot;http://review.whamcloud.com/1722&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;http://review.whamcloud.com/1722&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;the pending patch will try to backport these patches to b2_1&lt;/p&gt;</comment>
                            <comment id="38508" author="hongchao.zhang" created="Thu, 10 May 2012 07:20:46 +0000"  >&lt;p&gt;status update:&lt;br/&gt;
the patch is under test, and there are still some problems in it and hope to attach it before the weekend.&lt;/p&gt;</comment>
                            <comment id="38626" author="hongchao.zhang" created="Fri, 11 May 2012 10:03:54 +0000"  >&lt;p&gt;the patch is tracked at &lt;a href=&quot;http://review.whamcloud.com/#change,2719&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;http://review.whamcloud.com/#change,2719&lt;/a&gt;&lt;/p&gt;</comment>
                            <comment id="38644" author="morrone" created="Fri, 11 May 2012 13:49:52 +0000"  >&lt;p&gt;I think that when porting patches to another branch the patches need to remain separate.  The commit messages should be mostly the same as well (especially the bug reference number and first line summary).  It will be very difficult to make sense of what is in a branch using &quot;git log --oneline&quot; if we squash multiple commits into one on another branch.&lt;/p&gt;</comment>
                            <comment id="38818" author="hongchao.zhang" created="Tue, 15 May 2012 10:46:57 +0000"  >&lt;p&gt;this patch is part of the patches landed on master, and it mainly bases on the implementation of IR(Imperative Recovery),&lt;br/&gt;
and the patch &lt;a href=&quot;http://review.whamcloud.com/1620&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;http://review.whamcloud.com/1620&lt;/a&gt; and &lt;a href=&quot;http://review.whamcloud.com/1722&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;http://review.whamcloud.com/1722&lt;/a&gt; are fixing the problem in &lt;br/&gt;
&lt;a href=&quot;http://review.whamcloud.com/1292&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;http://review.whamcloud.com/1292&lt;/a&gt;, &lt;a href=&quot;http://review.whamcloud.com/2674&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;http://review.whamcloud.com/2674&lt;/a&gt; is a separated patch, then how about creating two patches&lt;br/&gt;
to backport it?&lt;/p&gt;</comment>
                            <comment id="40519" author="nedbass" created="Wed, 13 Jun 2012 13:13:07 +0000"  >&lt;p&gt;Hi Hongchao,&lt;/p&gt;

&lt;p&gt;That approach sounds reasonable to me.  Thanks&lt;/p&gt;</comment>
                            <comment id="41393" author="hongchao.zhang" created="Tue, 3 Jul 2012 04:09:13 +0000"  >&lt;p&gt;status update:&lt;br/&gt;
the first patch is tracked at &lt;a href=&quot;http://review.whamcloud.com/#change,2719&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;http://review.whamcloud.com/#change,2719&lt;/a&gt;, and the second patch is upon the first one&lt;br/&gt;
and will attach it once the first is merged.&lt;/p&gt;</comment>
                            <comment id="41668" author="morrone" created="Tue, 10 Jul 2012 13:50:12 +0000"  >&lt;p&gt;If you have a second patch that is needed, please submit it to gerrit now as well.  We can give it some testing now on our end.&lt;/p&gt;</comment>
                            <comment id="47100" author="bfaccini" created="Tue, 30 Oct 2012 13:18:45 +0000"  >&lt;p&gt;We also experienced the same issue at TGCC site, and what is not clear for me is if &quot;http://review.whamcloud.com/#change,2719&quot; patch is b2_1 only and just a backport of the new recovery timer algorithms as implemented in b2_3/master ??...&lt;/p&gt;</comment>
                            <comment id="147678" author="adilger" created="Sun, 3 Apr 2016 03:07:25 +0000"  >&lt;p&gt;Closing old 2.1 bug.  Problem was fixed in 2.2 and fix was backported to 2.1.&lt;/p&gt;</comment>
                    </comments>
                    <attachments>
                    </attachments>
                <subtasks>
                    </subtasks>
                <customfields>
                                                                                                                                                                                            <customfield id="customfield_10890" key="com.atlassian.jira.plugins.jira-development-integration-plugin:devsummary">
                        <customfieldname>Development</customfieldname>
                        <customfieldvalues>
                            
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                        <customfield id="customfield_10390" key="com.pyxis.greenhopper.jira:gh-lexo-rank">
                        <customfieldname>Rank</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>1|hzv3a7:</customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_10090" key="com.pyxis.greenhopper.jira:gh-global-rank">
                        <customfieldname>Rank (Obsolete)</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>4031</customfieldvalue>
                        </customfieldvalues>
                    </customfield>
                                                                                            <customfield id="customfield_10060" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                        <customfieldname>Severity</customfieldname>
                        <customfieldvalues>
                                <customfieldvalue key="10022"><![CDATA[3]]></customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                        </customfields>
    </item>
</channel>
</rss>