@Override
    public ProcResult fetchResult() throws AnalysisException {
        Preconditions.checkNotNull(backend);

        BaseProcResult result = new BaseProcResult();
        result.setNames(TITLE_NAMES);

        for (Map.Entry<String, DiskInfo> entry : backend.getDisks().entrySet()) {
            DiskInfo diskInfo = entry.getValue();
            long dataUsedB = diskInfo.getDataUsedCapacityB();
            long availB = diskInfo.getAvailableCapacityB();
            long totalB = diskInfo.getTotalCapacityB();
            long dataTotalB = diskInfo.getDataTotalCapacityB();
            long otherUsedB = totalB - availB - dataUsedB;

            List<String> info = Lists.newArrayList();
            // path
            info.add(entry.getKey());

            // data used
            Pair<Double, String> dataUsedUnitPair = DebugUtil.getByteUint(dataUsedB);
            info.add(DebugUtil.DECIMAL_FORMAT_SCALE_3.format(dataUsedUnitPair.first) + " " + dataUsedUnitPair.second);

            // other used
            Pair<Double, String> otherUsedUnitPair = DebugUtil.getByteUint(otherUsedB);
            info.add(DebugUtil.DECIMAL_FORMAT_SCALE_3.format(otherUsedUnitPair.first) + " " + otherUsedUnitPair.second);

            // avail
            Pair<Double, String> availUnitPair = DebugUtil.getByteUint(availB);
            info.add(DebugUtil.DECIMAL_FORMAT_SCALE_3.format(availUnitPair.first) + " " + availUnitPair.second);

            // total
            Pair<Double, String> totalUnitPair = DebugUtil.getByteUint(totalB);
            info.add(DebugUtil.DECIMAL_FORMAT_SCALE_3.format(totalUnitPair.first) + " " + totalUnitPair.second);

            // total used percent
            double used = 0.0;
            if (totalB <= 0) {
                used = 0.0;
            } else {
                used = (double) (totalB - availB) * 100 / totalB;
            }
            info.add(String.format("%.2f", used) + " %");

            // state
            info.add(diskInfo.getState().name());

            // path hash
            info.add(String.valueOf(diskInfo.getPathHash()));

            // medium
            TStorageMedium medium = diskInfo.getStorageMedium();
            if (medium == null) {
                info.add("N/A");
            } else {
                info.add(medium.name());
            }

            // tablet num
            info.add(String.valueOf(GlobalStateMgr.getCurrentState().getTabletInvertedIndex().getTabletNumByBackendIdAndPathHash(
                    backend.getId(), diskInfo.getPathHash())));

            // data total
            Pair<Double, String> dataTotalUnitPair = DebugUtil.getByteUint(dataTotalB);
            info.add(DebugUtil.DECIMAL_FORMAT_SCALE_3.format(dataTotalUnitPair.first) + " " + dataTotalUnitPair.second);

            // data used percent
            double dataUsed = 0.0;
            if (dataTotalB <= 0) {
                dataUsed = 0.0;
            } else {
                dataUsed = (double) dataUsedB * 100 / dataTotalB;
            }
            info.add(String.format("%.2f", dataUsed) + " %");

            result.addRow(info);
        }

        return result;
    }
@Test
    public void testResultNormal() throws AnalysisException {
        BackendProcNode node = new BackendProcNode(b1);
        ProcResult result;

        // fetch result
        result = node.fetchResult();
        Assert.assertNotNull(result);
        Assert.assertTrue(result instanceof BaseProcResult);

        Assert.assertTrue(result.getRows().size() >= 1);
        Assert.assertEquals(
                Lists.newArrayList("RootPath", "DataUsedCapacity", "OtherUsedCapacity", "AvailCapacity",
                        "TotalCapacity", "TotalUsedPct", "State", "PathHash", "StorageMedium", "TabletNum",
                        "DataTotalCapacity", "DataUsedPct"),
                result.getColumnNames());
    }