Skip to content

Commit 6295079

Browse files
committed
[az] Handle set_available failures
1 parent 456dd15 commit 6295079

File tree

1 file changed

+26
-2
lines changed

1 file changed

+26
-2
lines changed

src/platform/backends/shared/base_availability_zone.cpp

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,32 @@ void BaseAvailabilityZone::set_available(const bool new_available)
113113
m.available = new_available;
114114
serialize();
115115

116-
for (auto& vm : m.vms)
117-
vm.get().set_available(m.available);
116+
try
117+
{
118+
for (auto& vm : m.vms)
119+
vm.get().set_available(new_available);
120+
}
121+
catch (...)
122+
{
123+
// if an error occurs fallback to available.
124+
m.available = true;
125+
serialize();
126+
127+
// make sure nothing is still unavailable.
128+
for (auto& vm : m.vms)
129+
{
130+
// setting the state here breaks encapsulation, but it's already broken.
131+
std::unique_lock vm_lock{vm.get().state_mutex};
132+
if (vm.get().current_state() == VirtualMachine::State::unavailable)
133+
{
134+
vm.get().state = VirtualMachine::State::off;
135+
vm.get().update_state();
136+
}
137+
}
138+
139+
// rethrow the error so something else can deal with it.
140+
throw;
141+
}
118142
}
119143

120144
void BaseAvailabilityZone::add_vm(VirtualMachine& vm)

0 commit comments

Comments
 (0)