You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-issues@hadoop.apache.org by "Akira Ajisaka (Jira)" <ji...@apache.org> on 2026/06/30 01:38:00 UTC
[jira] [Resolved] (HADOOP-19346) ViewFileSystem.InnerCache: Replaced ReentrantReadWriteLock with ConcurrentHashMap/putIfAbsent()
[ https://issues.apache.org/jira/browse/HADOOP-19346?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Akira Ajisaka resolved HADOOP-19346.
------------------------------------
Fix Version/s: 3.5.0
Target Version/s: (was: 3.5.1)
Resolution: Fixed
The PR was already merged.
> ViewFileSystem.InnerCache: Replaced ReentrantReadWriteLock with ConcurrentHashMap/putIfAbsent()
> -----------------------------------------------------------------------------------------------
>
> Key: HADOOP-19346
> URL: https://issues.apache.org/jira/browse/HADOOP-19346
> Project: Hadoop Common
> Issue Type: Improvement
> Components: common
> Reporter: Xing Lin
> Assignee: Xing Lin
> Priority: Minor
> Labels: pull-request-available
> Fix For: 3.5.0
>
>
> Use of ReentrantReadWriteLock + Map can be replaced/simplified with a ConcurrentHashMap.
> Right now, we are using a ReentrantReadWriteLock to protect concurrent updates to InnerCache.map().
> As a performance optimization, to reduce acquiring writeLock, we first acquire readLock, check existence of the key and then acquire writeLock, to insert the new key.
> {code:java}
> FileSystem get(URI uri, Configuration config) throws IOException {
> Key key = new Key(uri);
> FileSystem fs = null;
> try {
> rwLock.readLock().lock();
> fs = map.get(key);
> if (fs != null) {
> return fs;
> }
> } finally {
> rwLock.readLock().unlock();
> }
> try {
> rwLock.writeLock().lock();
> fs = map.get(key);
> if (fs != null) {
> return fs;
> }
> fs = fsCreator.getNewInstance(uri, config);
> map.put(key, fs);
> return fs;
> } finally {
> rwLock.writeLock().unlock();
> }
> }
> {code}
> The above function is already available as computeIfAbsent() from ConcurrentHashMap, which atomically checks existence of a key and inserts the new key if not there. This greatly simplifies the code. On the other hand, it should improve performance as well: concurrentHashMap supports finer-grain concurrency vs. a single ReadWrite Lock.
> We can replace the above code with the following one and it is much simpler.
> {code:java}
> FileSystem get(URI uri, Configuration config) throws IOException {
> Key key = new Key(uri);
> FileSystem fs = map.computeIfAbsent(key, k -> getNewFileSystem(uri, config));
> if (fs == null) {
> throw new IOException("Failed to create new FileSystem instance for " + uri);
> }
> return fs;
> {code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: common-issues-unsubscribe@hadoop.apache.org
For additional commands, e-mail: common-issues-help@hadoop.apache.org