/** * @return The list of strings of computer names (excluding master) * @since 2.14 */ @Nonnull public static List<String> getComputerNames() { final ArrayList<String> names = new ArrayList<String>(); for (Computer c : Jenkins.getInstance().getComputers()) { if (!c.getName().isEmpty()) { names.add(c.getName()); } } return names; }
public String getUrl() { return "computer/" + Util.rawEncode(getName()) + "/"; }
@CLIResolver public @CheckForNull Computer getComputer(@Argument(required=true,metaVar="NAME",usage="Node name") @Nonnull String name) { if(name.equals("(master)")) name = ""; for (Computer c : computers.values()) { if(c.getName().equals(name)) return c; } return null; }
@Override public void preOnline(Computer c, Channel channel, FilePath root, TaskListener listener) { if (disabled) return; try { if (channel.call(new ChannelSwapper())) listener.getLogger().println("Evacuated stdout"); } catch (Throwable e) { LOGGER.fine("Fatal problem swapping file descriptors " + c.getName()); } }
private Runnable createFlyWeightTaskRunnable(final BuildableItem p, final Computer c) { if (LOGGER.isLoggable(Level.FINEST)) { LOGGER.log(Level.FINEST, "Creating flyweight task {0} for computer {1}", new Object[]{p.task.getFullDisplayName(), c.getName()}); } return new Runnable() { @Override public void run() { c.startFlyWeightTask(new WorkUnitContext(p).createWorkUnit(p.task)); makePending(p); } }; }
@Override public String toString() { return String.format("JobOffer[%s #%d]",executor.getOwner().getName(), executor.getNumber()); } }
void broadcast() { for (Computer c : Jenkins.getInstance().getComputers()) { if (c.getName().length() > 0) { // i.e. not master VirtualChannel ch = c.getChannel(); if (ch != null) { try { ch.call(this); } catch (Exception x) { Logger.getLogger(LogRecorder.class.getName()).log(Level.WARNING, "could not set up logging on " + c, x); } } } } } }
if (c.getName().length() == 0) { continue; // master
private static void install(Computer c, TaskListener listener) { try { final List<SlaveRestarter> restarters = new ArrayList<>(SlaveRestarter.all()); VirtualChannel ch = c.getChannel(); if (ch==null) return; // defensive check List<SlaveRestarter> effective = ch.call(new FindEffectiveRestarters(restarters)); LOGGER.log(FINE, "Effective SlaveRestarter on {0}: {1}", new Object[] {c.getName(), effective}); } catch (Throwable e) { Functions.printStackTrace(e, listener.error("Failed to install restarter")); } } private static class FindEffectiveRestarters extends MasterToSlaveCallable<List<SlaveRestarter>, IOException> {
@Override public Object data(Computer c) { DiskSpace size = markNodeOfflineIfDiskspaceIsTooLow(c); // mark online (again), if free space is over threshold if(size!=null && size.size > getThresholdBytes() && c.isOffline() && c.getOfflineCause() instanceof DiskSpace) if(this.getClass().equals(((DiskSpace)c.getOfflineCause()).getTrigger())) if(getDescriptor().markOnline(c)) { LOGGER.info(Messages.DiskSpaceMonitor_MarkedOnline(c.getName())); } return size; }
@Override protected Map<Computer, Data> monitor() throws InterruptedException { Result<Data> base = monitorDetailed(); Map<Computer, Data> monitoringData = base.getMonitoringData(); for (Entry<Computer, Data> e : monitoringData.entrySet()) { Computer c = e.getKey(); Data d = e.getValue(); if (base.getSkipped().contains(c)) { assert d == null; continue; } if (d ==null) { // if we failed to monitor, put in the special value that indicates a failure e.setValue(d=new Data(get(c),-1L)); } if(d.hasTooManyTimeouts() && !isIgnored()) { // unlike other monitors whose failure still allow us to communicate with the agent, // the failure in this monitor indicates that we are just unable to make any requests // to this agent. So we should severe the connection, as opposed to marking it temporarily // off line, which still keeps the underlying channel open. c.disconnect(d); LOGGER.warning(Messages.ResponseTimeMonitor_MarkedOffline(c.getName())); } } return monitoringData; }
/** * Marks the given node as offline if free disk space is below the configured threshold. * @param c the node * @return the free space * @since 1.521 */ @Restricted(NoExternalUse.class) public DiskSpace markNodeOfflineIfDiskspaceIsTooLow(Computer c) { DiskSpace size = (DiskSpace) super.data(c); if(size!=null && size.size < getThresholdBytes()) { size.setTriggered(this.getClass(), true); if(getDescriptor().markOffline(c,size)) { LOGGER.warning(Messages.DiskSpaceMonitor_MarkedOffline(c.getName())); } } return size; }
protected void execute(TaskListener listener) throws IOException, InterruptedException { if (!enabled) return; long now = System.currentTimeMillis(); for (Computer c: Jenkins.get().getComputers()) { VirtualChannel ch = c.getChannel(); if (ch instanceof Channel) { Channel channel = (Channel) ch; if (now-channel.getLastHeard() > TIME_TILL_PING) { // haven't heard from this agent for a while. Long lastPing = (Long)channel.getProperty(ConnectionActivityMonitor.class); if (lastPing!=null && now-lastPing > TIMEOUT) { LOGGER.info("Repeated ping attempts failed on "+c.getName()+". Disconnecting"); c.disconnect(OfflineCause.create(Messages._ConnectionActivityMonitor_OfflineCause())); } else { // send a ping. if we receive a reply, it will be reflected in the next getLastHeard() call. channel.callAsync(PING_COMMAND); if (lastPing==null) channel.setProperty(ConnectionActivityMonitor.class,now); } } else { // we are receiving data nicely channel.setProperty(ConnectionActivityMonitor.class,null); } } } }
@Override public void buildEnvironmentFor(Job j, EnvVars env, TaskListener listener) throws IOException, InterruptedException { Jenkins jenkins = Jenkins.getInstance(); String rootUrl = jenkins.getRootUrl(); if(rootUrl!=null) { env.put("JENKINS_URL", rootUrl); env.put("HUDSON_URL", rootUrl); // Legacy compatibility env.put("JOB_URL", rootUrl+j.getUrl()); } String root = jenkins.getRootDir().getPath(); env.put("JENKINS_HOME", root); env.put("HUDSON_HOME", root); // legacy compatibility Thread t = Thread.currentThread(); if (t instanceof Executor) { Executor e = (Executor) t; env.put("EXECUTOR_NUMBER", String.valueOf(e.getNumber())); if (e.getOwner() instanceof MasterComputer) { env.put("NODE_NAME", "master"); } else { env.put("NODE_NAME", e.getOwner().getName()); } Node n = e.getOwner().getNode(); if (n != null) env.put("NODE_LABELS", Util.join(n.getAssignedLabels(), " ")); } } }
@Override public void preOnline(Computer c, Channel channel, FilePath root, TaskListener listener) { if (disabled) return; try { if (channel.call(new ChannelSwapper())) listener.getLogger().println("Evacuated stdout"); } catch (Throwable e) { LOGGER.fine("Fatal problem swapping file descriptors " + c.getName()); } }
@Override public Object data(Computer c) { DiskSpace size = markNodeOfflineIfDiskspaceIsTooLow(c); // mark online (again), if free space is over threshold if(size!=null && size.size > getThresholdBytes() && c.isOffline() && c.getOfflineCause() instanceof DiskSpace) if(this.getClass().equals(((DiskSpace)c.getOfflineCause()).getTrigger())) if(getDescriptor().markOnline(c)) { LOGGER.warning(Messages.DiskSpaceMonitor_MarkedOnline(c.getName())); } return size; }
@Override public Object data(Computer c) { DiskSpace size = (DiskSpace) super.data(c); if (size != null && size.size < getThresholdBytes()) { size.setTriggered(true); if (getDescriptor().markOffline(c, size)) { LOGGER.warning(Messages.DiskSpaceMonitor_MarkedOffline(c.getName())); } } return size; } private static final Logger LOGGER = Logger.getLogger(AbstractDiskSpaceMonitor.class.getName());