Make sure producers always release agent locks.

A MySQL error that didn't bring the server down could result in a
consumer returning without releasing its agent lock.
This commit is contained in:
Ramon Novoa 2023-01-31 09:54:31 +01:00
parent 2c047cb401
commit a200362ffe
1 changed files with 15 additions and 23 deletions

View File

@ -304,21 +304,22 @@ sub data_consumer ($$) {
agent_unlock($pa_config, $agent_name);
return;
}
unlink ($file_name);
if (defined($xml_data->{'server_name'})) {
process_xml_server ($self->getConfig (), $file_name, $xml_data, $self->getDBH ());
} elsif (defined($xml_data->{'connection_source'})) {
enterprise_hook('process_xml_connections', [$self->getConfig (), $file_name, $xml_data, $self->getDBH ()]);
} elsif (defined($xml_data->{'ipam_source'})) {
enterprise_hook('process_xml_ipam', [$self->getConfig (), $file_name, $xml_data, $self->getDBH ()]);
} elsif (defined($xml_data->{'network_matrix'})){
process_xml_matrix_network(
$self->getConfig(), $xml_data, $self->getDBH()
);
} else {
process_xml_data ($self->getConfig (), $file_name, $xml_data, $self->getServerID (), $self->getDBH ());
}
eval {
if (defined($xml_data->{'server_name'})) {
process_xml_server ($self->getConfig (), $file_name, $xml_data, $self->getDBH ());
} elsif (defined($xml_data->{'connection_source'})) {
enterprise_hook('process_xml_connections', [$self->getConfig (), $file_name, $xml_data, $self->getDBH ()]);
} elsif (defined($xml_data->{'ipam_source'})) {
enterprise_hook('process_xml_ipam', [$self->getConfig (), $file_name, $xml_data, $self->getDBH ()]);
} elsif (defined($xml_data->{'network_matrix'})){
process_xml_matrix_network( $self->getConfig(), $xml_data, $self->getDBH());
} else {
process_xml_data ($self->getConfig (), $file_name, $xml_data, $self->getServerID (), $self->getDBH ());
}
};
agent_unlock($pa_config, $agent_name);
return;
}
@ -1174,15 +1175,6 @@ sub process_xml_matrix_network {
sub agent_lock {
my ($pa_config, $dbh, $agent_name) = @_;
# Do not lock on LIFO mode if the agent already exist.
# get_agent_id will be called again from process_xml_data,
# so the should be no race conditions if the agent does
# not exist.
if ($pa_config->{'dataserver_lifo'} == 1 &&
get_agent_id ($dbh, $agent_name) > 0) {
return 1;
}
$AgentSem->down ();
if (defined ($Agents{$agent_name})) {
$AgentSem->up ();