Sign in or sign up before continuing. Don't have an account yet? Register now to get started.
Register now
Question: polling discard and reschedule
Hello. Context: We are investigating how to archive attributes from Sardana. It's one process and enabling polling for motors positions or states doesn't work good when we, for example, move motor - Sardana can't read motor state to check if it moves and just gives up. https://gitlab.com/sardana-org/sardana/-/issues/1431 I've been trying to figure out what's going on with the polling queue and polling thread and found some strange behavior. I made read_attr function to sleep for 100 ms and set polling to 50 ms for 3 devices in the same instance, to be sure that all pollings are late (I'm messing it up on purpose, not a real scenario). I noticed that some devices are discarded more often than another and their values are not updated as frequent. Here are polling statuses from these 3 devices, copied from Jive: <details> <summary>Polling statuses from devices 1, 2, 3 (not from the same timestamp, just example)</summary> ``` Polled attribute name = Position Polling period (mS) = 50 Polling ring buffer depth = 10 Time needed for the last attribute reading (mS) = 100.702 Data not updated since 22 mS Delta between last records (in mS) = 100, 100, 100, 2516 Polled attribute name = Position Polling period (mS) = 50 Polling ring buffer depth = 10 Time needed for the last attribute reading (mS) = 100.665 Data not updated since 171 mS Delta between last records (in mS) = 36250, 7050, 43199, 12699 Polled attribute name = Position Polling period (mS) = 50 Polling ring buffer depth = 10 Time needed for the last attribute reading (mS) = 100.691 Data not updated since 86 mS Delta between last records (in mS) = 100, 100, 5133, 100 ``` </details> When I measure how long it takes to actually read the attribute - it is ~100 ms, but for device 2 it happens once per many reads for devices 1 and 3. <details> <summary>timeit output for read_attr position. Warning! a lot of lines</summary> ``` [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100390 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100370 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100421 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100411 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100395 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100402 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100394 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/2), WAttribute(Position)), kwargs={} took 0.105919 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.101870 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100368 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100367 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100388 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100385 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100414 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100367 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100359 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100409 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100403 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100387 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100384 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100361 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100370 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100386 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100371 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100403 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100396 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100407 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100480 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100423 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100357 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100384 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100428 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100360 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100368 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100371 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100383 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100362 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100389 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100378 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100397 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100430 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100372 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100406 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100371 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100396 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100401 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100375 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100377 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100380 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100391 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100432 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100411 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100368 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100395 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100377 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100409 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100419 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100393 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100401 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100390 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100389 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100374 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100435 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100385 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100385 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100378 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100382 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100375 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100379 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100385 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100381 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100371 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100392 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100437 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100412 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100410 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100388 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100384 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100374 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100354 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100384 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100457 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100430 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100381 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100385 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100389 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100377 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100386 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100387 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100361 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100377 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100409 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100369 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100360 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100386 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100369 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100377 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100370 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100380 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100379 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100366 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100410 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100408 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100372 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100363 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100392 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100389 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100436 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100419 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100371 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100405 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100368 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100387 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100376 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100365 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100359 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100384 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100366 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100356 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100358 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100365 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100417 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100382 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100365 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100405 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100409 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100419 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100418 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100380 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100399 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100391 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100450 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100432 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100383 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100378 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100369 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100389 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100386 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100376 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100395 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100430 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100394 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100415 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100382 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100434 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100436 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100392 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100377 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100392 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.100385 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/2), WAttribute(Position)), kwargs={} took 0.100409 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100373 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100377 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100368 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100386 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.100371 seconds ``` </details> And it's the same for simple Tango devices, Sardana is just an example here. I've tried to figure out how the polled objects are discarded and it looks like it [removes 1st element in the list of late objects](https://gitlab.com/tango-controls/cppTango/-/blob/main/src/server/pollthread.cpp#L1369) But for some reason discarded element is almost always the device №2? Is it because of how the "work list" is filled when all attributes have the same polling period? In the case of Sardana we can have dozens of motors with Position attribute that we want to archive. I've changed polling to 40, 50 and 60 ms and it looks a bit better - it's still late (up to 5 seconds), but now it happens for all 3 devices. When I change in DServer `polling_threads_pool_size` to 3 and configure one device per thread, read_attr output looks like this: <details> <summary>3 polling threads read_attr output</summary> ``` [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.301517 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/2), WAttribute(Position)), kwargs={} took 0.301624 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.301418 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.301710 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/2), WAttribute(Position)), kwargs={} took 0.301581 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.301557 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.301401 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/2), WAttribute(Position)), kwargs={} took 0.301571 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/1), WAttribute(Position)), kwargs={} took 0.301329 seconds [read_Position] args=(Motor(motor/dmiego_motctrl/3), WAttribute(Position)), kwargs={} took 0.301535 seconds ``` </details> I suppose it's because we have GIL in PyTango and threads wait for others to finish, so it's 2x waiting time + 1x read_attr time. But at least they are polled with the same delay every time. To summarize: - Wording is confusing in the code, quite difficult to follow the logic. [item](https://gitlab.com/tango-controls/cppTango/-/blob/main/src/server/pollthread.cpp#L1291) == [object](https://gitlab.com/tango-controls/cppTango/-/blob/main/src/server/pollthread.cpp#L1457) == [element](https://gitlab.com/tango-controls/cppTango/-/blob/main/src/server/pollthread.cpp#L1369)? - Why only one device is discriminated if they have the same polling period? - It must be rescheduled, but it doesn't happen. How does it work? - Should we have different polling period for attributes to be sure that they are polled even if they are late? It's just a hypothetical situation, it shouldn't be like this - polling should be tuned or device rewritten.
issue