| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package org.apache.hadoop.yarn.server.sharedcache; |
| |
| import org.apache.commons.logging.Log; |
| import org.apache.commons.logging.LogFactory; |
| import org.apache.hadoop.classification.InterfaceAudience.Private; |
| import org.apache.hadoop.classification.InterfaceStability.Unstable; |
| import org.apache.hadoop.conf.Configuration; |
| import org.apache.hadoop.fs.Path; |
| import org.apache.hadoop.yarn.conf.YarnConfiguration; |
| |
| /** |
| * A utility class that contains helper methods for dealing with the internal |
| * shared cache structure. |
| */ |
| @Private |
| @Unstable |
| public class SharedCacheUtil { |
| |
| private static final Log LOG = LogFactory.getLog(SharedCacheUtil.class); |
| |
| @Private |
| public static int getCacheDepth(Configuration conf) { |
| int cacheDepth = |
| conf.getInt(YarnConfiguration.SHARED_CACHE_NESTED_LEVEL, |
| YarnConfiguration.DEFAULT_SHARED_CACHE_NESTED_LEVEL); |
| |
| if (cacheDepth <= 0) { |
| LOG.warn("Specified cache depth was less than or equal to zero." |
| + " Using default value instead. Default: " |
| + YarnConfiguration.DEFAULT_SHARED_CACHE_NESTED_LEVEL |
| + ", Specified: " + cacheDepth); |
| cacheDepth = YarnConfiguration.DEFAULT_SHARED_CACHE_NESTED_LEVEL; |
| } |
| |
| return cacheDepth; |
| } |
| |
| @Private |
| public static String getCacheEntryPath(int cacheDepth, String cacheRoot, |
| String checksum) { |
| |
| if (cacheDepth <= 0) { |
| throw new IllegalArgumentException( |
| "The cache depth must be greater than 0. Passed value: " + cacheDepth); |
| } |
| if (checksum.length() < cacheDepth) { |
| throw new IllegalArgumentException("The checksum passed was too short: " |
| + checksum); |
| } |
| |
| // Build the cache entry path to the specified depth. For example, if the |
| // depth is 3 and the checksum is 3c4f, the path would be: |
| // SHARED_CACHE_ROOT/3/c/4/3c4f |
| StringBuilder sb = new StringBuilder(cacheRoot); |
| for (int i = 0; i < cacheDepth; i++) { |
| sb.append(Path.SEPARATOR_CHAR); |
| sb.append(checksum.charAt(i)); |
| } |
| sb.append(Path.SEPARATOR_CHAR).append(checksum); |
| |
| return sb.toString(); |
| } |
| |
| @Private |
| public static String getCacheEntryGlobPattern(int depth) { |
| StringBuilder pattern = new StringBuilder(); |
| for (int i = 0; i < depth; i++) { |
| pattern.append("*/"); |
| } |
| pattern.append("*"); |
| return pattern.toString(); |
| } |
| } |