|
@@ -35,6 +35,7 @@ import org.apache.hadoop.fs.FileStatus;
|
|
import org.apache.hadoop.fs.FileSystem;
|
|
import org.apache.hadoop.fs.FileSystem;
|
|
import org.apache.hadoop.fs.Path;
|
|
import org.apache.hadoop.fs.Path;
|
|
import org.apache.hadoop.fs.PositionedReadable;
|
|
import org.apache.hadoop.fs.PositionedReadable;
|
|
|
|
+import org.apache.hadoop.fs.QuotaUsage;
|
|
import org.apache.hadoop.fs.Seekable;
|
|
import org.apache.hadoop.fs.Seekable;
|
|
import org.apache.hadoop.fs.StorageType;
|
|
import org.apache.hadoop.fs.StorageType;
|
|
import org.apache.hadoop.fs.XAttrCodec;
|
|
import org.apache.hadoop.fs.XAttrCodec;
|
|
@@ -188,9 +189,16 @@ public class HttpFSFileSystem extends FileSystem
|
|
public static final String CONTENT_SUMMARY_DIRECTORY_COUNT_JSON = "directoryCount";
|
|
public static final String CONTENT_SUMMARY_DIRECTORY_COUNT_JSON = "directoryCount";
|
|
public static final String CONTENT_SUMMARY_FILE_COUNT_JSON = "fileCount";
|
|
public static final String CONTENT_SUMMARY_FILE_COUNT_JSON = "fileCount";
|
|
public static final String CONTENT_SUMMARY_LENGTH_JSON = "length";
|
|
public static final String CONTENT_SUMMARY_LENGTH_JSON = "length";
|
|
- public static final String CONTENT_SUMMARY_QUOTA_JSON = "quota";
|
|
|
|
- public static final String CONTENT_SUMMARY_SPACE_CONSUMED_JSON = "spaceConsumed";
|
|
|
|
- public static final String CONTENT_SUMMARY_SPACE_QUOTA_JSON = "spaceQuota";
|
|
|
|
|
|
+
|
|
|
|
+ public static final String QUOTA_USAGE_JSON = "QuotaUsage";
|
|
|
|
+ public static final String QUOTA_USAGE_FILE_AND_DIRECTORY_COUNT_JSON =
|
|
|
|
+ "fileAndDirectoryCount";
|
|
|
|
+ public static final String QUOTA_USAGE_QUOTA_JSON = "quota";
|
|
|
|
+ public static final String QUOTA_USAGE_SPACE_CONSUMED_JSON = "spaceConsumed";
|
|
|
|
+ public static final String QUOTA_USAGE_SPACE_QUOTA_JSON = "spaceQuota";
|
|
|
|
+ public static final String QUOTA_USAGE_CONSUMED_JSON = "consumed";
|
|
|
|
+ public static final String QUOTA_USAGE_TYPE_QUOTA_JSON = "typeQuota";
|
|
|
|
+
|
|
|
|
|
|
public static final String ACL_STATUS_JSON = "AclStatus";
|
|
public static final String ACL_STATUS_JSON = "AclStatus";
|
|
public static final String ACL_STICKY_BIT_JSON = "stickyBit";
|
|
public static final String ACL_STICKY_BIT_JSON = "stickyBit";
|
|
@@ -219,8 +227,9 @@ public class HttpFSFileSystem extends FileSystem
|
|
public enum Operation {
|
|
public enum Operation {
|
|
OPEN(HTTP_GET), GETFILESTATUS(HTTP_GET), LISTSTATUS(HTTP_GET),
|
|
OPEN(HTTP_GET), GETFILESTATUS(HTTP_GET), LISTSTATUS(HTTP_GET),
|
|
GETHOMEDIRECTORY(HTTP_GET), GETCONTENTSUMMARY(HTTP_GET),
|
|
GETHOMEDIRECTORY(HTTP_GET), GETCONTENTSUMMARY(HTTP_GET),
|
|
- GETFILECHECKSUM(HTTP_GET), GETFILEBLOCKLOCATIONS(HTTP_GET),
|
|
|
|
- INSTRUMENTATION(HTTP_GET), GETACLSTATUS(HTTP_GET), GETTRASHROOT(HTTP_GET),
|
|
|
|
|
|
+ GETQUOTAUSAGE(HTTP_GET), GETFILECHECKSUM(HTTP_GET),
|
|
|
|
+ GETFILEBLOCKLOCATIONS(HTTP_GET), INSTRUMENTATION(HTTP_GET),
|
|
|
|
+ GETACLSTATUS(HTTP_GET), GETTRASHROOT(HTTP_GET),
|
|
APPEND(HTTP_POST), CONCAT(HTTP_POST), TRUNCATE(HTTP_POST),
|
|
APPEND(HTTP_POST), CONCAT(HTTP_POST), TRUNCATE(HTTP_POST),
|
|
CREATE(HTTP_PUT), MKDIRS(HTTP_PUT), RENAME(HTTP_PUT), SETOWNER(HTTP_PUT),
|
|
CREATE(HTTP_PUT), MKDIRS(HTTP_PUT), RENAME(HTTP_PUT), SETOWNER(HTTP_PUT),
|
|
SETPERMISSION(HTTP_PUT), SETREPLICATION(HTTP_PUT), SETTIMES(HTTP_PUT),
|
|
SETPERMISSION(HTTP_PUT), SETREPLICATION(HTTP_PUT), SETTIMES(HTTP_PUT),
|
|
@@ -1116,14 +1125,65 @@ public class HttpFSFileSystem extends FileSystem
|
|
getConnection(Operation.GETCONTENTSUMMARY.getMethod(), params, f, true);
|
|
getConnection(Operation.GETCONTENTSUMMARY.getMethod(), params, f, true);
|
|
HttpExceptionUtils.validateResponse(conn, HttpURLConnection.HTTP_OK);
|
|
HttpExceptionUtils.validateResponse(conn, HttpURLConnection.HTTP_OK);
|
|
JSONObject json = (JSONObject) ((JSONObject)
|
|
JSONObject json = (JSONObject) ((JSONObject)
|
|
- HttpFSUtils.jsonParse(conn)).get(CONTENT_SUMMARY_JSON);
|
|
|
|
- return new ContentSummary.Builder().
|
|
|
|
- length((Long) json.get(CONTENT_SUMMARY_LENGTH_JSON)).
|
|
|
|
- fileCount((Long) json.get(CONTENT_SUMMARY_FILE_COUNT_JSON)).
|
|
|
|
- directoryCount((Long) json.get(CONTENT_SUMMARY_DIRECTORY_COUNT_JSON)).
|
|
|
|
- quota((Long) json.get(CONTENT_SUMMARY_QUOTA_JSON)).
|
|
|
|
- spaceConsumed((Long) json.get(CONTENT_SUMMARY_SPACE_CONSUMED_JSON)).
|
|
|
|
- spaceQuota((Long) json.get(CONTENT_SUMMARY_SPACE_QUOTA_JSON)).build();
|
|
|
|
|
|
+ HttpFSUtils.jsonParse(conn)).get(CONTENT_SUMMARY_JSON);
|
|
|
|
+ ContentSummary.Builder builder = new ContentSummary.Builder()
|
|
|
|
+ .length((Long) json.get(CONTENT_SUMMARY_LENGTH_JSON))
|
|
|
|
+ .fileCount((Long) json.get(CONTENT_SUMMARY_FILE_COUNT_JSON))
|
|
|
|
+ .directoryCount((Long) json.get(CONTENT_SUMMARY_DIRECTORY_COUNT_JSON));
|
|
|
|
+ builder = buildQuotaUsage(builder, json, ContentSummary.Builder.class);
|
|
|
|
+ return builder.build();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public QuotaUsage getQuotaUsage(Path f) throws IOException {
|
|
|
|
+ Map<String, String> params = new HashMap<>();
|
|
|
|
+ params.put(OP_PARAM, Operation.GETQUOTAUSAGE.toString());
|
|
|
|
+ HttpURLConnection conn =
|
|
|
|
+ getConnection(Operation.GETQUOTAUSAGE.getMethod(), params, f, true);
|
|
|
|
+ JSONObject json = (JSONObject) ((JSONObject)
|
|
|
|
+ HttpFSUtils.jsonParse(conn)).get(QUOTA_USAGE_JSON);
|
|
|
|
+ QuotaUsage.Builder builder = new QuotaUsage.Builder();
|
|
|
|
+ builder = buildQuotaUsage(builder, json, QuotaUsage.Builder.class);
|
|
|
|
+ return builder.build();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Given a builder for QuotaUsage, parse the provided JSON object and
|
|
|
|
+ * construct the relevant fields. Return the updated builder.
|
|
|
|
+ */
|
|
|
|
+ private static <T extends QuotaUsage.Builder> T buildQuotaUsage(
|
|
|
|
+ T builder, JSONObject json, Class<T> type) {
|
|
|
|
+ long quota = (Long) json.get(QUOTA_USAGE_QUOTA_JSON);
|
|
|
|
+ long spaceConsumed = (Long) json.get(QUOTA_USAGE_SPACE_CONSUMED_JSON);
|
|
|
|
+ long spaceQuota = (Long) json.get(QUOTA_USAGE_SPACE_QUOTA_JSON);
|
|
|
|
+ JSONObject typeJson = (JSONObject) json.get(QUOTA_USAGE_TYPE_QUOTA_JSON);
|
|
|
|
+
|
|
|
|
+ builder = type.cast(builder
|
|
|
|
+ .quota(quota)
|
|
|
|
+ .spaceConsumed(spaceConsumed)
|
|
|
|
+ .spaceQuota(spaceQuota)
|
|
|
|
+ );
|
|
|
|
+
|
|
|
|
+ // ContentSummary doesn't set this so check before using it
|
|
|
|
+ if (json.get(QUOTA_USAGE_FILE_AND_DIRECTORY_COUNT_JSON) != null) {
|
|
|
|
+ long fileAndDirectoryCount = (Long)
|
|
|
|
+ json.get(QUOTA_USAGE_FILE_AND_DIRECTORY_COUNT_JSON);
|
|
|
|
+ builder = type.cast(builder.fileAndDirectoryCount(fileAndDirectoryCount));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (typeJson != null) {
|
|
|
|
+ for (StorageType t : StorageType.getTypesSupportingQuota()) {
|
|
|
|
+ JSONObject typeQuota = (JSONObject) typeJson.get(t.toString());
|
|
|
|
+ if (typeQuota != null) {
|
|
|
|
+ builder = type.cast(builder
|
|
|
|
+ .typeQuota(t, ((Long) typeQuota.get(QUOTA_USAGE_QUOTA_JSON)))
|
|
|
|
+ .typeConsumed(t, ((Long) typeQuota.get(QUOTA_USAGE_CONSUMED_JSON))
|
|
|
|
+ ));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return builder;
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|