diff --git a/mercurial/setdiscovery.py b/mercurial/setdiscovery.py
index 0fc4686de1d762844c21f134bc6fdb010b7e6ec5_bWVyY3VyaWFsL3NldGRpc2NvdmVyeS5weQ==..ee45f5c2ffcc7d1a09306b334eaba4b5bfdd74e7_bWVyY3VyaWFsL3NldGRpc2NvdmVyeS5weQ== 100644
--- a/mercurial/setdiscovery.py
+++ b/mercurial/setdiscovery.py
@@ -105,11 +105,10 @@
     # update from roots
     _updatesample(dag.inverse(), nodes, sample, always)
     assert sample
-    if len(sample) > desiredlen:
-        sample = set(random.sample(sample, desiredlen))
-    elif len(sample) < desiredlen:
+    sample = _limitsample(sample, desiredlen)
+    if len(sample) < desiredlen:
         more = desiredlen - len(sample)
         sample.update(random.sample(list(nodes - sample - always), more))
     sample.update(always)
     return sample
 
@@ -111,8 +110,14 @@
         more = desiredlen - len(sample)
         sample.update(random.sample(list(nodes - sample - always), more))
     sample.update(always)
     return sample
 
+def _limitsample(sample, desiredlen):
+    """return a random subset of sample of at most desiredlen item"""
+    if len(sample) > desiredlen:
+        sample = set(random.sample(sample, desiredlen))
+    return sample
+
 def findcommonheads(ui, local, remote,
                     initialsamplesize=100,
                     fullsamplesize=200,