I recently completed a fun journey triaging a set of self-inflicted wounds around Sitecore Commerce Staging. The rest of Sitecore Commerce 8.2.1 ran as expected except for when I setup the Sitecore Commerce Staging between a CM and CD tier . . . I would get an odd “The system cannot find the file specified” dialog box immediately after trying to start a basic Staging replication project:
And when I say that pop-up appears immediately after clicking the “Start Replication” button, I mean it — we’re talking almost instantaneously.
I’ll pause here just to lay out why one cares about Commerce Server Staging with Sitecore. The Commerce Staging documentation is on MSDN in a variety of places, and Sitecore is using this sub-system to manage Commerce specific content promotion (such as product catalog changes, promotion codes, etc). As explained in the summary on CommerceSDN.Sitecore.net :
The role of Commerce Server Staging is to move Commerce Server data between environments or sites.
If the master and web environments are pointing to the same Commerce Server site instance, as soon as data is changed on the master environment, it will be published to web. To ensure that Commerce Server data is not published unexpectedly, it is strongly recommended that you have one Commerce Server site for your Content Management (CM) environment, a separate Commerce Server site for your Content Delivery (CD) environment, and then use Commerce Server [Staging] to move the data.
I added the [Staging] to the final sentence above, as I think it’s pretty key to understanding the topic.
Commerce Server Staging is the vehicle one uses to manage Commerce data the same way we manage marketing data in the rest of Sitecore. We create and update Sitecore CMS content in a “master” SQL Server database and then promote it to “web” with a Sitecore Publish operation . . . then we create and update Sitecore commerce content via the Sitecore CM and promote changes to the live website via Sitecore Staging operations. The Sitecore Publish process has been extended with Sitecore Commerce to include Staging, so you can run it as a single integrated process. Note the “Commerce Server Staging” checkbox included in the Sitecore Publish dialog below:
It’s usually magic and just works — but I was not able to run any type of Commerce Staging operation, so I needed to peel back the curtain and learn a bit more about how to troubleshoot Commerce Staging.
This write-up on Monitoring Commerce Staging laid the foundation for my eventual resolution. Before exploring that angle, however, I reviewed this write-up with some basic pitfalls on Commerce Staging . . . of course there’s this gem about DCOM permissions (& my write-up on applying that setting when the GUID isn’t readily available) . . . Sitecore’s KB site has some suggestions and the Community.Sitecore.net has some suggestions. There are hundreds of nooks and crannies one can investigate here, so it took me some time to discover what was going on. Hopefully, my adventure can inform others, so here goes . . .
- The link about monitoring Commerce Staging (https://msdn.microsoft.com/en-us/library/ms961837(v=cs.70).aspx) talks about ways to configure what is logged and how to view the events of the Staging process. I digested this info and, while the write-up assumes some old IIS configurations, I discovered the C:\Program Files (x86)\Commerce Server 11\Staging directory has two folders of particular interest to me: Data and Events. The Events folder has .mdb and .ldb files (yes, that’s Microsoft Access) that form a type of localized Event Log for Commerce Staging; the Data folder has a StagingLog.sdf file — .sdf is a format used by SQL Server Compact Edition
- I opened the Access database and found that it didn’t have any helpful information for my scenario. My “cannot find the file specified” exception was not in evidence there . . . but there is some interesting meta-data captured in that Access MDB for Staging. This Events folder appeared to be a dead-end.
- I used LinqPad to analyze the StagingLog.sdf file (turns out Commerce Staging uses SQL CE 3.5 edition), and I learned two key things:
- This StagingLog.sdf file was essentially empty — no data was being written to it when I tried to start a Commerce Staging operation
- I couldn’t use LINQPad on the server running Commerce Staging as I didn’t have the proper SQL CE 3.5 drivers, but when I moved it to my developer machine I could view the .sdf file without issue. Interesting . . .
- My next step was to use ProcMon (available at https://docs.microsoft.com/en-us/sysinternals/downloads/procmon) and compare a process capture from my environment that raised the exception with a properly functioning Commerce Staging environment. This took some trial and error, but filtering on the CSSsrv.exe helped me focus on the task at hand.
- The properly functioning Staging environment had a lot of activity with the StagingLog.sdf file. We’re talking hundreds of operations. The broken Staging environment had none. Once I tracked ProcMon instruction sets 1:1 between the two environments I found the final piece of evidence I needed:
The highlighted area above, C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v3.5\sqlceer35EN.dll entries, were entirely missing from the initialization process of my broken Commerce Staging environment.
The lightbulbs finally went off for me, and I did a quick comparison of the C:\Program Files (x86) directories of the two servers. There were key components missing from the environment where Staging wasn’t working, and it revolved around SQL Server Compact Edition. Here’s a highlight showing what obviously wasn’t on the server in question:
Neither MS SQL Server Compact Edition nor MS Synchronization Services were installed to this server. I did some further research, and learned that the CommerceServer.exe should fold in these elements with any Commerce install, so I needed to do a repair installation with the CommerceServer.exe and that added SQL Server CE and other dependencies necessary to solve the issue.
Our PowerShell that installs the CommerceServer.exe must not have been using a properly elevated account, or this was done with a manual execution of the installer that didn’t use the proper administrative credentials. Everything worked fine after I completed the repair install of Commerce Server.
There are some additional items to point out here:
- Based on my testing, the CommerceServer.exe may exclude some key Staging dependencies if it’s not run in a proper Administrator context. I thought it was written in the docs somewhere, but I don’t see it in Sitecore’s documentation on installing Commerce Server .exe — running that EXE in the context of a local admin account is crucial to the success of that process. I use this account and the shift + right-click -> Run as different user” option when launching the CommerceServer.exe manually, and this has been successful for me.
- If you’re like me, and love the post-script to a good story, here’s what LINQPad shows for that StagingLog.sdf once you’ve run a couple successful Staging operations:
- I think additional take aways from this write-up are:
- there’s an MS Access database in C:\Program Files (x86)\Commerce Server 11\Staging\Events that could be a source of interesting diagnostic info on your Sitecore Commerce Staging activities
- there’s an SQL CE database in C:\Program Files (x86)\Commerce Server 11\Staging\Data that could be a source of interesting diagnostic info on your Sitecore Commerce Staging activities