Jori Hamalainen's patch to speed up exigrep, and fix two typos.
authorPhilip Hazel <ph10@hermes.cam.ac.uk>
Wed, 7 Feb 2007 12:23:35 +0000 (12:23 +0000)
committerPhilip Hazel <ph10@hermes.cam.ac.uk>
Wed, 7 Feb 2007 12:23:35 +0000 (12:23 +0000)
doc/doc-txt/ChangeLog
doc/doc-txt/NewStuff
src/ACKNOWLEDGMENTS
src/src/exigrep.src

index 2e7d57a203f83cf48eb0812470be9ceffd81d88d..34d42c92cb2c244714ba0f4e791e35ee9c10df42 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.474 2007/02/07 11:24:56 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.475 2007/02/07 12:23:35 ph10 Exp $
 
 Change log file for Exim from version 4.21
 -------------------------------------------
@@ -91,6 +91,9 @@ PH/21 Long custom messages for fakedefer and fakereject are now split up
       into multiline reponses in the same way that messages for "deny" and
       other ACL rejections are.
 
+PH/22 Applied Jori Hamalainen's speed-up changes and typo fixes to exigrep,
+      with slight modification.
+
 
 Exim version 4.66
 -----------------
index 3fbb1b662ec1f85af1a084bfadf56376fc92410d..04177227d7447d992442c7f83bed0d949a4e6f32 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/NewStuff,v 1.139 2007/02/06 14:49:13 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/NewStuff,v 1.140 2007/02/07 12:23:35 ph10 Exp $
 
 New Features in Exim
 --------------------
@@ -286,6 +286,12 @@ Version 4.67
     be used to suppress the use of PIPELINING to certain hosts, while still
     supporting the other SMTP extensions (cf hosts_avoid_tls).
 
+15. By default, exigrep does case-insensitive matches. There is now a -I option
+    that makes it case-sensitive. This may give a performance improvement when
+    searching large log files. Without -I, the Perl pattern matches use the /i
+    option; with -I they don't. In both cases it is possible to change the case
+    sensitivity within the pattern using (?i) or (?-i).
+
 
 Version 4.66
 ------------
index d9238db38834827a20e055bf9ae6f38a8b831e18..15c1f3fed62006b335267532d971414325246758 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/src/ACKNOWLEDGMENTS,v 1.72 2007/02/06 10:00:24 ph10 Exp $
+$Cambridge: exim/src/ACKNOWLEDGMENTS,v 1.73 2007/02/07 12:23:35 ph10 Exp $
 
 EXIM ACKNOWLEDGEMENTS
 
@@ -20,7 +20,7 @@ relatively small patches.
 Philip Hazel
 
 Lists created: 20 November 2002
-Last updated:  06 February 2007
+Last updated:  07 February 2007
 
 
 THE OLD LIST
@@ -157,6 +157,7 @@ Michael Haardt            Tidies to make the code stricter
 Thomas Hager              Patch for saslauthd crash bug
 Richard Hall              Fix for file descriptor leak in redirection
 Jori Hamalainen           Patch to add features to exiqsumm
+                          Patch to speed up exigrep
 Steve Haslam              Lots of stuff, including
                             HMAC computations
                             Better error messages for BDB
index f888984b0c8b8805748d599f7321c1fb667b0a83..7b6360f014b11567101340432c4c33cb2ebb3b37 100644 (file)
@@ -1,5 +1,5 @@
 #! PERL_COMMAND -w
-# $Cambridge: exim/src/src/exigrep.src,v 1.4 2007/01/31 16:52:12 ph10 Exp $
+# $Cambridge: exim/src/src/exigrep.src,v 1.5 2007/02/07 12:23:35 ph10 Exp $
 
 use strict;
 
@@ -28,6 +28,10 @@ use strict;
 # appears to be compressed, it is passed through zcat. We can't just do this
 # for all files, because zcat chokes on non-compressed files.
 
+# Performance optimized in 02/02/2007 by Jori Hamalainen
+# Typical run time acceleration: 4 times
+
+
 use Getopt::Std qw(getopts);
 use POSIX qw(mktime);
 
