Sonarqube 声纳qube>=5.0-maven提交导致内部错误

Sonarqube 声纳qube>=5.0-maven提交导致内部错误,sonarqube,Sonarqube,自从升级到sonarqube 5运行sonar maven插件:3.0.1:sonar 由于以下原因而中止: Error 500 on http://gaia:9000/api/ce/submit?projectKey=com.acrys.statcoll:statistics&projectName=Acrys%20Statistics%20Analysis%20Web%20Applicatione 这不是一个升级的问题,因为香草纯新鲜安装也会发生同样的情况 当前配置为: Sonar

自从升级到sonarqube 5运行sonar maven插件:3.0.1:sonar 由于以下原因而中止:

Error 500 on http://gaia:9000/api/ce/submit?projectKey=com.acrys.statcoll:statistics&projectName=Acrys%20Statistics%20Analysis%20Web%20Applicatione
这不是一个升级的问题,因为香草纯新鲜安装也会发生同样的情况

当前配置为: Sonarqube 5.3(新安装无插件)

  • 操作系统:NetBSD 6.1_稳定(通用)(amd64)
  • DB:Postgresql 9.3.4
  • Java:OpenJDK运行时环境(build 1.8.0_45-internal- pkgsrc_1.8.45nb1-b00)
  • (OpenJDK运行时环境也存在问题(build 1.7.0-internal-pkgsrc_2015_07_30_20_43-b00))
使用调试日志级别的服务器端只记录以下异常,不记录任何内容:

ERROR web[o.s.s.w.WebServiceEngine] Fail to process request http://gaia:9000/api/ce/submit?projectKey=com.acrys.statcoll:statistics&projectName=Acrys%20Statistics%20Analysis%20Web%20Application
java.lang.IllegalStateException: Fail to copy report to file: /usr/pkg/sonarqube/sonarqube-5.3/data/ce/reports/AVMc6tnLiICs49s8iiMm.zip
    at org.sonar.server.computation.queue.report.ReportFiles.save(ReportFiles.java:54) ~[sonar-server-5.3.jar:na]
    at org.sonar.server.computation.queue.report.ReportSubmitter.submit(ReportSubmitter.java:74) ~[sonar-server-5.3.jar:na]
    at org.sonar.server.computation.ws.SubmitAction.handle(SubmitAction.java:86) ~[sonar-server-5.3.jar:na]
    at org.sonar.server.ws.WebServiceEngine.execute(WebServiceEngine.java:85) ~[sonar-server-5.3.jar:na]
    ...(lengthy stack truncated)
Caused by: java.io.IOException: not opened for reading
    at org.jruby.util.io.ChannelStream.checkReadable(ChannelStream.java:134) ~[jruby-complete-1.7.9.jar:na]
    at org.jruby.util.io.ChannelStream.bufferedRead(ChannelStream.java:994) ~[jruby-complete-1.7.9.jar:na]
    at org.jruby.util.io.ChannelStream.access$300(ChannelStream.java:62) ~[jruby-complete-1.7.9.jar:na]
    at org.jruby.util.io.ChannelStream$InputStreamAdapter.read(ChannelStream.java:1570) ~[jruby-complete-1.7.9.jar:na]
    at java.io.InputStream.read(InputStream.java:101) ~[na:1.7.0-internal]
    at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1792) ~[commons-io-2.4.jar:2.4]
    at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1769) ~[commons-io-2.4.jar:2.4]
    at org.apache.commons.io.IOUtils.copy(IOUtils.java:1744) ~[commons-io-2.4.jar:2.4]
    at org.apache.commons.io.FileUtils.copyInputStreamToFile(FileUtils.java:1512) ~[commons-io-2.4.jar:2.4]
    at org.sonar.server.computation.queue.report.ReportFiles.save(ReportFiles.java:50) ~[sonar-server-5.3.jar:na]
    ... 352 common frames omitted
基本原因是:java.io.IOException:未打开读取

跟踪服务器上的系统调用显示: 正在接收报告数据并将其保存到/tmp中的文件中 相关文件描述符仅为写入而打开:

2310     65 java     CALL  open(0x7f7fcfa8c3b0,0x601,0x1b6)
2310     65 java     NAMI  "/tmp/RackMultipart20160225-1179439922-1nxhm33"
2310     65 java     RET   open 211/0xd3
第二个参数是提供打开标志或从以下位置进行编辑:

#define O_WRONLY        0x00000001      /* open for writing only */ 
#define O_CREAT         0x00000200      /* create if nonexistent */
#define O_TRUNC         0x00000400      /* truncate to zero length */
服务器端异常中提到的目标文件未写入。它正在被打开和关闭,没有任何写操作

相关的java代码获取文件的inputStream,并尝试将inputStream复制到目标文件

从systemcall跟踪推断,inputStream实际上只对写入开放,而不对读取开放。 这与观察到的例外情况完全一致

我是否可以在运行时更改配置以使提交再次工作


或者这是sonarqube 5版本的更改引入的错误

在深入调试之后,观察到的行为(引发问题)是由jruby的一个bug引起的

Jruby
Tempfile
class通过混合
OpenFlags
OpenFile
类的语义来破坏打开标志。这导致生成的临时文件(用于保存来自submit操作的上传数据)为只写文件

因此,保存文件后,尝试读取该文件以便复制到
数据
目录以进行进一步处理失败, 因为实例被标记为只写


用一个固定版本替换jruby-complete-1.7.9.jar解决了这个问题。

你所说的“固定”到底是什么意思?我将JRubyJAR更新为1.7.23,没有任何更改。不过,我发现问题出在nginx而不是Sonarqube上。必须将
client\u max\u body\u size 1G
添加到服务器或位置块。@Tzrik:(关于“固定”版本):我将jruby源代码修补为使用正确的标志值,编译并使用该版本。我还向jruby提交了一个bug。()