Friday, January 18, 2013

Solved bad_record_mac error for Jenkins/Hudson on Tomcat

I have just updated Lund&Bendsens Continuous Integration server from Hudson version 2.2.1 to version 3.0.0. The upgrade process itself gave no troubles, but all jobs checking out from SubVersion failed with the known bad_record_mac error:


org.tmatesoft.svn.core.SVNException: svn: E175002: Received fatal alert: bad_record_mac
svn: E175002: PROPFIND request failed on '/xxxxxxxx/trunk'
    at org.tmatesoft.svn.core.internal.wc.SVNErrorManager.error(SVNErrorManager.java:64)
    at org.tmatesoft.svn.core.internal.wc.SVNErrorManager.error(SVNErrorManager.java:51)
    at org.tmatesoft.svn.core.internal.io.dav.DAVUtil.findStartingProperties(DAVUtil.java:136)
    at org.tmatesoft.svn.core.internal.io.dav.DAVUtil.getBaselineProperties(DAVUtil.java:226)
    at org.tmatesoft.svn.core.internal.io.dav.DAVUtil.getBaselineInfo(DAVUtil.java:184)
    at org.tmatesoft.svn.core.internal.io.dav.DAVConnection.fetchRepositoryRoot(DAVConnection.java:110)
    at org.tmatesoft.svn.core.internal.io.dav.DAVRepository.doGetFullPath(DAVRepository.java:794)
    at org.tmatesoft.svn.core.internal.io.dav.DAVRepository.info(DAVRepository.java:740)
    at hudson.scm.SubversionSCM$CheckOutTask.checkClockOutOfSync(SubversionSCM.java:816)
    at hudson.scm.SubversionSCM$CheckOutTask.invoke(SubversionSCM.java:795)
    at hudson.scm.SubversionSCM$CheckOutTask.invoke(SubversionSCM.java:774)
    at hudson.FilePath.act(FilePath.java:791)
    at hudson.FilePath.act(FilePath.java:773)
    at hudson.scm.SubversionSCM.checkout(SubversionSCM.java:766)
    at hudson.scm.SubversionSCM.checkout(SubversionSCM.java:709)
    at hudson.model.AbstractProject.checkout(AbstractProject.java:1515)
    at hudson.model.AbstractBuild$AbstractRunner.checkout(AbstractBuild.java:521)
    at hudson.model.AbstractBuild$AbstractRunner.run(AbstractBuild.java:428)
    at hudson.model.Run.run(Run.java:1390)
    at hudson.maven.MavenModuleSetBuild.run(MavenModuleSetBuild.java:414)
    at hudson.model.ResourceController.execute(ResourceController.java:81)
    at hudson.model.Executor.run(Executor.java:137)
Caused by: javax.net.ssl.SSLException: Received fatal alert: bad_record_mac
    at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:190)
    at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:136)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1774)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:954)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1138)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:632)
    at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:59)
    at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
    at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
    at org.tmatesoft.svn.core.internal.io.dav.http.HTTPConnection.sendData(HTTPConnection.java:235)
    at org.tmatesoft.svn.core.internal.io.dav.http.HTTPRequest.dispatch(HTTPRequest.java:168)
    at org.tmatesoft.svn.core.internal.io.dav.http.HTTPConnection.request(HTTPConnection.java:368)
    at org.tmatesoft.svn.core.internal.io.dav.http.HTTPConnection.request(HTTPConnection.java:286)
    at org.tmatesoft.svn.core.internal.io.dav.http.HTTPConnection.request(HTTPConnection.java:274)
    at org.tmatesoft.svn.core.internal.io.dav.DAVConnection.performHttpRequest(DAVConnection.java:704)
    at org.tmatesoft.svn.core.internal.io.dav.DAVConnection.doPropfind(DAVConnection.java:132)
    at org.tmatesoft.svn.core.internal.io.dav.DAVUtil.getProperties(DAVUtil.java:73)
    at org.tmatesoft.svn.core.internal.io.dav.DAVUtil.getResourceProperties(DAVUtil.java:79)
    at org.tmatesoft.svn.core.internal.io.dav.DAVUtil.getStartingProperties(DAVUtil.java:103)
    at org.tmatesoft.svn.core.internal.io.dav.DAVUtil.findStartingProperties(DAVUtil.java:125)
    ... 19 more



I tried different solution approaches, but what work was a simple update from JDK 6 to JDK 7. There was a catch though to the solution. We had installed Tomcat as a Windows Service and I updated the service configuration to use JDK 7 as JAVA_HOME. It was however not enough. I also had to update a service jvm configuration, which pointed a the JDK 6 jvm. I therefore ended up updating the Tomcat Windows Service as follows:

TOMCAT_HOME\bin>tomcat7 //US//Tomcat7 --JavaHome="C:\Program Files\Java\jdk1.7.0" --Jvm="C:\Program Files\Java\jdk1.7.0\jre\bin\server\jvm.dll"

More about the Tomcat service scripts can be seen here: http://tomcat.apache.org/tomcat-7.0-doc/windows-service-howto.html.

Inspiration to the JDK upgrade came from https://issues.jenkins-ci.org/browse/JENKINS-11985. This issue also indicates that the problem resides in the SubVersion plugin, which is used on both Hudson and Jenkins. The above fix should therefore also hold for Jenkins installation on Tomcat.

1 comment:

  1. Jesper, this was incredibly helpful. Thank you very much! We had everything set to run on a Jenkins slave, and once we updated the JDK on the slave to 7, then everything worked perfectly. Thanks again!

    ReplyDelete