/// <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); }