Hi,
Actually, I create a job that sleeps for 30 seconds without concurrent
execution and start it. Once running it start it again. So there is
exactly one entry in the queue.
Now while the job is in the queue I click on the management link. And I
get different behaviour depending on OS it seems.
I also added output that sleeps for 2 seconds after starting the
Runnable and then print the queue size.
And it is always 1 as expected.
I have one idea:
Could this be a permission problem that behaves differently on Windows
and Linux?
Regards
Markus
On 05.02.2017 02:24, Oleg Nenashev wrote:
Hi,
I see no logic, which actually submits something to the queue. So I am
not sure what is the execution profile.
If you submit the a short task to the queue, the result is easy to
explain. Starting from 1.609.x, Jenkins Queue has a snapshoting
engine, which reduce the load on the queue and prevents interlocks
between queue maintenance logic and WebUI.
So methods 1, 4, and 5 effectively get snapshot reference, which they
use in their logic. Methods 3 and 4 work with the queue directly, so
they may be getting a renewed snapshot, where the queue task has
already exited the queue. Then it may easily have 0.
BR, Oleg
воскресенье, 5 февраля 2017 г., 1:19:24 UTC+1 пользователь Markus
Winter написал:
Hi,
I encounter a strange behaviour of the Queue object.
The following code is a simple POC for the problem I have.
import java.io.IOException;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.logging.Logger;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import hudson.Extension;
import hudson.model.ManagementLink;
import hudson.model.Queue;
import hudson.security.Permission;
import jenkins.model.Jenkins;
@Extension
public class ManagedLink extends ManagementLink
{
private static final Logger logger =
Logger.getLogger(ManagedLink.class.getName());
private static ManagedLink instance;
Queue.Item[] items = null;
Queue queue;
private static final String URL = "samplelink";
private static final String ICON = "system-log-out.png";
public static ManagedLink getInstance()
{
List<ManagementLink> list =
Jenkins.getInstance().getManagementLinks();
for (ManagementLink link : list)
{
if (link instanceof ManagedLink)
{
instance = (ManagedLink)link;
break;
}
}
return instance;
}
@Override
public String getIconFileName()
{
return ICON;
}
@Override
public String getDisplayName()
{
return "ManagedLink";
}
@Override
public String getUrlName()
{
return URL;
}
@Override
public String getDescription()
{
return "Demo For Problem";
}
@Override
public Permission getRequiredPermission() {
return Jenkins.ADMINISTER;
}
Queue.Item[] getQueueItems()
{
if (items == null)
{
items = Queue.getInstance().getItems();
}
return items;
}
public synchronized void doIndex(StaplerRequest req,
StaplerResponse rsp) throws IOException
{
Jenkins.getInstance().checkPermission(getRequiredPermission());
items = Queue.getInstance().getItems();
logger.info <http://logger.info>("Queue length in doIndex: " +
items.length);
queue = Queue.getInstance();
ExecutorService service = Executors.newSingleThreadExecutor();
service.submit(new MyRunner());
rsp.sendRedirect2(req.getContextPath() + "/manage");
}
class MyRunner implements Runnable
{
@Override
public void run()
{
logger.info <http://logger.info>("Queue length in Runnable from
queue object from doIndex: " + queue.getItems().length);
logger.info <http://logger.info>("Queue length in Runnable with
direct access to Queue: "
+ Queue.getInstance().getItems().length);
logger.info <http://logger.info>("Queue length in Runnable with
instance variable direct access : " + items.length);
logger.info <http://logger.info>("Queue length in Runnable with
instance variable via method : "
+
ManagedLink.getInstance().getQueueItems().length);
}
}
}
Running this code in Jenkins on Windows, when there are entries in
the queue, I get the expected length.
But when I run this code inside my Linux VM, the Queue object is
returning 0 for the length:
Feb 05, 2017 12:16:02 AM INFO ManagedLink doIndex
Queue length in doIndex: 1
Feb 05, 2017 12:16:02 AM INFO ManagedLink$MyRunner run
Queue length in Runnable from queue object from doIndex: 0
Feb 05, 2017 12:16:02 AM INFO ManagedLink$MyRunner run
Queue length in Runnable with direct access to Queue: 0
Feb 05, 2017 12:16:02 AM INFO ManagedLink$MyRunner run
Queue length in Runnable with instance variable direct access : 1
Feb 05, 2017 12:16:02 AM INFO ManagedLink$MyRunner run
Queue length in Runnable with instance variable via method : 1
Strange thing is as well that when I run unit tests on Linux, it
works fine.
This happens on latest 2.32.2 Jenkins with openjdk 8 on Opensuse
but I can also observe this with a 1.609.3 Jenkins running with
SAP JDK8
On Windows running with the JDK that comes with the Jenkins
installer (java 8).
Anyone has an idea what could be the reason for this?
Regards
Markus
--
You received this message because you are subscribed to the Google Groups "Jenkins
Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to jenkinsci-dev+unsubscr...@googlegroups.com.
To view this discussion on the web visit
https://groups.google.com/d/msgid/jenkinsci-dev/063c2825-17f3-fd5c-9e07-43d59da136a8%40gmx.de.
For more options, visit https://groups.google.com/d/optout.