@@ -38,7 +42,7 @@ use POSIX qw(mktime);
 
 sub seconds {
 my($year,$month,$day,$hour,$min,$sec,$tzs,$tzh,$tzm) =
-  $_[0] =~ /^(\d{4})-(\d\d)-(\d\d)\s(\d\d):(\d\d):(\d\d)(?>\s([+-])(\d\d)(\d\d))?/;
+  $_[0] =~ /^(\d{4})-(\d\d)-(\d\d)\s(\d\d):(\d\d):(\d\d)(?>\s([+-])(\d\d)(\d\d))?/o;
 
 my $seconds = mktime $sec, $min, $hour, $day, $month - 1, $year - 1900;
 
@@ -55,22 +59,22 @@ return $seconds;
 # This subroutine processes a single line (in $_) from a log file. Program
 # defensively against short lines finding their way into the log.
 
-my (%saved, %id_list, $pattern, $queue_time);
+my (%saved, %id_list, $pattern, $queue_time, $insensitive);
 
 sub do_line {
 
 # Convert syslog lines to mainlog format, as in eximstats.
 
-if (! /^\\d{4}/) { $_ =~ s/^.*? exim\b.*?: //; }
+if (!/^\d{4}-/o) { $_ =~ s/^.*? exim\b.*?: //o; }
 
 return unless
-  my($date,$entry) = /^(\d{4}-\d\d-\d\d \d\d:\d\d:\d\d (?:[+-]\d{4} )?)(.*)/;
+  my($date,$id) = /^(\d{4}-\d\d-\d\d \d\d:\d\d:\d\d (?:[+-]\d{4} )?)(\w{6}\-\w{6}\-\w{2})?/o;
 
 # Handle the case when the log line belongs to a specific message. We save
 # lines for specific messages until the message is complete. Then either print
 # or discard.
 
-if (my($id) = $entry =~ /^(?:\[\d+\]\s)?(\w{6}\-\w{6}\-\w{2})/)
+if (defined $id)
   {
   $saved{$id} = '' unless defined($saved{$id});
 
@@ -78,17 +82,20 @@ if (my($id) = $entry =~ /^(?:\[\d+\]\s)?(\w{6}\-\w{6}\-\w{2})/)
 
   $saved{$id} .= $_;
 
-  # Are we interested in this id ?
+  # Are we interested in this id ? Short circuit if we already were interested.
 
-  $id_list{$id} = 1 if /$pattern/io;
+  $id_list{$id} = 1 if defined $id_list{$id} ||
+    ($insensitive && /$pattern/io) || /$pattern/o;
 
   # See if this is a completion for some message. If it is interesting,
   # print it, but in any event, throw away what was saved.
 
-  if ($entry =~
-        /(?:Completed|rejected (?:by local_scan|by non-SMTP ACL|after DATA))/)
+  if (index($_, 'Completed') != -1 ||
+      (index($_, 'rejected') != -1 &&
+       /rejected (?:by local_scan|by non-SMTP ACL|after DATA)/o))
     {
-    if ($saved{$id} =~ /^(\d{4}-\d\d-\d\d \d\d:\d\d:\d\d ([+-]\d{4} )?)(\w{6}\-\w{6}\-\w{2})/)
+    if ($queue_time != -1 &&
+        $saved{$id} =~ /^(\d{4}-\d\d-\d\d \d\d:\d\d:\d\d ([+-]\d{4} )?)/o)
       {
       my $old_sec = &seconds($1);
       my $sec = &seconds($date);
@@ -108,7 +115,8 @@ if (my($id) = $entry =~ /^(?:\[\d+\]\s)?(\w{6}\-\w{6}\-\w{2})/)
 # Handle the case where the log line does not belong to a specific message.
 # Print it if it is interesting.
 
-elsif ($entry =~ /$pattern/io) { print "$_\n"; }
+elsif (($insensitive && $_ =~ /$pattern/io) || $_ =~ /$pattern/o)
+  { print "$_\n"; }
 }
 
 
@@ -116,10 +124,11 @@ elsif ($entry =~ /$pattern/io) { print "$_\n"; }
 # are quoted if the -l flag is given. The -t flag gives a time-on-queue value
 # which is an additional condition.
 
-getopts('lt:',\my %args);
+getopts('Ilt:',\my %args);
 $queue_time = $args{'t'}? $args{'t'} : -1;
+$insensitive = $args{'I'}? 0 : 1;
 
-die "usage: exigrep [-l] [-t <seconds>] <pattern> [<log file>]...\n"
+die "usage: exigrep [-I] [-l] [-t <seconds>] <pattern> [<log file>]...\n"
   if ($#ARGV < 0);
 
 $pattern = shift @ARGV;
@@ -134,7 +143,7 @@ if (@ARGV)
   foreach (@ARGV)
     {
     my $filename = $_;
-    if ($filename =~ /\.(?:COMPRESS_SUFFIX)$/)
+    if ($filename =~ /\.(?:COMPRESS_SUFFIX)$/o)
       {
       open(LOG, "ZCAT_COMMAND $filename |") ||
         die "Unable to zcat $filename: $!\n";
@@ -154,6 +163,6 @@ else { do_line() while (<STDIN>); }
 
 # At the end of processing all the input, print any uncompleted data
 
-for (keys %id_list) { print "+++ $_ not completed +++\n$saved{$_}\n;" }
+for (keys %id_list) { print "+++ $_ not completed +++\n$saved{$_}\n"; }
 
 # End of exigrep