From fdaeb5d76168d9eb5d0130ad4c6a430a174dc274 Mon Sep 17 00:00:00 2001 From: chenglch Date: Fri, 28 Jul 2017 13:53:34 +0800 Subject: [PATCH] Retry 3 times if database connection can not be established As connection may fail due to the limit or error from database side, this patch add retry mechanism to reduce probability of failure. fix-issue: #2529 --- perl-xCAT/xCAT/Table.pm | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/perl-xCAT/xCAT/Table.pm b/perl-xCAT/xCAT/Table.pm index 576598ef9..8de4a4528 100644 --- a/perl-xCAT/xCAT/Table.pm +++ b/perl-xCAT/xCAT/Table.pm @@ -844,12 +844,28 @@ sub new } my $oldumask = umask 0077; - unless ($::XCAT_DBHS->{ $self->{connstring}, $self->{dbuser}, $self->{dbpass}, $self->{realautocommit} }) { #= $self->{tabname}; - $::XCAT_DBHS->{ $self->{connstring}, $self->{dbuser}, $self->{dbpass}, $self->{realautocommit} } = - DBI->connect($self->{connstring}, $self->{dbuser}, $self->{dbpass}, { AutoCommit => $self->{realautocommit} }); + my $retry = 0; + while (!$::XCAT_DBHS->{ $self->{connstring}, $self->{dbuser}, $self->{dbpass}, $self->{realautocommit} }) { + eval { + local $SIG{__WARN__} = sub { + my $message = shift; + if ($retry == 3 && $message) { + xCAT::MsgUtils->message("S", "Failed to connect to ".$self->{tabname}." table after retrying $retry times: $message"); + } + }; + $::XCAT_DBHS->{ $self->{connstring}, $self->{dbuser}, $self->{dbpass}, $self->{realautocommit} } = + DBI->connect($self->{connstring}, $self->{dbuser}, $self->{dbpass}, { AutoCommit => $self->{realautocommit} }); + }; + if ($::XCAT_DBHS->{ $self->{connstring}, $self->{dbuser}, $self->{dbpass}, $self->{realautocommit} }) { + last; + } elsif ($retry == 3) { + last; + } else { + sleep (2**$retry); + } + $retry++; } umask $oldumask; - $self->{dbh} = $::XCAT_DBHS->{ $self->{connstring}, $self->{dbuser}, $self->{dbpass}, $self->{realautocommit} }; #Store the Table object reference as afflicted by changes to the DBH