[ome-devel] API call can crash server 5.1.4

Michel Nederlof nederlofontheroad at mac.com
Mon Feb 15 11:04:40 GMT 2016


Hi Josh,

Thanks for following up on that. Things start making more sense with that explanation.

Off to try your suggestions now…

Best,

Michel
> On Feb 15, 2016, at 2:01 AM, Josh Moore <josh at glencoesoftware.com> wrote:
> 
> On Fri, Feb 12, 2016 at 8:56 PM, Damir Sudar <dsudar at lbl.gov> wrote:
>> Hi all,
> 
> Hi Damir,
> 
> some explanation on what's happening below to go along with Ola's
> query suggestions:
> 
> 
>> An excerpt of the code that causes the crash is here:
>> 
>> const std::string orphanedImagesQueryString =
>>    "select img from Image as img "
>>    "left outer join fetch img.datasetLinks as idl "
>>    "left outer join fetch idl.parent as dst "
>>    "left outer join fetch img.fileset as fs "
>>    "join fetch fs.usedFiles as uf "
>>    "join fetch uf.originalFile as of "
>>    "join fetch img.pixels as pxl "
>>    "join fetch pxl.pixelsType as pxt ";
>> //  "where dst.id is null";
> 
> Without the where clause, this amounts to loading every image in the
> database, which for a database with any series size can be harmful.
> 
> 
>> omero::sys::ParametersIPtr dsParams = new omero::sys::ParametersI();
>> dsParams->addLong("id", omero::rtypes::rlong(803));
>> auto imageObjects = query->findAllByQuery(orphanedImagesQueryString,
>> dsParams);
>> for (auto image : omero::cast<omero::model::ImagePtr>(imageObjects)) {
>>    std::cout << "i: "  << image->getId()->getValue() << " " <<
>> image->getName()->getValue() << "\n";
>> }
> 
> To prevent this type of overloading, you can and should enable paging
> for queries:
> 
> https://github.com/openmicroscopy/openmicroscopy/blob/v5.2.1/components/tools/OmeroCpp/test/unit/parameters.cpp#L72
> 
> If you want to know how many pages there are, you can start off with a
> "select count(img)"-style query. For this to work, you'll likely need
> to add in an order clause, and potentially a distinct, depending on
> the query. e.g.
> 
>  select distinct img from Image as img
>  left outer join ...
>  order by img.id desc
> 
> 
>> I'm not sure, but as I understand, the crash occured when I commented "where
>> dst.id is null" condition. The query with "where dst.id is null" didn't
>> return result and I tried to remove the  "is null" condition - to see what
>> would happen. And the server crashed.
> 
> Without the logs, it's hard to know which components had issues, but
> at least one of them will have had memory issues and potentially your
> sessions timed out due to other components hanging.
> 
> ~Josh
> 
> 
>> It appears that the server crashed when we tried to query images without
>> parent dataset ("orphaned images”). I.e. something related to handling a
>> situation where a parent pointer is NULL.
>> 
>> - Damir



More information about the ome-devel mailing list