/// <summary>
        /// Wait until balanced: each datanode gives utilization within
        /// BALANCE_ALLOWED_VARIANCE of average
        /// </summary>
        /// <exception cref="System.IO.IOException"/>
        /// <exception cref="Sharpen.TimeoutException"/>
        private void WaitForBalancer(long totalUsedSpace, long totalCapacity)
        {
            long   timeout        = Timeout;
            long   failtime       = (timeout <= 0L) ? long.MaxValue : Runtime.CurrentTimeMillis() + timeout;
            double avgUtilization = ((double)totalUsedSpace) / totalCapacity;
            bool   balanced;

            do
            {
                DatanodeInfo[] datanodeReport = client.GetDatanodeReport(HdfsConstants.DatanodeReportType
                                                                         .All);
                NUnit.Framework.Assert.AreEqual(datanodeReport.Length, cluster.GetDataNodes().Count
                                                );
                balanced = true;
                foreach (DatanodeInfo datanode in datanodeReport)
                {
                    double nodeUtilization = ((double)datanode.GetDfsUsed()) / datanode.GetCapacity();
                    if (Math.Abs(avgUtilization - nodeUtilization) > BalanceAllowedVariance)
                    {
                        balanced = false;
                        if (Runtime.CurrentTimeMillis() > failtime)
                        {
                            throw new TimeoutException("Rebalancing expected avg utilization to become " + avgUtilization
                                                       + ", but on datanode " + datanode + " it remains at " + nodeUtilization + " after more than "
                                                       + Timeout + " msec.");
                        }
                        try
                        {
                            Sharpen.Thread.Sleep(100);
                        }
                        catch (Exception)
                        {
                        }
                        break;
                    }
                }
            }while (!balanced);
        }