I wrote a series of functions to create test scenarios in Pilot. There are numerous triggers, but in essense:
Epicor stores .rdls in 2 places in the current build, one in the usual database in the CustomReportStore table, which consists of a zip file in the “Content” field, containing the “reports\CustomReportStore...” folder structure and .rdl files.
A second copy is stored on the SSRS server, which is 1:many AppServer:SSRS server.
Epicor ran into scenarios where the CustomReportStore would be up-to-date but the report would not push to the SSRS server, so you would print an out of date “version” of the report vs. what you just updated/changed.
To fix this issue, Coinciding with the release of 2025.1, Epicor introduced sledgehammer code that always uploaded the .rdl file(s) to the ssrs server.
This introduces a process for every report print: → transfer zip to SSRS Server → unzip to file/folder structure → print
This then introduced concurrency issues from not properly checking if a file exists before opening a write handle to it and causing file io collisions.
This compounded with load issues from introducing a heckuvalotta unzip operations.
We all share an unknown number of SSRS Servers. I hope that it is nothing like the education servers, where there are hundreds of us on a single instance.
I think that about sums it up.
(of course, there is no transparency in this process, and that is the conclusion I have arrived at after much digging through code and creating test scenarios. In working with Epicor, one test was to throw more resources at our instance, and guess what worked…)
This is solvable on our side with the “Fire off a retry SysTasks until it works” Scheduled Task - but talk about a sledgehammer on top of a sledgehammer.
Epicor likely needs to re-architect that portion of the client/server communication occurring each print to optimize. Which explains the quite extended time…