andykimpe / rpms / 389-ds-base

Forked from rpms/389-ds-base 4 months ago
Clone
dc8c34
From 5c3d35055fa16a319600c83bd9cacd040b63ac39 Mon Sep 17 00:00:00 2001
dc8c34
From: Mark Reynolds <mreynolds@redhat.com>
dc8c34
Date: Wed, 28 May 2014 14:38:03 -0400
dc8c34
Subject: [PATCH 216/225] Ticket 47446 - logconv.pl memory continually grows
dc8c34
dc8c34
Bug Description:  Running logconv.pl without any special options
dc8c34
                  continually consumes more memory.
dc8c34
dc8c34
Fix Description:  The main "leak" was a file descriptor array that
dc8c34
                  was constantly growing with every connection, but
dc8c34
                  the array served no purpose - so it was removed.
dc8c34
dc8c34
                  Some other minor changes were made: output formating
dc8c34
                  improvements, making sure verbose hashes were not
dc8c34
                  being updated if the verbose optoin was not enabled,
dc8c34
                  and not calling the CSV report fiunctions if a report
dc8c34
                  was not being asked for.
dc8c34
dc8c34
https://fedorahosted.org/389/ticket/47446
dc8c34
dc8c34
Reviewed by: nhosoi(Thanks!)
dc8c34
dc8c34
(cherry picked from commit 805386caff210ac07a428b38e99ea7b853bece1f)
dc8c34
(cherry picked from commit 519c58e8082ef093e676eb7a1aaaec03a739ea69)
dc8c34
(cherry picked from commit bf4cbf12875cf46d4eecd67a579c857c997e1ce9)
dc8c34
---
dc8c34
 ldap/admin/src/logconv.pl | 133 ++++++++++++++++++++++++++++------------------
dc8c34
 1 file changed, 80 insertions(+), 53 deletions(-)
dc8c34
dc8c34
diff --git a/ldap/admin/src/logconv.pl b/ldap/admin/src/logconv.pl
dc8c34
index ea33544..edc5fd1 100755
dc8c34
--- a/ldap/admin/src/logconv.pl
dc8c34
+++ b/ldap/admin/src/logconv.pl
dc8c34
@@ -56,7 +56,7 @@ Getopt::Long::Configure ("bundling");
dc8c34
 Getopt::Long::Configure ("permute");
dc8c34
 
dc8c34
 if ($#ARGV < 0){;
dc8c34
-&displayUsage;
dc8c34
+	&displayUsage;
dc8c34
 }
dc8c34
 
dc8c34
 #######################################
dc8c34
@@ -78,8 +78,8 @@ my $dataLocation = "/tmp";
dc8c34
 my $startTLSoid = "1.3.6.1.4.1.1466.20037";
dc8c34
 my @statnames=qw(last last_str results srch add mod modrdn moddn cmp del abandon
dc8c34
                  conns sslconns bind anonbind unbind notesA notesU etime);
dc8c34
-my $s_stats = new_stats_block( );
dc8c34
-my $m_stats = new_stats_block( );
dc8c34
+my $s_stats;
dc8c34
+my $m_stats;
dc8c34
 my $verb = "no";
dc8c34
 my @excludeIP;
dc8c34
 my $xi = 0;
dc8c34
@@ -99,7 +99,6 @@ my %bindReport;
dc8c34
 my @vlvconn;
dc8c34
 my @vlvop;
dc8c34
 my @fds;
dc8c34
-my $fdds = 0;
dc8c34
 my $reportBinds = "no";
dc8c34
 my $rootDN = "";
dc8c34
 my $needCleanup = 0;
