Jenkins で “java.lang.IndexOutOfBoundsException: Bounds exceeds available space : size=1048576, offset=1048577” のエラーが出る場合の対処方法

Jenkins

Jenkins でデイリービルドを回しているのですが、稀に以下のエラーが出ることがあります。

05:40:45 FATAL: Bounds exceeds available space : size=1048576, offset=1048577
05:40:45 java.lang.IndexOutOfBoundsException: Bounds exceeds available space : size=1048576, offset=1048577
05:40:45 	at com.sun.jna.Memory.boundsCheck(Memory.java:221)
05:40:45 	at com.sun.jna.Memory.getByte(Memory.java:443)
05:40:45 	at hudson.util.ProcessTree$Darwin$DarwinProcess$1StringArrayMemory.readString(ProcessTree.java:1739)
05:40:45 	at hudson.util.ProcessTree$Darwin$DarwinProcess.parse(ProcessTree.java:1811)
05:40:45 	at hudson.util.ProcessTree$Darwin$DarwinProcess.getEnvironmentVariables(ProcessTree.java:1688)
05:40:45 	at hudson.util.ProcessTree$OSProcess.hasMatchingEnvVars(ProcessTree.java:339)
05:40:45 	at hudson.util.ProcessTree$Unix.killAll(ProcessTree.java:733)
05:40:45 	at hudson.Launcher$LocalLauncher.kill(Launcher.java:955)
05:40:45 	at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:510)
05:40:45 	at hudson.model.Run.execute(Run.java:1880)
05:40:45 	at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
05:40:45 	at hudson.model.ResourceController.execute(ResourceController.java:97)
05:40:45 	at hudson.model.Executor.run(Executor.java:428)

このエラーについて調査したので、対処方法などを紹介したいと思います。

「Bounds exceeds available space」のエラーについて

本家の issue トラッカーでも以下で報告されています。

Loading...
Loading...

macOS BigSur にアップデートしたら発生するようになったという報告が多いようです。

自分の環境は BigSur ではなくそれより1つ新しい Monterey なのですが、同様に発生しました。

ただ、OSをアップデートしたタイミングですぐ発生したわけではないので謎ではありますね…。

https://issues.jenkins.io/browse/JENKINS-64347 によると labels = 2.289.2-fixed とあるので、 ver. 2.289.2 で修正済みのようです。

最新版を使っている限りはこの問題に遭遇することはなさそうです。

Jenkins のバージョンをアップデートできない場合の workaround

自分の環境ではだいぶ古い ver.2.226 を使っているのですが、過去に当時の最新にバージョンアップした際に問題が発生し、ロールバックした経験があります(そして結構な作業時間取られました…)。

なので、今回も気軽にはアップデートしたくないです。

JENKINS-65517 の最後のコメント を見ると、以下の記載があります。

To work around the issue, set the -Dhudson.util.ProcessTreeKiller.disable=true Java property on the agent.

ProcessTreeKiller の公式ドキュメントは以下にあるようです。

Jenkins : ProcessTreeKiller

今回はこれを適用して様子を見ることにしました。

Jenkins は brew でインストールしたので、~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist に対して以下を追記します。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>homebrew.mxcl.jenkins</string>
    <key>ProgramArguments</key>
    <array>
      <string>/usr/libexec/java_home</string>
      <string>-v</string>
      <string>1.8</string>
      <string>--exec</string>
      <string>java</string>
      <string>-Dmail.smtp.starttls.enable=true</string>
      <string>-Dhudson.util.ProcessTreeKiller.disable=true</string> <!-- ★これを追加 -->
      <string>-jar</string>
      <string>/usr/local/opt/jenkins/libexec/jenkins.war</string>
      <string>--httpPort=8080</string>
      <string>--sessionTimeout=1440</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
  </dict>
</plist>

ファイル更新後、以下を実行して設定をロードさせてJenkinsを再起動します。

launchctl stop homebrew.mxcl.jenkins
launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist
launchctl start homebrew.mxcl.jenkins

再起動後、設定が反映されているかチェックします。

$ ps aux | grep jenkins | grep -v grep
xxxxx            73349   0.0 10.7 49664184 3584344   ??  S    12:09PM   2:40.03 /usr/bin/java -Dmail.smtp.starttls.enable=true -Dhudson.util.ProcessTreeKiller.disable=true -jar /usr/local/opt/jenkins/libexec/jenkins.war --httpPort=8080 --sessionTimeout=1440

-Dhudson.util.ProcessTreeKiller.disable=true が入っているのでOKですね。

まとめ

Jenkins で「Bounds exceeds available space」のエラーが出る場合の workaround を紹介しました。

最新版にしておけば遭遇しない問題っぽいですが、頻繁に環境を更新して最新状態を維持するっていうのはちょっと面倒ですね。

同様のエラーで困っている方の参考になれば幸いです。

コメント

タイトルとURLをコピーしました