This is an automated email from the ASF dual-hosted git repository. nicoloboschi pushed a commit to branch branch-4.14 in repository https://gitbox.apache.org/repos/asf/bookkeeper.git
commit 79aae04766b5bca3a41bed6dc8e2e8ec4d0302bc Author: Hang Chen <[email protected]> AuthorDate: Thu Mar 31 13:42:34 2022 +0800 catch onBookieRackChange exception (#3060) ### Motivation When we update the bookie rack info, it will use all the bookie list to update rack topology. However If one bookie update failed and throw exception out, it will throw the exception out and the remains bookie info won't be updated into the rack topology, which will affect the ledger ensemble selection. ### Changes Catch the bookie topology update exception to ensure the remaining bookies' info can be updated into the rack topology. (cherry picked from commit f55ac1ed55336c3ba461c57a3428430309118344) --- .../TopologyAwareEnsemblePlacementPolicy.java | 23 +++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/TopologyAwareEnsemblePlacementPolicy.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/TopologyAwareEnsemblePlacementPolicy.java index 438053f54..59bc893a9 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/TopologyAwareEnsemblePlacementPolicy.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/TopologyAwareEnsemblePlacementPolicy.java @@ -47,6 +47,7 @@ import org.apache.bookkeeper.net.BookieSocketAddress; import org.apache.bookkeeper.net.DNSToSwitchMapping; import org.apache.bookkeeper.net.NetUtils; import org.apache.bookkeeper.net.NetworkTopology; +import org.apache.bookkeeper.net.NetworkTopologyImpl; import org.apache.bookkeeper.net.Node; import org.apache.bookkeeper.net.NodeBase; import org.apache.bookkeeper.proto.BookieAddressResolver; @@ -740,16 +741,20 @@ abstract class TopologyAwareEnsemblePlacementPolicy implements public void onBookieRackChange(List<BookieId> bookieAddressList) { rwLock.writeLock().lock(); try { - for (BookieId bookieAddress : bookieAddressList) { - BookieNode node = knownBookies.get(bookieAddress); - if (node != null) { - // refresh the rack info if its a known bookie - BookieNode newNode = createBookieNode(bookieAddress); - topology.remove(node); - topology.add(newNode); - knownBookies.put(bookieAddress, newNode); + bookieAddressList.forEach(bookieAddress -> { + try { + BookieNode node = knownBookies.get(bookieAddress); + if (node != null) { + // refresh the rack info if its a known bookie + BookieNode newNode = createBookieNode(bookieAddress); + topology.remove(node); + topology.add(newNode); + knownBookies.put(bookieAddress, newNode); + } + } catch (IllegalArgumentException | NetworkTopologyImpl.InvalidTopologyException e) { + LOG.error("Failed to update bookie rack info: {} ", bookieAddress, e); } - } + }); } finally { rwLock.writeLock().unlock(); }
