When running walletpassphrase on a large wallet.dat (ie about 300,000 segwit P2SH addresses) the command sometimes takes a very long time, and if command is run multiple times at once (while running slow) it causes bitcoin core to freeze (stops syncing and requires kill -9 to stop/restart)

During the locked up walletpassphrase commands being run the following messages start to appear in the debug.log:

`018-01-24 01:01:04 socket sending timeout: 1201s`

Note that this problem is intermittent, so sometimes the command runs instantly, other times it takes a few minutes, and other times it completely freezes the node.
if (!batch.WriteDescriptorParentCache(parent_xpub_pair.second, id, parent_xpub_pair.first)) {
                throw std::runtime_error(std::string(__func__) + ": writing cache item failed");
            }
            m_wallet_descriptor.cache.CacheParentExtPubKey(parent_xpub_pair.first, parent_xpub_pair.second);
        }
        for (const auto& derived_xpub_map_pair : temp_cache.GetCachedDerivedExtPubKeys()) {
            for (const auto& derived_xpub_pair : derived_xpub_map_pair.second) {
                CExtPubKey xpub;
                if (m_wallet_descriptor.cache.GetCachedDerivedExtPubKey(derived_xpub_map_pair.first, derived_xpub_pair.first, xpub)) {
                    if (xpub != derived_xpub_pair.second) {
                        throw std::runtime_error(std::string(__func__) + ": New cached derived xpub does not match already cached derived xpub");
                    }
                    continue;
                }
                if (!batch.WriteDescriptorDerivedCache(derived_xpub_pair.second, id, derived_xpub_map_pair.first, derived_xpub_pair.first)) {
                    throw std::runtime_error(std::string(__func__) + ": writing cache item failed");
                }
                m_wallet_descriptor.cache.CacheDerivedExtPubKey(derived_xpub_map_pair.first, derived_xpub_pair.first, derived_xpub_pair.second);
            }
        }
        m_max_cached_index++;
    }
    m_wallet_descriptor.range_end = new_range_end;
    batch.WriteDescriptor(GetID(), m_wallet_descriptor);
    
    assert(m_wallet_descriptor.range_end - 1 == m_max_cached_index);
    NotifyCanGetAddressesChanged();
    return true;
}
void DescriptorScriptPubKeyMan::MarkUnusedAddresses(const CScript& script)