diff mbox

ceph: Use pseudo-random numbers to choose mds

Message ID 1365606338-12278-1-git-send-email-sam.lang@inktank.com (mailing list archive)
State New, archived
Headers show

Commit Message

Sam Lang April 10, 2013, 3:05 p.m. UTC
We don't need to use up entropy to choose an mds,
so use prandom_u32() to get a pseudo-random number.

Also, we don't need to choose a random mds if only
one mds is available, so add special casing for the
common case.

Fixes http://tracker.ceph.com/issues/3579

Signed-off-by: Sam Lang <sam.lang@inktank.com>
---
 fs/ceph/mdsmap.c |    8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

Comments

Gregory Farnum April 11, 2013, 5:25 p.m. UTC | #1
Yup, that is a change to not use entropy and to short-circuit if we
only have one choice. And this function has no side effects so it just
needs to return an int.

Reviewed-by: Greg Farnum <greg@inktank.com>
Software Engineer #42 @ http://inktank.com | http://ceph.com


On Wed, Apr 10, 2013 at 8:05 AM, Sam Lang <samlang@gmail.com> wrote:
> We don't need to use up entropy to choose an mds,
> so use prandom_u32() to get a pseudo-random number.
>
> Also, we don't need to choose a random mds if only
> one mds is available, so add special casing for the
> common case.
>
> Fixes http://tracker.ceph.com/issues/3579
>
> Signed-off-by: Sam Lang <sam.lang@inktank.com>
> ---
>  fs/ceph/mdsmap.c |    8 +++++---
>  1 file changed, 5 insertions(+), 3 deletions(-)
>
> diff --git a/fs/ceph/mdsmap.c b/fs/ceph/mdsmap.c
> index 0d3c924..9278dec 100644
> --- a/fs/ceph/mdsmap.c
> +++ b/fs/ceph/mdsmap.c
> @@ -20,7 +20,10 @@ int ceph_mdsmap_get_random_mds(struct ceph_mdsmap *m)
>  {
>         int n = 0;
>         int i;
> -       char r;
> +
> +       /* special case for one mds */
> +       if (1 == m->m_max_mds && m->m_info[0].state > 0)
> +               return 0;
>
>         /* count */
>         for (i = 0; i < m->m_max_mds; i++)
> @@ -30,8 +33,7 @@ int ceph_mdsmap_get_random_mds(struct ceph_mdsmap *m)
>                 return -1;
>
>         /* pick */
> -       get_random_bytes(&r, 1);
> -       n = r % n;
> +       n = prandom_u32() % n;
>         i = 0;
>         for (i = 0; n > 0; i++, n--)
>                 while (m->m_info[i].state <= 0)
> --
> 1.7.10.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/fs/ceph/mdsmap.c b/fs/ceph/mdsmap.c
index 0d3c924..9278dec 100644
--- a/fs/ceph/mdsmap.c
+++ b/fs/ceph/mdsmap.c
@@ -20,7 +20,10 @@  int ceph_mdsmap_get_random_mds(struct ceph_mdsmap *m)
 {
 	int n = 0;
 	int i;
-	char r;
+
+	/* special case for one mds */
+	if (1 == m->m_max_mds && m->m_info[0].state > 0)
+		return 0;
 
 	/* count */
 	for (i = 0; i < m->m_max_mds; i++)
@@ -30,8 +33,7 @@  int ceph_mdsmap_get_random_mds(struct ceph_mdsmap *m)
 		return -1;
 
 	/* pick */
-	get_random_bytes(&r, 1);
-	n = r % n;
+	n = prandom_u32() % n;
 	i = 0;
 	for (i = 0; n > 0; i++, n--)
 		while (m->m_info[i].state <= 0)