dc8c34
@@ -392,34 +391,28 @@ sub statusreport {
dc8c34
 ##########################################
dc8c34
 
dc8c34
 if ($files[$#files] =~ m/access.rotationinfo/) {  $file_count--; }
dc8c34
+$logCount = $file_count;
dc8c34
+
dc8c34
+print "Processing $logCount Access Log(s)...\n";
dc8c34
 
dc8c34
-print "Processing $file_count Access Log(s)...\n\n";
dc8c34
 
dc8c34
 #print "Filename\t\t\t   Total Lines\n";
dc8c34
 #print "--------------------------------------------------\n";
dc8c34
 
dc8c34
 my $skipFirstFile = 0;
dc8c34
-if ($file_count > 1 && $files[0] =~ /\/access$/){
dc8c34
-        $files[$file_count] = $files[0];
dc8c34
-        $file_count++;
dc8c34
-        $skipFirstFile = 1;
dc8c34
+if ($logCount > 1 && $files[0] =~ /\/access$/){
dc8c34
+	$files[$logCount] = $files[0];
dc8c34
+	$skipFirstFile = 1;
dc8c34
+	$file_count++;
dc8c34
 }
dc8c34
-$logCount = $file_count;
dc8c34
+
dc8c34
 
dc8c34
 my $logline;
dc8c34
 my $totalLineCount = 0;
dc8c34
 
dc8c34
 for (my $count=0; $count < $file_count; $count++){
dc8c34
 	# we moved access to the end of the list, so if its the first file skip it
dc8c34
-        if($file_count > 1 && $count == 0 && $skipFirstFile == 1){
dc8c34
-                next;
dc8c34
-        }
dc8c34
-	if($file_count > 1 && $count == 0 && $skipFirstFile == 1){
dc8c34
-		next;
dc8c34
-	}
dc8c34
-	if (-z $files[$count]){
dc8c34
-		# access log is empty
dc8c34
-		print "Skipping empty access log ($files[$count])...\n";
dc8c34
+	if($logCount > 1 && $count == 0 && $skipFirstFile == 1){
dc8c34
 		next;
dc8c34
 	}
dc8c34
 	$linesProcessed = 0; $lineBlockCount = 0;
dc8c34
@@ -428,6 +421,12 @@ for (my $count=0; $count < $file_count; $count++){
dc8c34
 	 $atime,$mtime,$ctime,$blksize,$blocks) = stat($files[$count]);
dc8c34
 	print sprintf "[%03d] %-30s\tsize (bytes): %12s\n",$logCount, $files[$count], $cursize;
dc8c34
 	$logCount--;
dc8c34
+	if ($cursize == 0){
dc8c34
+		# access log is empty
dc8c34
+		print "Skipping empty access log ($files[$count])...\n";
dc8c34
+		next;
dc8c34
+	}
dc8c34
+
dc8c34
 	my $logCountStr;
dc8c34
 	if($logCount < 10 ){ 
dc8c34
 		# add a zero for formatting purposes
dc8c34
@@ -612,6 +611,12 @@ if($reportBinds eq "yes"){
dc8c34
 	&displayBindReport();
dc8c34
 }
dc8c34
 
dc8c34
+if($reportStats ne ""){
dc8c34
+	# No need to print the general report, so exit here
dc8c34
+	removeDataFiles();
dc8c34
+	exit (0);
dc8c34
+}
dc8c34
+
dc8c34
 #
dc8c34
 # Continue with standard report
dc8c34
 #
dc8c34
@@ -1366,9 +1371,9 @@ if ($usage =~ /j/i || $verb eq "yes"){
dc8c34
 # We're done, clean up the data files
dc8c34
 #
dc8c34
 removeDataFiles();
dc8c34
-
dc8c34
 exit (0);
dc8c34
 
dc8c34
+
dc8c34
 #######################
dc8c34
 #                     #
dc8c34
 #    Display Usage    #
dc8c34
@@ -1524,7 +1529,11 @@ parseLineBind {
dc8c34
 			$bindReport{$dn}{"failedBind"} = 0;
dc8c34
 		}
dc8c34
 		if ($_ =~ /conn= *([0-9A-Z]+)/i) {
dc8c34
-			$bindReport{$dn}{"conn"} = $bindReport{$dn}{"conn"} . " $1 ";
dc8c34
+			if($bindReport{$dn}{"conn"}){
dc8c34
+				$bindReport{$dn}{"conn"} = $bindReport{$dn}{"conn"} . " $1 ";
dc8c34
+			} else {
dc8c34
+				$bindReport{$dn}{"conn"} = $1;
dc8c34
+			}
dc8c34
 		}
dc8c34
 		return;
dc8c34
 	}
dc8c34
@@ -1645,7 +1654,7 @@ sub parseLineNormal
dc8c34
 
dc8c34
 	# Additional performance stats
dc8c34
 	my ($time, $tzone) = split (' ', $_);
dc8c34
-	if (($reportStats or ($verb eq "yes") || ($usage =~ /y/)) && (!defined($last_tm) or ($time ne $last_tm)))
dc8c34
+	if (($reportStats || ($verb eq "yes") || ($usage =~ /y/)) && (!defined($last_tm) or ($time ne $last_tm)))
dc8c34
 	{
dc8c34
 		$last_tm = $time;
dc8c34
 		$time =~ s/\[//;
dc8c34
@@ -1685,12 +1694,16 @@ sub parseLineNormal
dc8c34
 		if($reportStats){ inc_stats('srch',$s_stats,$m_stats); }
dc8c34
 		if ($_ =~ / attrs=\"(.*)\"/i){
dc8c34
 			$anyAttrs++;
dc8c34
-			my $attr = $hashes->{attr};
dc8c34
-			map { $attr->{$_}++ } split /\s/, $1;
dc8c34
+			if ($usage =~ /r/i || $verb eq "yes"){
dc8c34
+				my $attr = $hashes->{attr};
dc8c34
+				map { $attr->{$_}++ } split /\s/, $1;
dc8c34
+			}
dc8c34
 		}
dc8c34
 		if (/ attrs=ALL/){
dc8c34
-			my $attr = $hashes->{attr};
dc8c34
-			$attr->{"All Attributes"}++;
dc8c34
+			if ($usage =~ /r/i || $verb eq "yes"){
dc8c34
+				my $attr = $hashes->{attr};
dc8c34
+				$attr->{"All Attributes"}++;
dc8c34
+			}
dc8c34
 			$anyAttrs++;
dc8c34
 		}
dc8c34
 		if ($verb eq "yes"){
dc8c34
@@ -1768,16 +1781,20 @@ sub parseLineNormal
dc8c34
 		$bindCount++;
dc8c34
 		if($reportStats){ inc_stats('bind',$s_stats,$m_stats); }
dc8c34
 		if ($1 ne ""){
dc8c34
-			$tmpp = $1;
dc8c34
-			$tmpp =~ tr/A-Z/a-z/;
dc8c34
-			$hashes->{bindlist}->{$tmpp}++;
dc8c34
 			if($1 eq $rootDN){
dc8c34
 				$rootDNBindCount++;
dc8c34
 			}
dc8c34
+			if($usage =~ /f/ || $usage =~ /u/ || $usage =~ /U/ || $usage =~ /b/ || $verb eq "yes"){
dc8c34
+				$tmpp = $1;
dc8c34
+				$tmpp =~ tr/A-Z/a-z/;
dc8c34
+				$hashes->{bindlist}->{$tmpp}++;
dc8c34
+			}
dc8c34
 		} else {
dc8c34
 			$anonymousBindCount++;
dc8c34
-			$hashes->{bindlist}->{"Anonymous Binds"}++;
dc8c34
-			inc_stats('anonbind',$s_stats,$m_stats);
dc8c34
+			if($usage =~ /f/ || $usage =~ /u/ || $usage =~ /U/ || $usage =~ /b/ || $verb eq "yes"){
dc8c34
+				$hashes->{bindlist}->{"Anonymous Binds"}++;
dc8c34
+				if($reportStats){ inc_stats('anonbind',$s_stats,$m_stats); }
dc8c34
+			}
dc8c34
 		}
dc8c34
 	}
dc8c34
 	if (m/ connection from/){
dc8c34
@@ -1796,15 +1813,20 @@ sub parseLineNormal
dc8c34
 		if ($simConnection > $maxsimConnection) {
dc8c34
 			$maxsimConnection = $simConnection;
dc8c34
 		}
dc8c34
-		($connID) = $_ =~ /conn=(\d*)\s/;
dc8c34
-		$openConnection{$connID} = $ip;
dc8c34
-		if ($reportStats or ($verb eq "yes") || ($usage =~ /y/)) {
dc8c34
-			$hashes->{start_time_of_connection}->{$connID} = $gmtime;
dc8c34
+		if ($verb eq "yes" || $usage =~ /p/ || $reportStats){
dc8c34
+			($connID) = $_ =~ /conn=(\d*)\s/;
dc8c34
+			$openConnection{$connID} = $ip;
dc8c34
+			if ($reportStats or ($verb eq "yes") || ($usage =~ /y/)) {
dc8c34
+				$hashes->{start_time_of_connection}->{$connID} = $gmtime;
dc8c34
+			}
dc8c34
 		}
dc8c34
 	}
dc8c34
 	if (m/ SSL client bound as /){$sslClientBindCount++;}
dc8c34
 	if (m/ SSL failed to map client certificate to LDAP DN/){$sslClientFailedCount++;}
dc8c34
-	if (m/ fd=/ && m/slot=/){$fdTaken++}
dc8c34
+	if (m/slot=/ && $_ =~ /fd= *([0-9]+)/i) {
dc8c34
+		$fdTaken++;
dc8c34
+		if ($1 > $highestFdTaken){ $highestFdTaken = $1; }
dc8c34
+	}
dc8c34
 	if (m/ fd=/ && m/closed/){
dc8c34
 		($connID) = $_ =~ /conn=(\d*)\s/;
dc8c34
 		handleConnClose($connID);
dc8c34
@@ -1819,20 +1841,20 @@ sub parseLineNormal
dc8c34
 			$op = $2;
dc8c34
 		}
dc8c34
 		if ($binddn ne ""){
dc8c34
-			if($binddn eq $rootDN){$rootDNBindCount++;}
dc8c34
-			$tmpp = $binddn;
dc8c34
-			$tmpp =~ tr/A-Z/a-z/;
dc8c34
-			$hashes->{bindlist}->{$tmpp}++;
dc8c34
-			if($usage =~ /f/ || $verb eq "yes"){
dc8c34
+			if($binddn eq $rootDN){ $rootDNBindCount++; }
dc8c34
+			if($usage =~ /f/ || $usage =~ /u/ || $usage =~ /U/ || $usage =~ /b/ || $verb eq "yes"){
dc8c34
+				$tmpp = $binddn;
dc8c34
+				$tmpp =~ tr/A-Z/a-z/;
dc8c34
+				$hashes->{bindlist}->{$tmpp}++;
dc8c34
 				$hashes->{bind_conn_op}->{"$serverRestartCount,$conn,$op"} = $tmpp;
dc8c34
 			}
dc8c34
 		} else {
dc8c34
 			$anonymousBindCount++;
dc8c34
-			$hashes->{bindlist}->{"Anonymous Binds"}++;
dc8c34
-			if($usage =~ /f/ || $verb eq "yes"){
dc8c34
+			if($usage =~ /f/ || $usage =~ /u/ || $usage =~ /U/ || $usage =~ /b/ || $verb eq "yes"){
dc8c34
+				$hashes->{bindlist}->{"Anonymous Binds"}++;
dc8c34
 				$hashes->{bind_conn_op}->{"$serverRestartCount,$conn,$op"} = "";
dc8c34
 			}
dc8c34
-			inc_stats('anonbind',$s_stats,$m_stats);
dc8c34
+			if($reportStats){ inc_stats('anonbind',$s_stats,$m_stats); }
dc8c34
 		}
dc8c34
 	}
dc8c34
 	if (m/ UNBIND/){
dc8c34
@@ -2109,20 +2131,30 @@ sub parseLineNormal
dc8c34
 		}
dc8c34
 	}
dc8c34
 	if ($_ =~ /err= *([0-9]+)/i){
dc8c34
-		$errorCode[$1]++;
dc8c34
+		if ($usage =~ /e/i || $verb eq "yes"){ $errorCode[$1]++; }
dc8c34
 		if ($1 ne "0"){ $errorCount++;}
dc8c34
 		else { $successCount++;}
dc8c34
 	}
dc8c34
-	if ($_ =~ /etime= *([0-9.]+)/ ) { $hashes->{etime}->{$1}++; inc_stats_val('etime',$1,$s_stats,$m_stats); }
dc8c34
+	if ($_ =~ /etime= *([0-9.]+)/ ) { 
dc8c34
+		my $etime_val = $1;
dc8c34
+		if ($usage =~ /t/i || $verb eq "yes"){ $hashes->{etime}->{$etime_val}++; }
dc8c34
+		if ($reportStats){ inc_stats_val('etime',$etime_val,$s_stats,$m_stats); }
dc8c34
+	}
dc8c34
 	if ($_ =~ / tag=101 / || $_ =~ / tag=111 / || $_ =~ / tag=100 / || $_ =~ / tag=115 /){
dc8c34
-		if ($_ =~ / nentries= *([0-9]+)/i ){ $hashes->{nentries}->{$1}++; }
dc8c34
+		if ($_ =~ / nentries= *([0-9]+)/i ){ 
dc8c34
+			if ($usage =~ /n/i || $verb eq "yes"){ 
dc8c34
+				$hashes->{nentries}->{$1}++; 
dc8c34
+			}
dc8c34
+		}
dc8c34
 	}
dc8c34
 	if (m/objectclass=\*/i || m/objectclass=top/i ){
dc8c34
 		if (m/ scope=2 /){ $objectclassTopCount++;}
dc8c34
 	}
dc8c34
 	if (m/ EXT oid=/){
dc8c34
 		$extopCount++;
dc8c34
-		if ($_ =~ /oid=\" *([0-9\.]+)/i ){ $hashes->{oid}->{$1}++; }
dc8c34
+		if ($_ =~ /oid=\" *([0-9\.]+)/i ){ 
dc8c34
+			if ($usage =~ /x/i || $verb eq "yes"){$hashes->{oid}->{$1}++; }
dc8c34
+		}
dc8c34
 		if ($1 && $1 eq $startTLSoid){$startTLSCount++;}
dc8c34
 		if ($verb eq "yes"){
dc8c34
 			if ($_ =~ /conn= *([0-9A-Z]+) +op= *([0-9\-]+)/i){ $hashes->{ext_conn_op}->{"$serverRestartCount,$1,$2"}++;}
dc8c34
@@ -2182,11 +2214,6 @@ sub parseLineNormal
dc8c34
 			$scopeCount++;
dc8c34
 		}
dc8c34
 	}
dc8c34
-	if ($_ =~ /fd= *([0-9]+)/i ) {
dc8c34
-		$fds[$fdds] = $1;
dc8c34
-		if ($fds[$fdds] > $highestFdTaken) {$highestFdTaken = $fds[$fdds];}
dc8c34
-		$fdds++;
dc8c34
-	}
dc8c34
 	if ($usage =~ /f/ || $verb eq "yes"){
dc8c34
 		if (/ err=49 tag=/ && / dn=\"/){
dc8c34
 			if ($_ =~ /dn=\"(.*)\"/i ){
dc8c34
-- 
dc8c34
1.8.1.4
dc8c34