When brq is created but encountered a failed GII, enqueue to it could have a potential deadlock:
ParallelGatewaySenderQueue.put() will get a brq.getInitializationLock().readLock().lock() (lock-A’s read lock). Then during the put operation, it will try to call lockWhenRegionIsInitializing() to get failedInitialImageLock.readLock().lock (lock-B’s read lock)
PRDS.createBucketRegion() will trigger GII but failed. So it will call cleanUpAfterFailedGII(), where it will call lockFailedInitialImageWriteLock
() to get lock-B’s write lock first. Then call BucketRegionQueue.clearEntries().
It will call getInitializationLock().writeLock().lock() (lock-A’s write lock).
To fix it, we need to let thread-1 to get failedInitialImageLock.readLock() (lock-B) before requesting lock-A.