content: /*
   * The Alluxio Open Foundation licenses this work under the Apache License, version 2.0
   * (the "License"). You may not use this work except in compliance with the License, which is
   * available at www.apache.org/licenses/LICENSE-2.0
   *
   * This software is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
   * either express or implied, as more fully set forth in the License.
   *
   * See the NOTICE file distributed with this work for information regarding copyright ownership.
   */
  
  package alluxio.util;
  
  /**
   * Utility method called in alluxio-mount.sh to calculate space for Mac OS X HFS+.
   * Metadata zone size is estimated by using specifications noted at
   * http://dubeiko.com/development/FileSystems/HFSPLUS/tn1150.html#MetadataZone,
   * which is slightly larger than actually metadata zone size created by hdiuitl command.
   */
  public final class HFSUtils {
  
    /**
     * Converts the memory size to number of sectors.
     *
     * @param requestSize requested filesystem size in bytes
     * @param sectorSize the size of each sector in bytes
     * @return total sectors of HFS+ including estimated metadata zone size
     */
    public static long getNumSector(String requestSize, String sectorSize) {
      Double memSize = Double.parseDouble(requestSize);
      Double sectorBytes = Double.parseDouble(sectorSize);
      Double nSectors = memSize / sectorBytes;
      Double memSizeKB = memSize / 1024;
      Double memSizeGB = memSize / (1024 * 1024 * 1024);
      Double memSize100GB = memSizeGB / 100;
  
      // allocation bitmap file: one bit per sector
      Double allocBitmapSize = nSectors / 8;
  
      // extend overflow file: 4MB, plus 4MB per 100GB
      Double extOverflowFileSize = memSize100GB * 1024 * 1024 * 4;
  
      // journal file: 8MB, plus 8MB per 100GB
      Double journalFileSize = memSize100GB * 1024 * 1024 * 8;
  
      // catalog file: 10bytes per KB
      Double catalogFileSize = memSizeKB * 10;
  
      // hot files: 5bytes per KB
      Double hotFileSize = memSizeKB * 5;
  
      // quota users file and quota groups file
      Double quotaUsersFileSize = (memSizeGB * 256 + 1) * 64;
      Double quotaGroupsFileSize = (memSizeGB * 32 + 1) * 64;
      Double metadataSize = allocBitmapSize + extOverflowFileSize + journalFileSize
          + catalogFileSize + hotFileSize + quotaUsersFileSize + quotaGroupsFileSize;
  
      Double allocSize = memSize + metadataSize;
      Double numSectors = allocSize / sectorBytes;
  
      System.out.println(numSectors.longValue() + 1); // round up
      return numSectors.longValue() + 1;
    }
  
    /**
     * The main class to invoke the getNumSector.
     *
     * @param args the arguments parsed by commandline
     */
    public static void main(String[] args) {
      if (args.length != 2) {
        System.exit(-1);
      }
      String mem = args[0];
      String sector = args[1];
      try {
        getNumSector(mem, sector);
      } catch (Exception e) {
        throw new RuntimeException(e);
      }
    }
  
    private HFSUtils() {} // prevent instantiation
  }
  