While testing a Sitecore Commerce 8.1 deployment for a client, I ran into a problem during the final checkout process of submitting the cart. The order failed! The process was “dead” on its tracks!
And just like any other seasoned developer, my instinct quickly told me to cry out “...but it was working on my local machine!”. And after adequately defending my honor, I began looking at the crime scene for clues.
As expected, the front-end error was generic and too friendly, it was a dead-end. So we started looking at the Sitecore logs, we see our custom logging doing its job (aka our informant):
7616 17:25:14 ERROR EcommerceReviewController.Review(): Error Submitting Order, Main Error = Component Execution failed for component[0x0] hr: 0x0
Exception of type 'System.EnterpriseServices.TransactionProxyException' was thrown.
7616 17:25:14 ERROR
Server stack trace:
at CommerceServer.Core.Interop.PooledTxPipelineClass.Execute(Int32 lMode, Object pdispOrder, Object pdispContext, Int32 lFlags)
at CommerceServer.Core.Runtime.Orders.PipelineHelper.RunPipesHelper(String strPCF, String strPipelineProgId, IDictionary dictOrderForm, IDictionary pipeContext, String logfile)
at System.Runtime.Remoting.Messaging.Message.Dispatch(Object target)
at System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg)
Exception rethrown at :
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at CommerceServer.Core.Internal.Orders.MtsTxHelper.RunPipes(String strPCF, String strPipelineProgId, IDictionary dictOrderForm, IDictionary pipeContext, String logfile)
What does “Component Execution failed for component[0x0] hr: 0x0” mean?
What does “Commerce.RedeemPromoCodes” do?
Why are these messages so vague?! (I’m used to them by now)
Witness Statement #1 - Mr. Event Viewer:
“A caller has attempted to propagate a transaction to a remote system, but MSDTC network DTC access is currently disabled on machine XXX. Please review the MS DTC configuration settings.” (note: XXX on this one, pointed to the SQL Server machine)
Witness Statement #2 - Mr. Event Viewer:
Exception type: TransactionException Exception message: The partner transaction manager has disabled its support for remote/network transactions. (Exception from HRESULT: 0x8004D025). Stack trace: at System.Transactions.Oletx.OletxTransactionManager.ProxyException(COMException comException)
at System.Transactions.TransactionInterop.GetOletxTransactionFromTransmitterPropigationToken(Byte propagationToken)
at System.Transactions.TransactionStatePSPEOperation.PSPEPromote(InternalTransaction tx)
at System.Transactions.TransactionStateDelegatedBase.EnterState(InternalTransaction tx)
at System.Transactions.EnlistableStates.Promote(InternalTransaction tx)
at System.Transactions.TransactionInterop.ConvertToOletxTransaction(Transaction transaction)
Microsoft Distributed Transaction Coordinator (MS DTC) tried to reach the SQL Server machine to propagate a call but was rejected. This made the machine the primary suspect in the case. Our biggest lead yet.
Reinforcing this hunch, we found out that MS DTC for the Commerce Server machine was configured for network access but the SQL Server machine was not.
However, a contradicting statement from witness almost sank our lead. It was mentioned that another Sitecore Commerce setup has almost the same settings but was working, so it can’t be it! Not to mention, the settings being used for all involved machines were based on the official deployment manual.
But alas, we didn’t give up. We later learned of how all 3 servers (Web/Commerce Server/SQL) are all on different machines. Using the official deploying guide itself, we quickly found out that this type of distributed setup requires both Commerce Server and SQL Server machines to have their MS DTC configured for network access.
From the Official Sitecore Commerce 8.1 Deployment Guide:
If Commerce Server and SQL Server are running on different machines, each machine’s MS DTC should be configured to allow network access.
In the end, the SQL Server machine was configured to allow network access and everything ran smoothly.