Idea #18266
Come up with concept of failure to fulfill request
0%
Description
In Idea #18210, Kurt makes the point that there should be a warning or error in CommandableFragmentGenerator::applyReqeusts
when a request isn't fulfilled after a predetermined amount of time for a fragment generator running in window request mode: "I believe that the comparison that should be used when checking if it has been "too long" since a request has been fulfilled is between "now" and the time of the fragment request from the event builder".
To do this, we need a concept of what it means to fail to satisfy a request which has been received by the boardreader. In artdaq v2_03_03, the logic of applyRequests
is such that if we have a request whose sequence ID matches CommandableFragmentGenerator::ev_counter()
, we take all data fragments whose timestamps lie within the time window of the request, put them in a container fragment, and send the container fragment downstream. However, if there aren't any data fragments, that's not considered to be a problem - the container fragment is sent downstream without containing any fragments, and no warning is printed. One idea would be to require that there be at least one data fragment which lies in the time window of a request in order for the request to be considered satisfied - but there are other requirements we could put in place as well. Hopefully this gets some discussion started...
Related issues
History
#1 Updated by John Freeman about 3 years ago
- Related to Idea #18210: Non-pathological low request rate results in error message added
#2 Updated by Kurt Biery about 3 years ago
I took a look at CommandableFragmentGenerator::applyRequests, and I can't figure out how the following section of code determines that a request has been missed.
if (mode_ RequestMode::Buffer || static_cast<size_t>(std::chrono::duration_cast<std::chrono:\
:microseconds>(std::chrono::steady_clock::now() - last_window_send_time_).count()) > missing_request_window_timeout_us_\
)
{
if (mode_ RequestMode::Window)
{
TLOG_ERROR("CommandableFragmentGenerator") << "Data-taking has paused for " << \
std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::steady_clock::now() - last_window_send_time_).count(\
) << " us "
<< "(> " << std::to_string(missing_request_window_timeout_us_) << " us)\
while waiting for missing data request messages." << " Sending Empty Fragments for missing requests!" << TLOG_ENDL;
} // else, Buffer mode, where it only makes sense to send for the last request
sendEmptyFragments(frags);
}
#3 Updated by Eric Flumerfelt about 1 year ago
- Status changed from New to Closed
Since this issue was opened, error messages have been added in addition to much more flexibility in CommandableFragmentGenerator's request processing logic. Closing.