Just an idea:

You raise an alarm when DBD::Oracle/OCI takes too long waiting for a
connection. If you just quit the connection attempt then, OCI may never
have a chance to clean up its connection attempt (especially the opened
UDP port).

Am Do, 15.01.2009, 04:01, schrieb Martin Gainty:
>
> Jaya-
>
> Port 1526 sounds odd as the default port for oracle is 1521
>
> Anyone see anything obvious?
> Martin
> ______________________________________________
> Disclaimer and confidentiality note
> Everything in this e-mail and any attachments relates to the official
> business of Sender. This transmission is of a confidential nature and
> Sender does not endorse distribution to any party other than intended
> recipient. Sender does not necessarily endorse content contained within
> this transmission.
>
>
>
>
>> Subject: DBI connect and ports issue
>> Date: Wed, 14 Jan 2009 16:31:12 -0500
>> From: jaya.megh...@vonage.com
>> To: dbi-users@perl.org
>>
>> Hi,
>>
>>
>>
>>
>>
>> My first post too the list!
>>
>>
>>
>> First some environment details:
>>
>> Red Hat Enterprise Linux WS release 4 (Nahant Update 4)
>>
>> Perl Version = 5.008007
>>
>> DBI Version = 1.48
>>
>> DBD::Oracle Version = 1.16
>>
>> Issue:
>>
>> My application connects to Oracle and some times the DB host is down. I
>> use sigaction to put a timeout on DBI->connect and retry again till
>> connection is established.
>>
>> The problem is: I see a lot of unused ports for the application process.
>>
>> 1). TCP ports in CLOSE_WAIT and ESTABLISHED states.
>>
>> 2). Ephemeral UDP ports.
>>
>> These ports accumulate over time as DB connection is lost and
>> re-established.
>>
>> I use lsof and netstat commands to check the stats on ports.
>>
>>
>>
>> To reproduce the issue I have this script (see below), I don't see any
>> TCP ports waiting in CLOSE_WAIT and ESTABLISHED states but each time the
>> script tries to connect (and is timed-out) a new ephemeral UDP port is
>> created.
>>
>> I use iptables to DROP any packets to DB host to simulate DB host down
>> scenario.
>>
>> ************************************************************************
>> ******
>>
>> Output:
>>
>> Here is the output of script and Port stats:
>>
>>
>>
>> $perl sigTry.perl
>>
>> I am in handler
>>
>> Trying to connect
>>
>> Error connecting to DB
>>
>> I out of handler
>>
>> <Hit Return key>
>>
>> I am in handler
>>
>> Trying to connect
>>
>> Error connecting to DB
>>
>> I out of handler
>>
>> <Hit Return key>
>>
>> I am in handler
>>
>> Trying to connect
>>
>> Error connecting to DB
>>
>> I out of handler
>>
>> #Command to see ports stats
>>
>> $lsof -p `pgrep perl` | egrep "TCP|UDP"
>>
>> perl    28572 jmeghani    4u  IPv4 2132909             UDP
>> localhost:33544
>>
>> perl    28572 jmeghani    5u  IPv4 2132913             TCP host1:33466->
>> someDBhost:1526 (SYN_SENT)
>>
>> perl    28572 jmeghani    7u  IPv4 2132924             UDP
>> localhost:33545
>>
>> perl    28572 jmeghani    8u  IPv4 2132926             TCP host1->
>> someDBhost:1526 (SYN_SENT)
>>
>> perl    28572 jmeghani   10u  IPv4 2132927             UDP
>> localhost:33546
>>
>> perl    28572 jmeghani   11u  IPv4 2132929             TCP
>> host1:33468->someDBhost:1526 (SYN_SENT)
>>
>> SYN_SENT ports go away with time but UDP ports (33544-33546) don't.
>>
>> ************************************************************************
>> ******
>>
>> Finally actual script (I have removed actual DB details)
>>
>> Script:
>>
>> ************************************************************************
>> ******
>>
>> $ENV{ORACLE_HOME} = '/usr/vendor/pkg/oracle/product/10.2.0';
>>
>> use strict;
>>
>> use warnings;
>>
>> use POSIX;
>>
>> use DBI;
>>
>> my $db_hostname = 'someDBhost';
>>
>> my $db_port = 1526;
>>
>> my $db_user = 'test';
>>
>> my $db_pass = 'test';
>>
>> my $db_sid = 'SID';
>>
>> my $dbh = undef;
>>
>> sub finished {
>>
>>         print "I am outta here\n";
>>
>>         exit(1);
>>
>> }
>>
>> sub handler {
>>
>>         print "I am in handler\n";
>>
>>         if (!defined($dbh)) {
>>
>>                 print "Trying to connect\n";
>>
>>                 my $old_action = POSIX::SigAction->new();
>>
>>                 my $action = POSIX::SigAction->new( sub{die 'TIMEOUT';
>> });
>>
>>                 sigaction(SIGALRM,$action, $old_action);
>>
>>                 my $old_t;
>>
>>                 eval {
>>
>>                         sigprocmask(SIG_UNBLOCK,
>> POSIX::SigSet->new(SIGALRM));
>>
>>                         $old_t = alarm(2);
>>
>>                         $dbh =
>> DBI->connect("dbi:Oracle:host=$db_hostname;sid=$db_sid;port=$db_port",
>>
>>                                             $db_user, $db_pass,
>>
>>                                     {PrintError => 0, RaiseError => 1,
>> AutoCommit => 0});
>>
>>                         alarm(0);
>>
>>                         print "I am connected\n";
>>
>>                 };
>>
>>         alarm(0);
>>
>>         sigaction(SIGALRM, $old_action);
>>
>>         alarm($old_t);
>>
>>         if ($@) {
>>
>>                 if(defined($dbh)){
>>
>>                         print "dbh was defined\n";
>>
>>                         $dbh=undef;
>>
>>                 }
>>
>>                 print("Error connecting to DB\n");
>>
>>         }
>>
>>       }
>>
>>       else {
>>
>>                 print "Already connected\n";
>>
>>         }
>>
>>         print "I out of handler\n";
>>
>> }
>>
>> sub main {
>>
>>         my $action_die = POSIX::SigAction->new(\&finished);
>>
>>         sigaction(SIGINT,$action_die);
>>
>>         my $old_action = POSIX::SigAction->new();
>>
>>         my $action = POSIX::SigAction->new(\&handler);
>>
>>         sigaction(SIGALRM,$action,$old_action);
>>
>>         while(1)
>>
>>         {
>>
>>                 alarm(3);
>>
>>                 my $foo = <STDIN>;
>>
>>         }
>>
>> }
>>
>> exit(main());
>>
>> **********************************************************************
>>
>>
>>
>> If you are still reading ;) any help is greatly appreciated.
>>
>>
>>
>>
>>
>> Jaya
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>
> _________________________________________________________________
> Windows Live*: Keep your life in sync.
> http://windowslive.com/howitworks?ocid=TXT_TAGLM_WL_t1_allup_howitworks_012009


Reply via email to