[ https://issues.apache.org/jira/browse/HDFS-9608?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15108197#comment-15108197 ]
Vinayakumar B commented on HDFS-9608: ------------------------------------- Changes looks good. I have some comments, 1. To reduce the number of lines changed, Instead of moving entire while loop inside synchronized block, just extract that part to a method and call that method from synchronized block. As below. {code} @Override public synchronized V chooseVolume(final List<V> volumes, long blockSize) @@ -40,13 +51,24 @@ public synchronized V chooseVolume(final List<V> volumes, long blockSize) if(volumes.size() < 1) { throw new DiskOutOfSpaceException("No more available volumes"); } - + + // As all the items in volumes are with the same storage type, + // so only need to get the storage type index of the first item in volumes + StorageType storageType = volumes.get(0).getStorageType(); + int index = storageType != null ? + storageType.ordinal() : StorageType.DEFAULT.ordinal(); + synchronized (syncLocks[index]) { + return chooseVolume(index, volumes, blockSize); + } + } + + private V chooseVolume(final int curVolumesIndex, final List<V> volumes, + long blockSize) throws IOException { // since volumes could've been removed because of the failure // make sure we are not out of bounds - if(curVolume >= volumes.size()) { - curVolume = 0; - } - + int curVolume = curVolumes[curVolumesIndex] < volumes.size() + ? curVolumes[curVolumesIndex] : 0; + int startVolume = curVolume; long maxAvailable = 0; @@ -55,6 +77,7 @@ public synchronized V chooseVolume(final List<V> volumes, long blockSize) curVolume = (curVolume + 1) % volumes.size(); long availableVolumeSize = volume.getAvailable(); if (availableVolumeSize > blockSize) { + curVolumes[curVolumesIndex] = curVolume; return volume; } {code} 2. Is this idea ( separate lock for each storage type) applicable for {{AvailableSpaceVolumeChoosingPolicy}} as well? > Disk IO imbalance in HDFS with heterogeneous storages > ----------------------------------------------------- > > Key: HDFS-9608 > URL: https://issues.apache.org/jira/browse/HDFS-9608 > Project: Hadoop HDFS > Issue Type: Bug > Affects Versions: 2.6.0 > Reporter: Wei Zhou > Assignee: Wei Zhou > Attachments: HDFS-9608.01.patch, HDFS-9608.02.patch, > HDFS-9608.03.patch, HDFS-9608.04.patch, HDFS-9608.05.patch > > > Currently RoundRobinVolumeChoosingPolicy use a shared index to choose volumes > in HDFS with heterogeneous storages, this leads to non-RR choosing mode for > certain type of storage. > Besides, it uses a shared lock for synchronization which limits the > concurrency of volume choosing process. Volume choosing threads that > operating on different storage types should be able to run concurrently. -- This message was sent by Atlassian JIRA (v6.3.4#6332)