From 0abb2ae98768d6f7fd82ba3adc16249d38c0a72a Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Mon, 2 Sep 2019 15:24:21 +0200 Subject: [PATCH] Revert "Revert "Merge branch 'ent-4489-revision-comportamiento-pandora_server-e7' into 'develop'"" This reverts commit 74c9e604e8a68bf55565c724d8caa27142f9b1de. --- pandora_server/lib/PandoraFMS/DataServer.pm | 24 ++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/pandora_server/lib/PandoraFMS/DataServer.pm b/pandora_server/lib/PandoraFMS/DataServer.pm index b0c7e2dcc8..b7beb919a3 100644 --- a/pandora_server/lib/PandoraFMS/DataServer.pm +++ b/pandora_server/lib/PandoraFMS/DataServer.pm @@ -58,6 +58,7 @@ my %Agents :shared; my $Sem :shared; my $TaskSem :shared; my $AgentSem :shared; +my $XMLinSem :shared; ######################################################################################## # Data Server class constructor. @@ -74,6 +75,7 @@ sub new ($$;$) { $Sem = Thread::Semaphore->new; $TaskSem = Thread::Semaphore->new (0); $AgentSem = Thread::Semaphore->new (1); + $XMLinSem = Thread::Semaphore->new (1); # Call the constructor of the parent class my $self = $class->SUPER::new($config, DATASERVER, \&PandoraFMS::DataServer::data_producer, \&PandoraFMS::DataServer::data_consumer, $dbh); @@ -175,6 +177,7 @@ sub data_consumer ($$) { my $agent_name = $1; my $file_name = $pa_config->{'incomingdir'}; my $xml_err; + my $error; # Fix path $file_name .= "/" unless (substr ($file_name, -1, 1) eq '/'); @@ -191,18 +194,37 @@ sub data_consumer ($$) { for (0..1) { eval { + local $SIG{__DIE__}; threads->yield; + # XML::SAX::ExpatXS is not thread safe. + if ($XML::Simple::PREFERRED_PARSER eq 'XML::SAX::ExpatXS') { + $XMLinSem->down(); + } $xml_data = XMLin ($file_name, forcearray => 'module'); + + if ($XML::Simple::PREFERRED_PARSER eq 'XML::SAX::ExpatXS') { + $XMLinSem->up(); + } }; # Invalid XML - if ($@ || ref($xml_data) ne 'HASH') { + if ($@) { + $error = 1; + if ($XML::Simple::PREFERRED_PARSER eq 'XML::SAX::ExpatXS') { + $XMLinSem->up(); + } + } + + if ($error || ref($xml_data) ne 'HASH') { + if ($@) { $xml_err = $@; } else { $xml_err = "Invalid XML format."; } + + logger($pa_config, "Failed to parse $file_name $xml_err", 3); sleep (2); next; }