On 16 November 2010 06:56, Regis <xu.re...@gmail.com> wrote: > On 2010-11-11 13:26, Regis wrote: >> >> On 2010-11-11 13:13, Charles Lee wrote: >>> >>> The cache is good for the performance. But when the cache meet link, >>> there >>> will be some difficult situation. The patch has attached is a >>> workaround for >>> the specified test case. The good choose for the timeout should bed >>> discussed. >>> >>> On Thu, Nov 11, 2010 at 7:30 AM, Guillermo Cabrera (JIRA) >>> <j...@apache.org>wrote: >>> >>>> Reducing timeout value in CanonicalPatchCache to fix a file not found >>>> error >>>> in Hadoop common >>>> >>>> >>>> -------------------------------------------------------------------------------------------- >>>> >>>> >>>> Key: HARMONY-6675 >>>> URL: https://issues.apache.org/jira/browse/HARMONY-6675 >>>> Project: Harmony >>>> Issue Type: New Feature >>>> Environment: SLE v. 11, Apache Harmony 6 >>>> Reporter: Guillermo Cabrera >>>> Priority: Minor >>>> >>>> >>>> Testing Harmony Select (r1022137) with Hadoop common, we ran across the >>>> following error: >>>> >>>> java.lang.RuntimeException: Error while running command to get file >>>> permissions : org.apache.hadoop.util.Shell$ExitCodeException: /bin/ls: >>>> /tmp/test1/file: No such file or directory >>>> >>>> Charles Lee (Apache Harmony developer) provided us with the following >>>> answer: >>>> >>>> "For all the test case failures in >>>> org.apache.hadoop.fs.TestLocalFSFileContextSymlink, the root cause is we >>>> have a CanonicalPathCache under the File, so the file canonical path >>>> will be >>>> wrong if the test case highly stressed, (I remember the cache time is >>>> set to >>>> 10 minute)." >>>> >>>> His patch to fix this issue has been attached. >>>> >>>> -- >>>> This message is automatically generated by JIRA. >>>> - >>>> You can reply to this email to add a comment to the issue online. >>>> >>>> >>> >>> >> >> I think we should provide a way to configure this cache: enable/disable >> it and timeout, something like >> -Dorg.apache.harmony.canonpath.cache.timeout=60, this property could be >> overwritten at run time. >> >> Also the default value of timeout, 10 minutes seems too long, maybe >> reduce to one minute or half minute is reasonable for the most of >> applications? >> > > I propose following patch, which configure canonical path cache via system > property 'org.apache.harmony.file.canonical.path.cache.timeout', set it to > zero could disable the cache completely. And I also reduce default timeout > from 10 minutes to 30 seconds. If no one object, I'll commit this path soon. > > > Index: > modules/luni/src/main/java/org/apache/harmony/luni/internal/io/FileCanonPathCache.java > ===================================================================== > --- > modules/luni/src/main/java/org/apache/harmony/luni/internal/io/FileCanonPathCache.java > +++ > modules/luni/src/main/java/org/apache/harmony/luni/internal/io/FileCanonPathCache.java > @@ -55,9 +55,29 @@ public class FileCanonPathCache { > private static Object lock = new Object(); > > /** > - * Expired time. > + * Expired time, 0 disable this cache. > */ > - private static long timeout = 600000; > + private static long timeout = 30000;
Static variables should really be final (even if private). > + > + /** > + * Whether to enable this cache. > + */ > + private static boolean isEnable = true; > + Likewise. > + public static final String FILE_CANONICAL_PATH_CACHE_TIMEOUT = > "org.apache.harmony.file.canonical.path.cache.timeout"; > + > + static { > + String value = > System.getProperty(FILE_CANONICAL_PATH_CACHE_TIMEOUT); > + try { > + timeout = Long.parseLong(value); > + } catch (NumberFormatException e) { > + // use default timeout value > + } > + > + if (timeout <= 0) { > + isEnable = false; > + } > + } > > /** > * Retrieve element from cache. > @@ -68,6 +88,10 @@ public class FileCanonPathCache { > * > */ > public static String get(String path) { > + if (!isEnable) { > + return null; > + } > + > CacheElement element = null; > synchronized (lock) { > element = cache.get(path); > @@ -104,6 +128,10 @@ public class FileCanonPathCache { > * the canonical path of <code>path</code>. > */ > public static void put(String path, String canonicalPath) { > + if (!isEnable) { > + return; > + } > + > CacheElement element = new CacheElement(canonicalPath); > synchronized (lock) { > if (cache.size() >= CACHE_SIZE) { > @@ -120,6 +148,10 @@ public class FileCanonPathCache { > * Remove all elements from cache. > */ > public static void clear() { > + if (!isEnable) { > + return; > + } > + > synchronized (lock) { > cache.clear(); > list.clear(); > @@ -132,5 +164,8 @@ public class FileCanonPathCache { > > public static void setTimeout(long timeout) { > FileCanonPathCache.timeout = timeout; > + if (timeout <= 0) { > + isEnable = false; > + } > } > } > > > -- > Best Regards, > Regis. >