Not Uwe, but I'd try binary-searching for minimum stack it overflows on. I don't remember if the default (max) stack size depends on the machine's environment but if it does it may be that.
As for the cause/fix for this, try eliminating alternate clauses one by one and figure out which clause causes this deep recursion. I couldn't tell from the look of it. We could really make use of those non-backtracking regexps :) Dawid On Sun, Jun 17, 2012 at 8:36 PM, Steven A Rowe <[email protected]> wrote: > On 6/17/2012 at 11:42 AM, Uwe Schindler wrote: >> We had a failed build last night, but no eMail was sent! So I looked into >> the server's log, and found the following - something in your regex seems >> to cause a stack overflow (this is not shown in the build log itself, only >> the server log). The same may happen on Apache's Jenkins, but I have no >> access to build logs there. > > Hmm, it appears to be affecting Apache's Jenkins too - no email was sent for > these failed builds: <https://builds.apache.org/job/Solr-4.x/12/> and > <https://builds.apache.org/job/Solr-trunk/1887/>. > >> Jun 17, 2012 9:35:29 AM hudson.plugins.girls.CordellWalkerRecorder <init> >> INFO: Girls are activated >> Jun 17, 2012 9:34:29 AM hudson.model.Executor run >> SEVERE: Executor threw an exception >> java.lang.StackOverflowError >> at java.util.regex.Pattern$BranchConn.match(Pattern.java:4078) >> at java.util.regex.Pattern$CharProperty.match(Pattern.java:3345) >> at java.util.regex.Pattern$Branch.match(Pattern.java:4114) >> at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168) >> at java.util.regex.Pattern$Loop.match(Pattern.java:4295) >> at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227) >> at java.util.regex.Pattern$BranchConn.match(Pattern.java:4078) >> at java.util.regex.Pattern$CharProperty.match(Pattern.java:3345) >> at java.util.regex.Pattern$Branch.match(Pattern.java:4114) >> at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168) >> at java.util.regex.Pattern$Loop.match(Pattern.java:4295) > [...] > > I downloaded the logs for the two failed jobs > (Lucene-Solr-trunk-Linux-Java7-64/307 & .../309), and ran the below-listed > program against them on Win7 using both Oracle JDK 1.6.0_21 and 1.7.0_01 with > default settings. No stack overflow, and it finds and prints out the > expected stuff. (I include the line-counting thing because that's also used > by the Jenkins plugin, just in case that might be the problem.) > > FYI, the source for the BUILD_LOG_MULTILINE_REGEX functionality is here: > <https://github.com/jenkinsci/email-ext-plugin/blob/master/src/main/java/hudson/plugins/emailext/plugins/content/BuildLogMultilineRegexContent.java>; > test suite here: > <https://github.com/jenkinsci/email-ext-plugin/blob/master/src/test/java/hudson/plugins/emailext/plugins/content/BuildLogMultilineRegexContentTest.java>. > > Uwe, do you have any idea how to diagnose what's happening? > > Steve > > ----------------------- > import java.io.File; > import java.io.BufferedReader; > import java.io.FileReader; > import java.io.IOException; > import java.util.regex.Pattern; > import java.util.regex.Matcher; > > public class Test { > static final Pattern pattern = Pattern.compile("(?x:" > +"# Compilation failures\n" > > +"(?:.*\\[javac\\].*\\r?\\n)*.*\\[javac\\]\\s+[1-9]\\d*\\s+error.*\\r?\\n > \n" > +"# Test failures > \n" > > +"|.*\\[junit4\\]\\s*Suite:.*[\\r\\n]+.*\\[junit4\\]\\s*(?!Completed)(?!IGNOR)\\S(?s:.*?)<<<\\s*FAILURES! > \n" > +"# Source file license problems > \n" > > +"|.*rat-sources:.*(?:\\r?\\n.*\\[echo\\].*)*\\s+[1-9]\\d*\\s+Unknown\\s+Licenses.*\\r?\\n(?:.*\\[echo\\].*\\r?\\n)* > \n" > +"# Third-party dependency license problems - include 2 preceding lines > and 1 following line \n" > +"|(?:.*\\r?\\n){2}.*\\[licenses\\]\\s+MISSING\\s+sha1(?:.*\\r?\\n){2} > \n" > +"# Javadoc warnings > \n" > > +"|(?:.*\\[javadoc\\].*\\r?\\n)*.*\\[javadoc\\]\\s*[1-9]\\d*\\s+warnings.*\\r?\\n > \n" > +"# Other javadocs problems: broken links and missing javadocs > \n" > +"|.*javadocs-lint:.*\\r?\\n(?:.*\\[echo\\].*\\r?\\n)* > \n" > +"# Thread dumps - include 1 preceding line and the remainder of the log > \n" > +"|.*\\r?\\n.*Full\\s+thread\\s+dump(?s:.*) > \n" > +"# Jenkins problems - include the remainder of the log > \n" > +"|.*(?:FATAL|ERROR):(?s:.*) > \n" > +"# Include the Ant call stack - include the remainder of the log > \n" > +"|.*BUILD\\s+FAILED(?s:.*) > \n" > +")"); > static final Pattern lineCountPattern = Pattern.compile("(?<=.)\r?\n"); > > public static void main(String[] args) throws IOException { > StringBuilder builder = new StringBuilder(); > File file = new File(args[0]); > BufferedReader reader = new BufferedReader(new FileReader(file)); > String line; > while (null != (line = reader.readLine())) { > builder.append(line).append("\n"); > } > Matcher matcher = pattern.matcher(builder); > while (matcher.find()) { > System.err.println("Found: '" + matcher.group() + "'"); > } > matcher = lineCountPattern.matcher(builder); > int lineCount = 0; > while (matcher.find()) { > ++lineCount; > } > System.err.println("# lines: " + lineCount); > } > } > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [email protected] > For additional commands, e-mail: [email protected] > --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
