Re: [PATCH 1/2] No MDS mount error fix

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Then we have to make a choice between immediately returning with error and patiently waiting for mds joining. My suggestion is (1) Leave an error message from the kernel using 'printk(KERN_WARN"no active mds")' something in __choose_mds() (2) Add a return value 'E_WAITING_FOR_MAP' to __choose_mds(), and capture it in ceph_mdsc_do_request(), if the user feel boring to CRTL+C to kill the mount process (user should at least know how to interrupt the mount :) ), then ceph_mdsc_do_request() know that it is interrupted while waiting for new map, then return good error message to user.

On 2013/12/9 22:50, Михась Кампос wrote:
I agree with some points. But this patches originally created to fix
"confusing for new users for hard-understandable return messages" (based
on http://tracker.ceph.com/issues/4386). The idea was to return a
different error code, which can be than handled by ceph.mount client for
printing simple message about "what's going on".


2013/12/9 Li Wang <liwang@xxxxxxxxxxxxxxx <mailto:liwang@xxxxxxxxxxxxxxx>>

    Personally, I don't think there is issue for current implementation,
    either. If no ACTIVE mds, the mount process put to wait, until
    updated MDS map received and with active mds present indicated in
    the map, it will be waked up and go on the mount process, otherwise,
    EIO returned if timeout. If it is boring to hang for a long time,
    you can specify a shorter mount timeout.


    On 2013/12/8 2:59, Mikhail Campos Guadamuz wrote:

        For http://tracker.ceph.com/__issues/4386
        <http://tracker.ceph.com/issues/4386>

        It determines situation, when a user is trying to mount CephFS
        with no MDS present. Return ECOMM from
        open_root_dentry which can be analyzed then by ceph.mount

        Signed-off-by: Mikhail Campos Guadamuz <plageat90@xxxxxxxxx
        <mailto:plageat90@xxxxxxxxx>>
        ---
           fs/ceph/mdsmap.c            | 19 ++++++++++++++++---
           fs/ceph/super.c             | 10 +++++++++-
           include/linux/ceph/mdsmap.h |  1 +
           3 files changed, 26 insertions(+), 4 deletions(-)

        diff --git a/fs/ceph/mdsmap.c b/fs/ceph/mdsmap.c
        index 132b64e..3a6ba8a 100644
        --- a/fs/ceph/mdsmap.c
        +++ b/fs/ceph/mdsmap.c
        @@ -12,6 +12,20 @@

           #include "super.h"

        +/*
        + * count active mds's
        + */
        +int ceph_mdsmap_active_mds_count(__struct ceph_mdsmap *m)
        +{
        +    int n = 0;
        +    int i;
        +
        +    for(i = 0; i < m->m_max_mds; ++i)
        +       if(m->m_info[i].state > 0)
        +           ++n;
        +
        +    return  n;
        +}

           /*
            * choose a random mds that is "up" (i.e. has a state > 0),
        or -1.
        @@ -26,9 +40,8 @@ int ceph_mdsmap_get_random_mds(__struct
        ceph_mdsmap *m)
                         return 0;

                 /* count */
        -       for (i = 0; i < m->m_max_mds; i++)
        -               if (m->m_info[i].state > 0)
        -                       n++;
        +       n = ceph_mdsmap_active_mds_count(__m);
        +
                 if (n == 0)
                         return -1;

        diff --git a/fs/ceph/super.c b/fs/ceph/super.c
        index 6627b26..4d33d68 100644
        --- a/fs/ceph/super.c
        +++ b/fs/ceph/super.c
        @@ -674,7 +674,15 @@ static struct dentry
        *open_root_dentry(struct ceph_fs_client *fsc,
                 struct ceph_mds_request *req = NULL;
                 int err;
                 struct dentry *root;
        -
        +
        +       /* check for mds*/
        +       if( 0 == ceph_mdsmap_active_mds_count(__mdsc->mdsmap) )
        +       {
        +           pr_info("active mds not found, possible not exist\n");
        +           root = ERR_PTR( -ECOMM );
        +           return root;
        +       }
        +
                 /* open dir */
                 dout("open_root_inode opening '%s'\n", path);
                 req = ceph_mdsc_create_request(mdsc,
        CEPH_MDS_OP_GETATTR, USE_ANY_MDS);
        diff --git a/include/linux/ceph/mdsmap.h
        b/include/linux/ceph/mdsmap.h
        index 87ed09f..4d7d502 100644
        --- a/include/linux/ceph/mdsmap.h
        +++ b/include/linux/ceph/mdsmap.h
        @@ -56,6 +56,7 @@ static inline bool ceph_mdsmap_is_laggy(struct
        ceph_mdsmap *m, int w)
                 return false;
           }

        +extern int ceph_mdsmap_active_mds_count(__struct ceph_mdsmap *m);
           extern int ceph_mdsmap_get_random_mds(__struct ceph_mdsmap *m);
           extern struct ceph_mdsmap *ceph_mdsmap_decode(void **p, void
        *end);
           extern void ceph_mdsmap_destroy(struct ceph_mdsmap *m);


--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [CEPH Users]     [Ceph Large]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux