@@ -1849,19 +1849,24 @@ void notifyWriteFailed(int index, BookieId addr) {
18491849 }
18501850
18511851 void maybeHandleDelayedWriteBookieFailure () {
1852+ Map <Integer , BookieId > toReplace = null ;
18521853 synchronized (metadataLock ) {
18531854 if (delayedWriteFailedBookies .isEmpty ()) {
18541855 return ;
18551856 }
1856- Map < Integer , BookieId > toReplace = new HashMap <>(delayedWriteFailedBookies );
1857+ toReplace = new HashMap <>(delayedWriteFailedBookies );
18571858 delayedWriteFailedBookies .clear ();
1859+ }
18581860
1859- // Original intent of this change is to do a best-effort ensemble change.
1860- // But this is not possible until the local metadata is completely immutable.
1861- // Until the feature "Make LedgerMetadata Immutable #610" Is complete we will use
1862- // handleBookieFailure() to handle delayed writes as regular bookie failures.
1863- handleBookieFailure (toReplace );
1861+ if (toReplace .isEmpty ()) {
1862+ return ;
18641863 }
1864+
1865+ // Original intent of this change is to do a best-effort ensemble change.
1866+ // But this is not possible until the local metadata is completely immutable.
1867+ // Until the feature "Make LedgerMetadata Immutable #610" Is complete we will use
1868+ // handleBookieFailure() to handle delayed writes as regular bookie failures.
1869+ handleBookieFailure (toReplace );
18651870 }
18661871
18671872 void handleBookieFailure (final Map <Integer , BookieId > failedBookies ) {
@@ -1980,12 +1985,12 @@ void ensembleChangeLoop(List<BookieId> origEnsemble, Map<Integer, BookieId> fail
19801985
19811986 List <BookieId > newEnsemble = null ;
19821987 Set <Integer > replaced = null ;
1988+
1989+ Map <Integer , BookieId > toReplace = null ;
19831990 synchronized (metadataLock ) {
19841991 if (!delayedWriteFailedBookies .isEmpty ()) {
1985- Map < Integer , BookieId > toReplace = new HashMap <>(delayedWriteFailedBookies );
1992+ toReplace = new HashMap <>(delayedWriteFailedBookies );
19861993 delayedWriteFailedBookies .clear ();
1987-
1988- ensembleChangeLoop (origEnsemble , toReplace );
19891994 } else {
19901995 newEnsemble = getCurrentEnsemble ();
19911996 replaced = EnsembleUtils .diffEnsemble (origEnsemble , newEnsemble );
@@ -1994,6 +1999,11 @@ void ensembleChangeLoop(List<BookieId> origEnsemble, Map<Integer, BookieId> fail
19941999 changingEnsemble = false ;
19952000 }
19962001 }
2002+
2003+ if (toReplace != null && !toReplace .isEmpty ()) {
2004+ ensembleChangeLoop (origEnsemble , toReplace );
2005+ }
2006+
19972007 if (newEnsemble != null ) { // unsetSuccess outside of lock
19982008 unsetSuccessAndSendWriteRequest (newEnsemble , replaced );
19992009 }
0 commit comments