Merge pull request #2808 from akva2/fix_serialize_deadlock

fixed: avoid deadlocks in parallel if serialization throws
This commit is contained in:
Arne Morten Kvarving 2020-09-24 11:51:39 +02:00 committed by GitHub
commit dd19d08a95
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -321,12 +321,21 @@ public:
return;
if (m_comm.rank() == 0) {
pack(data);
m_packSize = m_position;
m_comm.broadcast(&m_packSize, 1, 0);
m_comm.broadcast(m_buffer.data(), m_position, 0);
try {
pack(data);
m_packSize = m_position;
m_comm.broadcast(&m_packSize, 1, 0);
m_comm.broadcast(m_buffer.data(), m_position, 0);
} catch (...) {
m_packSize = std::numeric_limits<size_t>::max();
m_comm.broadcast(&m_packSize, 1, 0);
throw;
}
} else {
m_comm.broadcast(&m_packSize, 1, 0);
if (m_packSize == std::numeric_limits<size_t>::max()) {
throw std::runtime_error("Error detected in parallel serialization");
}
m_buffer.resize(m_packSize);
m_comm.broadcast(m_buffer.data(), m_packSize, 0);
unpack(data);