Confusingly, it is instead MasterComputer.localChannel!
If that is fed back into FilePath.<init>(VirtualChannel,String) rather than using .<init>(FilePath,String)
you get an object that behaves strangely and throws exceptions.
OldDataMonitor already collates these errors and presents them to the user with a fix.
Printing a stack trace for each and every missing class just clutters the log file.
(Especially when restarting after disabling a widely-used plugin.)
"GroovyInitScript.init" daemon prio=10 tid=0x00007f28d0001800 nid=0x48 runnable [0x00007f28cb79e000]
java.lang.Thread.State: RUNNABLE
at java.util.WeakHashMap.get(Unknown Source)
at org.codehaus.groovy.ast.ClassHelper.makeCached(ClassHelper.java:121)
at org.codehaus.groovy.ast.ClassHelper.makeWithoutCaching(ClassHelper.java:183)
at org.codehaus.groovy.ast.ClassHelper.make(ClassHelper.java:170)
at org.codehaus.groovy.ast.ClassHelper.make(ClassHelper.java:159)
at org.codehaus.groovy.vmplugin.v5.Java5.makeClassNode(Java5.java:382)
at org.codehaus.groovy.vmplugin.v5.Java5.makeParameter(Java5.java:403)
at org.codehaus.groovy.vmplugin.v5.Java5.makeParameters(Java5.java:396)
at org.codehaus.groovy.vmplugin.v5.Java5.configureClassNode(Java5.java:331)
at org.codehaus.groovy.ast.ClassNode.lazyClassInit(ClassNode.java:262)
- locked <0x00000000f4bfe2b0> (a java.lang.Object)
at org.codehaus.groovy.ast.ClassNode.getInterfaces(ClassNode.java:356)
at org.codehaus.groovy.ast.ClassNode.declaresInterface(ClassNode.java:946)
at org.codehaus.groovy.ast.ClassNode.implementsInterface(ClassNode.java:926)
at org.codehaus.groovy.ast.ClassNode.isDerivedFromGroovyObject(ClassNode.java:916)
at org.codehaus.groovy.classgen.AsmClassGenerator.isGroovyObject(AsmClassGenerator.java:1070)
at org.codehaus.groovy.classgen.AsmClassGenerator.visitPropertyExpression(AsmClassGenerator.java:1027)
at org.codehaus.groovy.ast.expr.PropertyExpression.visit(PropertyExpression.java:55)
at org.codehaus.groovy.classgen.asm.BinaryExpressionHelper.evaluateEqual(BinaryExpressionHelper.java:287)
at org.codehaus.groovy.classgen.asm.BinaryExpressionHelper.eval(BinaryExpressionHelper.java:76)
at org.codehaus.groovy.classgen.AsmClassGenerator.visitBinaryExpression(AsmClassGenerator.java:519)
at org.codehaus.groovy.ast.expr.BinaryExpression.visit(BinaryExpression.java:49)
at org.codehaus.groovy.classgen.asm.StatementWriter.writeExpressionStatement(StatementWriter.java:599)
at org.codehaus.groovy.classgen.asm.OptimizingStatementWriter.writeExpressionStatement(OptimizingStatementWriter.java:354)
at org.codehaus.groovy.classgen.AsmClassGenerator.visitExpressionStatement(AsmClassGenerator.java:501)
at org.codehaus.groovy.ast.stmt.ExpressionStatement.visit(ExpressionStatement.java:40)
at org.codehaus.groovy.classgen.asm.StatementWriter.writeBlockStatement(StatementWriter.java:80)
at org.codehaus.groovy.classgen.asm.OptimizingStatementWriter.writeBlockStatement(OptimizingStatementWriter.java:155)
at org.codehaus.groovy.classgen.AsmClassGenerator.visitBlockStatement(AsmClassGenerator.java:447)
at org.codehaus.groovy.ast.stmt.BlockStatement.visit(BlockStatement.java:69)
at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClassCodeContainer(ClassCodeVisitorSupport.java:101)
at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitConstructorOrMethod(ClassCodeVisitorSupport.java:112)
at org.codehaus.groovy.classgen.AsmClassGenerator.visitStdMethod(AsmClassGenerator.java:312)
at org.codehaus.groovy.classgen.AsmClassGenerator.visitConstructorOrMethod(AsmClassGenerator.java:269)
at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitMethod(ClassCodeVisitorSupport.java:123)
at org.codehaus.groovy.classgen.AsmClassGenerator.visitMethod(AsmClassGenerator.java:389)
at org.codehaus.groovy.ast.ClassNode.visitContents(ClassNode.java:1056)
at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClass(ClassCodeVisitorSupport.java:50)
at org.codehaus.groovy.classgen.AsmClassGenerator.visitClass(AsmClassGenerator.java:173)
at org.codehaus.groovy.control.CompilationUnit$14.call(CompilationUnit.java:767)
at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:967)
at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:546)
at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:524)
at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:501)
at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:306)
at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:287)
at groovy.lang.GroovyShell.parseClass(GroovyShell.java:731)
at groovy.lang.GroovyShell.parse(GroovyShell.java:743)
at groovy.lang.GroovyShell.evaluate(GroovyShell.java:578)
at hudson.init.impl.GroovyInitScript.execute(GroovyInitScript.java:83)
at hudson.init.impl.GroovyInitScript.execute(GroovyInitScript.java:78)
at hudson.init.impl.GroovyInitScript.init(GroovyInitScript.java:57)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at hudson.init.InitializerFinder.invoke(InitializerFinder.java:120)
at hudson.init.InitializerFinder$TaskImpl.run(InitializerFinder.java:184)
at org.jvnet.hudson.reactor.Reactor.runTask(Reactor.java:259)
at jenkins.model.Jenkins$7.runTask(Jenkins.java:889)
at org.jvnet.hudson.reactor.Reactor$2.run(Reactor.java:187)
at org.jvnet.hudson.reactor.Reactor$Node.run(Reactor.java:94)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Root cause of class loading error (on jnr.ffi.util.ref.internal.Finalizer$ShutDown) still unclear,
but easy fix is to simplify ClientAuthenticationCache.save to use FilePath.chmod,
which at least for now relies on hudson.util.jna.GNUCLibrary rather than JNR.
The project cannot be usefully built in this case but at least they can go back and reconfigure it.
Also fixing Layouter.Column to not throw NoSuchElementException (in violation of Iterator contract)
and thus break project overview when there is an empty Axis in the trivial list (due to an unintentional IndexOutOfBoundsException).
(04:07:53 PM) bbeck: In a plugin, given hudson.model.Node object is there an easy way to figure out how many busy/idle executors that node has? There only seems to be a method to determine the number of executors, but not their states.
(04:24:02 PM) kohsuke: bbeck: see Computer
(04:25:51 PM) bbeck: kohsuke: thanks, just noticed the countIdle/countBusy functions there.
Added another attribute 'checkDependsOn' on <input> elements (akin to
'fillDependsOn', etc) to list up the other dependency controls, and
insert appropriate onchange events.
'checkUrl' is now just the stem portion of the URL to invoke, and
the client script builds up the query parameters.