From 316ea6023247c1be0e7e3b9c62b8bc439168ce4a Mon Sep 17 00:00:00 2001 From: Renxuan Wang Date: Thu, 28 Jul 2022 20:01:57 -0700 Subject: [PATCH 1/7] Prefer IPv6 in hostname resolving. --- flow/Hostname.actor.cpp | 4 ++-- flow/include/flow/network.h | 13 +++++++++++++ flow/network.cpp | 20 +++++++++++++++++++- 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/flow/Hostname.actor.cpp b/flow/Hostname.actor.cpp index 110061e5c9..84a3cc7897 100644 --- a/flow/Hostname.actor.cpp +++ b/flow/Hostname.actor.cpp @@ -43,7 +43,7 @@ ACTOR Future> resolveImpl(Hostname* self) { try { std::vector addresses = wait(INetworkConnections::net()->resolveTCPEndpointWithDNSCache(self->host, self->service)); - NetworkAddress address = addresses[deterministicRandom()->randomInt(0, addresses.size())]; + NetworkAddress address = INetworkConnections::pickOneAddress(addresses); address.flags = 0; // Reset the parsed address to public address.fromHostname = NetworkAddressFromHostname::True; if (self->isTLS) { @@ -84,7 +84,7 @@ Optional Hostname::resolveBlocking() { try { std::vector addresses = INetworkConnections::net()->resolveTCPEndpointBlockingWithDNSCache(host, service); - NetworkAddress address = addresses[deterministicRandom()->randomInt(0, addresses.size())]; + NetworkAddress address = INetworkConnections::pickOneAddress(addresses); address.flags = 0; // Reset the parsed address to public address.fromHostname = NetworkAddressFromHostname::True; if (isTLS) { diff --git a/flow/include/flow/network.h b/flow/include/flow/network.h index 2fc6405818..7b2ea5df08 100644 --- a/flow/include/flow/network.h +++ b/flow/include/flow/network.h @@ -736,6 +736,19 @@ public: return static_cast((void*)g_network->global(INetwork::enNetworkConnections)); } + static NetworkAddress pickOneAddress(const std::vector& addresses) { + std::vector ipV6Addresses; + for (const NetworkAddress& addr : addresses) { + if (addr.isV6()) { + ipV6Addresses.push_back(addr); + } + } + if (ipV6Addresses.size() > 0) { + return ipV6Addresses[deterministicRandom()->randomInt(0, ipV6Addresses.size())]; + } + return addresses[deterministicRandom()->randomInt(0, addresses.size())]; + } + void removeCachedDNS(const std::string& host, const std::string& service) { dnsCache.remove(host, service); } DNSCache dnsCache; diff --git a/flow/network.cpp b/flow/network.cpp index ea52f257b9..85c73f8e85 100644 --- a/flow/network.cpp +++ b/flow/network.cpp @@ -279,7 +279,7 @@ Future> INetworkConnections::connect(const std::string& h // Use map to create an actor that returns an endpoint or throws Future pickEndpoint = map(resolveTCPEndpoint(host, service), [=](std::vector const& addresses) -> NetworkAddress { - NetworkAddress addr = addresses[deterministicRandom()->randomInt(0, addresses.size())]; + NetworkAddress addr = INetworkConnections::pickOneAddress(addresses); addr.fromHostname = true; if (isTLS) { addr.flags = NetworkAddress::FLAG_TLS; @@ -347,4 +347,22 @@ TEST_CASE("/flow/network/ipaddress") { return Void(); } +TEST_CASE("/flow/network/ipV6Preferred") { + std::vector addresses; + for (int i = 0; i < 50; ++i) { + std::string s = fmt::format("{}.{}.{}.{}:{}", i, i, i, i, i); + addresses.push_back(NetworkAddress::parse(s)); + } + std::string ipv6 = "[2001:db8:85a3::8a2e:370:7334]:4800"; + addresses.push_back(NetworkAddress::parse(ipv6)); + for (int i = 50; i < 100; ++i) { + std::string s = fmt::format("{}.{}.{}.{}:{}", i, i, i, i, i); + addresses.push_back(NetworkAddress::parse(s)); + } + // Confirm IPv6 is always preferred. + ASSERT(INetworkConnections::pickOneAddress(addresses).toString() == ipv6); + + return Void(); +} + NetworkInfo::NetworkInfo() : handshakeLock(new FlowLock(FLOW_KNOBS->TLS_HANDSHAKE_LIMIT)) {} From efc30458340d7bef0cd2b825cc7364f50f49f6c3 Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Fri, 29 Jul 2022 09:14:51 -0700 Subject: [PATCH 2/7] Disallow python2 for cmake scripts The fdb c shim build requires python3. Let's not allow python2 to get used there. Otherwise we can see something like this: ``` FAILED: bindings/c/libfdb_c.so.init.c bindings/c/libfdb_c.so.tramp.S cd /home/anoyes/workspace/foundationdb/build/bindings/c && /usr/bin/python2.7 /home/anoyes/workspace/foundationdb/contrib/Implib.so/implib-gen.py --target aarch64 --outdir /home/anoyes/workspace/foundationdb/build/bindings/c --dlopen-callback=fdb_shim_dlopen_callback /home/anoyes/workspace/foundationdb/build/lib/libfdb_c.so File "/home/anoyes/workspace/foundationdb/contrib/Implib.so/implib-gen.py", line 27 sys.stderr.write(f'{me}: warning: {msg}\n') ``` --- cmake/FDBComponents.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/FDBComponents.cmake b/cmake/FDBComponents.cmake index 13e3f790a8..fe5fe91026 100644 --- a/cmake/FDBComponents.cmake +++ b/cmake/FDBComponents.cmake @@ -56,7 +56,7 @@ endif() # Python Bindings ################################################################################ -find_package(Python COMPONENTS Interpreter) +find_package(Python3 COMPONENTS Interpreter) if(Python_Interpreter_FOUND) set(WITH_PYTHON ON) else() From 52e9990d3296471709326a8367e286c75911aa1c Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Fri, 29 Jul 2022 10:15:22 -0700 Subject: [PATCH 3/7] Python_Interpreter_FOUND -> Python3_Interpreter_FOUND --- cmake/FDBComponents.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/FDBComponents.cmake b/cmake/FDBComponents.cmake index fe5fe91026..02f0aa2a16 100644 --- a/cmake/FDBComponents.cmake +++ b/cmake/FDBComponents.cmake @@ -57,7 +57,7 @@ endif() ################################################################################ find_package(Python3 COMPONENTS Interpreter) -if(Python_Interpreter_FOUND) +if(Python3_Interpreter_FOUND) set(WITH_PYTHON ON) else() message(WARNING "Could not found a suitable python interpreter") From db348598a14fd79f5c744db350cef5961486cd7c Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Fri, 29 Jul 2022 11:04:10 -0700 Subject: [PATCH 4/7] Update Python target name to Python3 --- CMakeLists.txt | 2 +- bindings/c/CMakeLists.txt | 8 ++++---- bindings/python/CMakeLists.txt | 2 +- cmake/AddFdbTest.cmake | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 59161d79b6..5666b1f202 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -206,7 +206,7 @@ endif() if (CMAKE_EXPORT_COMPILE_COMMANDS AND WITH_PYTHON) add_custom_command( OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/compile_commands.json - COMMAND $ ${CMAKE_CURRENT_SOURCE_DIR}/contrib/gen_compile_db.py + COMMAND $ ${CMAKE_CURRENT_SOURCE_DIR}/contrib/gen_compile_db.py ARGS -b ${CMAKE_CURRENT_BINARY_DIR} -s ${CMAKE_CURRENT_SOURCE_DIR} -o ${CMAKE_CURRENT_SOURCE_DIR}/compile_commands.json ${CMAKE_CURRENT_BINARY_DIR}/compile_commands.json DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/gen_compile_db.py ${CMAKE_CURRENT_BINARY_DIR}/compile_commands.json COMMENT "Build compile commands for IDE" diff --git a/bindings/c/CMakeLists.txt b/bindings/c/CMakeLists.txt index 8b850248de..9e864aa509 100644 --- a/bindings/c/CMakeLists.txt +++ b/bindings/c/CMakeLists.txt @@ -29,7 +29,7 @@ if(APPLE AND CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64") endif() add_custom_command(OUTPUT ${asm_file} ${CMAKE_CURRENT_BINARY_DIR}/fdb_c_function_pointers.g.h - COMMAND $ ${CMAKE_CURRENT_SOURCE_DIR}/generate_asm.py ${os} ${cpu} + COMMAND $ ${CMAKE_CURRENT_SOURCE_DIR}/generate_asm.py ${os} ${cpu} ${CMAKE_CURRENT_SOURCE_DIR}/fdb_c.cpp ${asm_file} ${CMAKE_CURRENT_BINARY_DIR}/fdb_c_function_pointers.g.h @@ -65,7 +65,7 @@ endif() if(APPLE) set(symbols ${CMAKE_CURRENT_BINARY_DIR}/fdb_c.symbols) add_custom_command(OUTPUT ${symbols} - COMMAND $ ${CMAKE_CURRENT_SOURCE_DIR}/symbolify.py + COMMAND $ ${CMAKE_CURRENT_SOURCE_DIR}/symbolify.py ${CMAKE_CURRENT_SOURCE_DIR}/foundationdb/fdb_c.h ${CMAKE_CURRENT_SOURCE_DIR}/foundationdb/fdb_c_internal.h ${symbols} @@ -457,7 +457,7 @@ elseif(NOT WIN32 AND NOT APPLE AND NOT USE_UBSAN) # Linux Only, non-ubsan only ) add_custom_command(OUTPUT ${SHIM_LIB_GEN_SRC} - COMMAND $ ${IMPLIBSO_SRC_DIR}/implib-gen.py + COMMAND $ ${IMPLIBSO_SRC_DIR}/implib-gen.py --target ${CMAKE_SYSTEM_PROCESSOR} --outdir ${SHIM_LIB_OUTPUT_DIR} --dlopen-callback=fdb_shim_dlopen_callback @@ -484,7 +484,7 @@ elseif(NOT WIN32 AND NOT APPLE AND NOT USE_UBSAN) # Linux Only, non-ubsan only target_include_directories(fdb_c_shim_lib_tester PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/foundationdb/ ${CMAKE_SOURCE_DIR}/flow/include) add_test(NAME fdb_c_shim_library_tests - COMMAND $ ${CMAKE_CURRENT_SOURCE_DIR}/test/fdb_c_shim_tests.py + COMMAND $ ${CMAKE_CURRENT_SOURCE_DIR}/test/fdb_c_shim_tests.py --build-dir ${CMAKE_BINARY_DIR} --unit-tests-bin $ --api-tester-bin $ diff --git a/bindings/python/CMakeLists.txt b/bindings/python/CMakeLists.txt index 0f871d8c87..4f5022aa4e 100644 --- a/bindings/python/CMakeLists.txt +++ b/bindings/python/CMakeLists.txt @@ -68,7 +68,7 @@ endif() set(setup_file_name foundationdb-${FDB_VERSION}.tar.gz) set(package_file ${CMAKE_BINARY_DIR}/packages/foundationdb-${FDB_VERSION}${not_fdb_release_string}.tar.gz) add_custom_command(OUTPUT ${package_file} - COMMAND $ setup.py sdist --formats=gztar && + COMMAND $ setup.py sdist --formats=gztar && ${CMAKE_COMMAND} -E copy dist/${setup_file_name} ${package_file} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMENT "Create Python sdist package") diff --git a/cmake/AddFdbTest.cmake b/cmake/AddFdbTest.cmake index c0440df5ef..d2bb22f8a1 100644 --- a/cmake/AddFdbTest.cmake +++ b/cmake/AddFdbTest.cmake @@ -125,7 +125,7 @@ function(add_fdb_test) list(TRANSFORM ADD_FDB_TEST_TEST_FILES PREPEND "${CMAKE_CURRENT_SOURCE_DIR}/") if (ENABLE_SIMULATION_TESTS) add_test(NAME ${test_name} - COMMAND $ ${TestRunner} + COMMAND $ ${TestRunner} -n ${test_name} -b ${PROJECT_BINARY_DIR} -t ${test_type} From 1558edce8c6845414cc01d4dab4e363fa1de8548 Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Fri, 29 Jul 2022 13:26:08 -0700 Subject: [PATCH 5/7] Python_EXECUTABLE to Python3_EXECUTABLE --- cmake/AddFdbTest.cmake | 6 +++--- tests/CMakeLists.txt | 2 +- tests/CTestCustom.ctest.cmake | 2 +- tests/TestRunner/tmp_multi_cluster.py | 0 4 files changed, 5 insertions(+), 5 deletions(-) mode change 100644 => 100755 tests/TestRunner/tmp_multi_cluster.py diff --git a/cmake/AddFdbTest.cmake b/cmake/AddFdbTest.cmake index d2bb22f8a1..066baf7100 100644 --- a/cmake/AddFdbTest.cmake +++ b/cmake/AddFdbTest.cmake @@ -440,7 +440,7 @@ function(add_fdbclient_test) message(STATUS "Adding Client test ${T_NAME}") add_test(NAME "${T_NAME}" WORKING_DIRECTORY ${T_WORKING_DIRECTORY} - COMMAND ${Python_EXECUTABLE} ${TMP_CLUSTER_CMD} + COMMAND ${Python3_EXECUTABLE} ${TMP_CLUSTER_CMD} -- ${T_COMMAND}) if (T_TEST_TIMEOUT) @@ -473,7 +473,7 @@ function(add_unavailable_fdbclient_test) endif() message(STATUS "Adding unavailable client test ${T_NAME}") add_test(NAME "${T_NAME}" - COMMAND ${Python_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tests/TestRunner/fake_cluster.py + COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tests/TestRunner/fake_cluster.py --output-dir ${CMAKE_BINARY_DIR} -- ${T_COMMAND}) @@ -508,7 +508,7 @@ function(add_multi_fdbclient_test) endif() message(STATUS "Adding Client test ${T_NAME}") add_test(NAME "${T_NAME}" - COMMAND ${Python_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tests/TestRunner/tmp_multi_cluster.py + COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tests/TestRunner/tmp_multi_cluster.py --build-dir ${CMAKE_BINARY_DIR} --clusters 3 -- diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index d7a21990de..bc70079e3b 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -375,7 +375,7 @@ if(WITH_PYTHON) if(NOT OPEN_FOR_IDE) add_test( NAME command_line_argument_test - COMMAND ${Python_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tests/argument_parsing/test_argument_parsing.py ${CMAKE_BINARY_DIR} + COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tests/argument_parsing/test_argument_parsing.py ${CMAKE_BINARY_DIR} ) endif() diff --git a/tests/CTestCustom.ctest.cmake b/tests/CTestCustom.ctest.cmake index 484bc07c71..b29793158d 100644 --- a/tests/CTestCustom.ctest.cmake +++ b/tests/CTestCustom.ctest.cmake @@ -1 +1 @@ -set(CTEST_CUSTOM_PRE_TEST ${CTEST_CUSTOM_PRE_TEST} "@Python_EXECUTABLE@ @PROJECT_SOURCE_DIR@/tests/TestRunner/TestDirectory.py @PROJECT_BINARY_DIR@") +set(CTEST_CUSTOM_PRE_TEST ${CTEST_CUSTOM_PRE_TEST} "@Python3_EXECUTABLE@ @PROJECT_SOURCE_DIR@/tests/TestRunner/TestDirectory.py @PROJECT_BINARY_DIR@") diff --git a/tests/TestRunner/tmp_multi_cluster.py b/tests/TestRunner/tmp_multi_cluster.py old mode 100644 new mode 100755 From ea76eb2bebc6d49ea65415beeafb44618fb94ede Mon Sep 17 00:00:00 2001 From: "A.J. Beamon" Date: Fri, 29 Jul 2022 19:36:56 -0700 Subject: [PATCH 6/7] Transactions could change tenant ID part way through. The dummy transaction could set a new tenant ID but use the old tenant prefix. --- fdbclient/NativeAPI.actor.cpp | 37 +++++++++++++++++---------- fdbserver/CommitProxyServer.actor.cpp | 34 +++++++++++++++--------- 2 files changed, 46 insertions(+), 25 deletions(-) diff --git a/fdbclient/NativeAPI.actor.cpp b/fdbclient/NativeAPI.actor.cpp index dcf86db793..7ef869c4e9 100644 --- a/fdbclient/NativeAPI.actor.cpp +++ b/fdbclient/NativeAPI.actor.cpp @@ -2992,9 +2992,11 @@ Future getKeyLocation(Reference trState, isBackward, version); - if (trState->tenant().present() && useTenant) { + if (trState->tenant().present() && useTenant && trState->tenantId == TenantInfo::INVALID_TENANT) { return map(f, [trState](const KeyRangeLocationInfo& locationInfo) { - trState->tenantId = locationInfo.tenantEntry.id; + if (trState->tenantId == TenantInfo::INVALID_TENANT) { + trState->tenantId = locationInfo.tenantEntry.id; + } return locationInfo; }); } else { @@ -3132,10 +3134,12 @@ Future> getKeyRangeLocations(ReferenceuseProvisionalProxies, version); - if (trState->tenant().present() && useTenant) { + if (trState->tenant().present() && useTenant && trState->tenantId == TenantInfo::INVALID_TENANT) { return map(f, [trState](const std::vector& locationInfo) { ASSERT(!locationInfo.empty()); - trState->tenantId = locationInfo[0].tenantEntry.id; + if (trState->tenantId == TenantInfo::INVALID_TENANT) { + trState->tenantId = locationInfo[0].tenantEntry.id; + } return locationInfo; }); } else { @@ -5972,6 +5976,7 @@ ACTOR static Future commitDummyTransaction(Reference trS tr.trState->options = trState->options; tr.trState->taskID = trState->taskID; tr.trState->authToken = trState->authToken; + tr.trState->tenantId = trState->tenantId; if (!trState->hasTenant()) { tr.setOption(FDBTransactionOptions::RAW_ACCESS); } else { @@ -5985,6 +5990,10 @@ ACTOR static Future commitDummyTransaction(Reference trS wait(tr.commit()); return Void(); } catch (Error& e) { + // If the tenant is gone, then our original transaction won't be able to commit + if (e.code() == error_code_unknown_tenant) { + return Void(); + } TraceEvent("CommitDummyTransactionError") .errorUnsuppressed(e) .detail("Key", range.begin) @@ -6157,19 +6166,17 @@ ACTOR static Future tryCommit(Reference trState, } state Key tenantPrefix; - if (trState->tenant().present()) { + // skipApplyTenantPrefix is set only in the context of a commitDummyTransaction() + // (see member declaration) + if (trState->tenant().present() && !trState->skipApplyTenantPrefix) { KeyRangeLocationInfo locationInfo = wait(getKeyLocation(trState, ""_sr, &StorageServerInterface::getValue, Reverse::False, UseTenant::True, req.transaction.read_snapshot)); - // skipApplyTenantPrefix is set only in the context of a commitDummyTransaction() - // (see member declaration) - if (!trState->skipApplyTenantPrefix) { - applyTenantPrefix(req, locationInfo.tenantEntry.prefix); - tenantPrefixPrepended = TenantPrefixPrepended::True; - } + applyTenantPrefix(req, locationInfo.tenantEntry.prefix); + tenantPrefixPrepended = TenantPrefixPrepended::True; tenantPrefix = locationInfo.tenantEntry.prefix; } CODE_PROBE(trState->skipApplyTenantPrefix, "Tenant prefix prepend skipped for dummy transaction"); @@ -7621,10 +7628,14 @@ ACTOR Future blobGranuleGetTenantEntry(Transaction* self, Key ra self->trState->useProvisionalProxies, Reverse::False, latestVersion)); - self->trState->tenantId = l.tenantEntry.id; + if (self->trState->tenantId == TenantInfo::INVALID_TENANT) { + self->trState->tenantId = l.tenantEntry.id; + } return l.tenantEntry; } else { - self->trState->tenantId = cachedLocationInfo.get().tenantEntry.id; + if (self->trState->tenantId == TenantInfo::INVALID_TENANT) { + self->trState->tenantId = cachedLocationInfo.get().tenantEntry.id; + } return cachedLocationInfo.get().tenantEntry; } } diff --git a/fdbserver/CommitProxyServer.actor.cpp b/fdbserver/CommitProxyServer.actor.cpp index 7f0b698faa..9da19b6529 100644 --- a/fdbserver/CommitProxyServer.actor.cpp +++ b/fdbserver/CommitProxyServer.actor.cpp @@ -283,16 +283,20 @@ bool verifyTenantPrefix(ProxyCommitData* const commitData, const CommitTransacti if (!m.param1.startsWith(tenantPrefix)) { TraceEvent(SevWarnAlways, "TenantPrefixMismatch") .suppressFor(60) - .detail("Prefix", tenantPrefix.toHexString()) - .detail("Key", m.param1.toHexString()); + .detail("Tenant", req.tenantInfo.name) + .detail("TenantID", req.tenantInfo.tenantId) + .detail("Prefix", tenantPrefix) + .detail("Key", m.param1); return false; } if (m.type == MutationRef::ClearRange && !m.param2.startsWith(tenantPrefix)) { TraceEvent(SevWarnAlways, "TenantClearRangePrefixMismatch") .suppressFor(60) - .detail("Prefix", tenantPrefix.toHexString()) - .detail("Key", m.param2.toHexString()); + .detail("Tenant", req.tenantInfo.name) + .detail("TenantID", req.tenantInfo.tenantId) + .detail("Prefix", tenantPrefix) + .detail("Key", m.param2); return false; } else if (m.type == MutationRef::SetVersionstampedKey) { ASSERT(m.param1.size() >= 4); @@ -301,8 +305,10 @@ bool verifyTenantPrefix(ProxyCommitData* const commitData, const CommitTransacti if (*offset < tenantPrefix.size()) { TraceEvent(SevWarnAlways, "TenantVersionstampInvalidOffset") .suppressFor(60) - .detail("Prefix", tenantPrefix.toHexString()) - .detail("Key", m.param1.toHexString()) + .detail("Tenant", req.tenantInfo.name) + .detail("TenantID", req.tenantInfo.tenantId) + .detail("Prefix", tenantPrefix) + .detail("Key", m.param1) .detail("Offset", *offset); return false; } @@ -315,9 +321,11 @@ bool verifyTenantPrefix(ProxyCommitData* const commitData, const CommitTransacti (!rc.begin.startsWith(tenantPrefix) || !rc.end.startsWith(tenantPrefix))) { TraceEvent(SevWarnAlways, "TenantReadConflictPrefixMismatch") .suppressFor(60) - .detail("Prefix", tenantPrefix.toHexString()) - .detail("BeginKey", rc.begin.toHexString()) - .detail("EndKey", rc.end.toHexString()); + .detail("Tenant", req.tenantInfo.name) + .detail("TenantID", req.tenantInfo.tenantId) + .detail("Prefix", tenantPrefix) + .detail("BeginKey", rc.begin) + .detail("EndKey", rc.end); return false; } } @@ -327,9 +335,11 @@ bool verifyTenantPrefix(ProxyCommitData* const commitData, const CommitTransacti (!wc.begin.startsWith(tenantPrefix) || !wc.end.startsWith(tenantPrefix))) { TraceEvent(SevWarnAlways, "TenantWriteConflictPrefixMismatch") .suppressFor(60) - .detail("Prefix", tenantPrefix.toHexString()) - .detail("BeginKey", wc.begin.toHexString()) - .detail("EndKey", wc.end.toHexString()); + .detail("Tenant", req.tenantInfo.name) + .detail("TenantID", req.tenantInfo.tenantId) + .detail("Prefix", tenantPrefix) + .detail("BeginKey", wc.begin) + .detail("EndKey", wc.end); return false; } } From 4a0bea22306b4106620e498f717fd4ce35d3edf6 Mon Sep 17 00:00:00 2001 From: Renxuan Wang Date: Mon, 1 Aug 2022 10:09:01 -0700 Subject: [PATCH 7/7] Document for pickOneAddress(). --- flow/include/flow/network.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/flow/include/flow/network.h b/flow/include/flow/network.h index 7b2ea5df08..423742f863 100644 --- a/flow/include/flow/network.h +++ b/flow/include/flow/network.h @@ -736,6 +736,9 @@ public: return static_cast((void*)g_network->global(INetwork::enNetworkConnections)); } + // If a DNS name can be resolved to both and IPv4 and IPv6 addresses, we want IPv6 addresses when running the + // clusters on IPv6. + // This function takes a vector of addresses and return a random one, preferring IPv6 over IPv4. static NetworkAddress pickOneAddress(const std::vector& addresses) { std::vector ipV6Addresses; for (const NetworkAddress& addr : addresses) {