This article describes a hotfix rollup package for Sitecore Experience Commerce (XC) 9.3 Initial Release. This hotfix rollup contains all the public hotfixes released for Sitecore XC 9.3.0 up to November 19, 2020 [1], inclusively. A detailed list of hotfixes included in the package is provided at the end of this article.
Customers must apply this hotfix rollup package before installing any Sitecore XC 9.3.0 hotfixes published after November 19, 2020 [1].
The Sitecore Experience Commerce 9.3.0 hotfix rollup package is available for download here:
SC Hotfix 439942-3 Sitecore Commerce 9.3 Hotfix Rollup Package.zip
Sitecore platform hotfix SC Hotfix 436551-1.zip must be applied before installing the hotfix rollup package for Sitecore XC 9.3.0.
Update Commerce Engine databases
- Run the SQL script 439942-stored-procedure-update.sql to update the engine Global and Shared databases.
Update and recompile the Commerce Engine
Note: You must recompile your Commerce Engine even if it was not previously customized.
- In the Sitecore.Commerce.Engine.SDK, open the Customer.Sample.Solution.
- Open the Sitecore.Commerce.Engine project, and replace all references to Commerce plugin NuGet packages with the ones provided in the rollup package. A complete list of updated NuGet plugin packages is available at the end of this document.
- Repeat the steps above for all custom plugins that have dependencies on Commerce NuGet packages.
- Update the Startup.cs file. If you have not made any changes to your Startup.cs file, replace it with the file included in the rollup package.
If you have customized your Startup.cs file, merge the changes to ensure that your customized Startup.cs file includes the latest updates.
The following are some examples of changes contained in the Startup.cs:
- New using statements.
- Changes in the ConfigureServices(IServiceCollection services) method (around line 238), where Sitecore().Caching is configured.
- New private method to the class private static void AddTransientFaultHandling(IServiceCollection services).
- New call to the method in the ConfigureServices(IServiceCollection services) method.
- Added monitoring of Redis connection behavior in the ConfigureServices(IServiceCollection services) method by replacing:
if (redisCacheSettings.Enabled)
{
_nodeContext.IsRedisCachingEnabled = true;
config
.AddRedisStore(redisCacheSettings.CacheStoreName, redisCacheSettings.Options.Configuration, redisCacheSettings.Options.InstanceName)
.ConfigureCaches(WildcardMatch.All(), redisCacheSettings.CacheStoreName);
}
with the code from the attached codesample.cs file. Note that [Product ID from Shared database] should be replaced with a real ID of any of your products.
- Update the Global.json file by merging the changes from the sample Global.json files (OnPrem and Cloud versions) included in this package.
- The new Sitecore.Commerce.Plugin.Content.DefaultContentPathsPolicy and EntityShardingPolicy were added to the Global.json file of Commerce Engine services bootstrap folder.
- Update the PlugIn.Search.PolicySet-1.0.0.json file to add the following new SearchPolicy:
{
"$type": "Sitecore.Commerce.Plugin.Search.SearchPolicy, Sitecore.Commerce.Plugin.Search",
"MaxNumberOfRows": 1000000,
"IndexBatchSize": 1000,
"DeleteBatchSize": 50,
"ConcurrentIndexingOperations": 1
}
- Update the config.json file by merging the latest config.json with your customized config.json file. The Caching.Redis section contains the following new properties:
"IntervalBetweenConnectionAttemptsInSeconds": 60,
"RedisConnectionPoolSize": 1,
"RedisCompressionEnabled": true,
Note: As per Redis recommendation, RedisConnectionPoolSize = number of cores / 2. For example, for a 16-core machine, this is set to "RedisConnectionPoolSize"= 8.
However, under sufficiently heavy loads it may be necessary to increase the RedisConnectionPoolSize value.
- Rebuild and republish the solution.
- In the build output, make sure the StackExchange.Redis.dll binary is downloaded with version 2.1.58.
- In IIS Manager, restart the Commerce Engine services.
- Bootstrap the environment.
- Flush the Redis cache.
- Synchronize content. In Postman, open the SitecoreCommerce_DevOps|3 Environment Initialize folder and run the Ensure\Sync default content paths with the following command arguments:
- Replace {{ShopName}} with the name of your shop (for example, "Storefront" or "CommerceEngineDefaultStorefront")
- Replace {{Environment}} with "GlobalEnvironment"
Note: This command can only be run once for each environment. If you need to re-synchronize content, run the "Sync content path" request to synchronize all content items.
After completing the steps above, the Commerce Control Panel items must be synchronized into [ContentEntities] and [ContentEntity] tables of both SitecoreCommerce9_Global and SitecoreCommerce9_SharedEnvironments databases.
- Flush the Redis cache.
- In IIS Manager, restart the Commerce Engine services.
Update to the Commerce Engine Connect, Storefront and Connect core (inside Sitecore XC):
- In the hotfix rollup package, in the Binaries\Sitecore_CDCM\bin folder, copy the following binaries (.DLLs) to your CD and CM bin folder:
- Sitecore.Commerce.Engine.Connect.dll
- Sitecore.Commerce.ExperienceProfile.dll
- Sitecore.Commerce.Connect.Core.dll
- Sitecore.Commerce.XA.*.dll
- Sitecore.framework.*.dll
- Sitecore.Commerce.Engine.Connect.Caching.dll
- The config_source_files/Sitecore/App_Config/Include/Y.Commerce.Engine folder contains a new version of the following files:
- Sitecore.Commerce.Engine.Connectors.Inventory.config
- Sitecore.Commerce.Engine.Connect.config
The Sitecore.Commerce.Engine.Connect.config file contains the following changes:
- Three new properties are added to the \configuration\sitecore\commerceCachingConfiguration\cachingSettings\redissection:
- <intervalBetweenConnectionAttemptsInSeconds>60</intervalBetweenConnectionAttemptsInSeconds>
- <redisConnectionPoolSize>1</redisConnectionPoolSize>
- <redisCompressionEnabled>true</redisCompressionEnabled>
Note: As per Redis recommendation, RedisConnectionPoolSize = number of cores / 2. For example, for a 16-core machine, this is set to "RedisConnectionPoolSize"= 8.
However, under sufficiently heavy loads it may be necessary to increase the RedisConnectionPoolSize value.
- A new property is added to the section:
- <fullCacheRefreshThreshold>20</fullCacheRefreshThreshold>
Note: Change the default value to an appropriate value for your deployment.
If you have not customized the files in your deployment, replace them with the new ones provided. Otherwise, compare your custom version of the file with the new version provided and merge the changes.
- The config_source_files/Sitecore/App_Config/Include/Foundation/Commerce/ folder contains a new version of the Sitecore.Commerce.XA.Foundation.Connect.config file. If you have not customized this in your deployment, replace it with the new one provided. Otherwise, compare your custom version of the file with the new version provided and merge the changes.
New stored procedures for SelectListEntities
The original stored procedure SelectListEntities is now separated into the following two distinct stored procedures:
- SelectListEntitiesByRange
- SelectListEntitiesByRangeWithoutVersioning (This procedure does not take versioning into consideration and performs better).
The Commerce Engine decides which stored procedure to call based on the entity type passed in the IFindEntitiesInListPipeline pipeline. If versioning is enabled for that entity type, or if the type is CommerceEntity, then the SelectListEntitiesByRangestored procedure is called. Otherwise, the SelectListEntitiesByRangeWithoutVersioning stored procedure is called. It is important to pass a concrete entity type if you want to take advantage of the optimized performance that the SelectListEntitiesByRangeWithoutVersioning provides.
The SelectListEntitiesByRangeWithoutVersioning query always returns entity version 1.
The SelectListEntitiesByRange behaves the same. Depending on the environment, it returns the latest published entity version or the latest entity version.
In addition, the following two new stored procedures are added:
- SelectAllListEntities
- SelectAllListEntitiesWithoutVersioning
When pagination is not used, these new stored procedures take all entities included in a list, providing better performance by avoiding expensive operations such as "order by".
New Sitecore.Commerce.Plugin.Search.SearchPolicypolicy
The Sitecore.Commerce.Plugin.Search.SearchPolicypolicy provides the following common settings to use across multiple search providers:
- MaxNumberOfRows defines the maximum number of documents that are retrieved from the index when no amount has been specified.
- IndexBatchSize splits up the result into smaller batches.
This becomes very useful during the item indexing where the minion processes 1000 entities at a time by default. That number is then multiplied by the number of languages in the system and results in potentially long-running and expensive calls to Azure Search. Decreasing the batch size slices up the original result set before submitting it to the search index.
- DeleteBatchSize is currently used specifically during the incremental item indexing where items are removed from the index before re-indexing them. Gives more granular control over the number of documents that are deleted in one batch to reduce the impact on the search service.
- ConcurrentIndexingOperations controls how many batches are indexed in parallel.
The default value is 1 as that is the equivalent to the current behavior, however, it can be increased if needed. The general recommendation is not to exceed the numbers of replicas in Commerce Engine Connect configurations (for example, under C: \inetpub\wwwroot\XP0.sc\App_Config\Include\Y.Commerce.Engine)
This hotfix rollup package contains the following patched files:
- SQL scripts (under "SQL_scripts" folder):
- 439942-stored-procedure-update.sql
- Sitecore CD/CM binaries (under "Binaries\Sitecore_CDCM" folder):
- Sitecore.Commerce.Engine.Connect.dll
- Sitecore.Commerce.Engine.Connect.Caching.dll
- Sitecore.Commerce.ExperienceProfile.dll
- Sitecore.Framework.Caching.*
- Sitecore.Framework.Common.MatchingOptions.dll
- Sitecore.Framework.Diagnostics.*.dll
- Sitecore.Commerce.Connect.Core.dll
- Sitecore.Commerce.XA.Feature.Account.dll
- Sitecore.Commerce.XA.Feature.Cart.dll
- Sitecore.Commerce.XA.Foundation.Connect.dll
- Sitecore.Commerce.XA.Foundation.Common.dll
- Sitecore.Commerce.XA.Foundation.Catalog.dll
- Commerce Engine (under "NugetPackages" folder):
- Sitecore.commerce.plugin.*.nupkg
- sitecore.commerce.provider.filesystem.5.0.25.nupkg
- Sitecore.Framework.*.nupkg
- Microsoft.Azure.Search.*.nupk
- Sitecore.commerce.engine.connect.caching.5.0.60.nupkg
- Sitecore.commerce.engine.connect.5.0.60.nupkg
- sitecore.commerce.core.5.0.51.nupkg
- Source and configuration files:
- Startup.cs
- Global.json
- config.json
- Sitecore.Commerce.Engine.Connectors.Inventory.config
- Sitecore.Commerce.XA.Foundation.Connect.config
- Sitecore.Commerce.Engine.Connect.config
- SC Hotfix 442332-1 CommerceConnectCore 14.0.29.zip
- Fix Error: SetPaymentMethods for an anonymous user on confirming the order if the same identifier/email already exists in Shards
- SC Hotfix SC Hotfix 442409-1 CommerceEngine.CEConnect.zip: More performance improvements
- Implement smart Redis connection pooling and compression
- Performance improvement on running SP SelectListEntitiesByRangeWithoutVersioning
- SC Hotfix 435769-1 CommerceEngine.zip
- SelectListEntitiesByRangeWithoutVersioning uses sorting of EntityVersion and causes performance degradation.
- SC Hotfix 435548-1 CommerceEngine.CEConnect.zip: Misc. performance related fixes
- Fix performance issues in Sitecore.Framework.Caching libraries and update new Redis drivers.
- Remove Context.Site.Name from CommercePublishCacheRefresh.
- Replace HttpClient with HttpWebRequest in CE Connect.
- Fix the problem of Commerce Connector is missing check in CheckTemplatesMapping() method.
- CE Connect: Speed up cache updates after incremental indexing completes.
- Fix the problem of Commerce engine cannot communicate after connection has been lost to Redis server.
- Add Redis connection retry in CE Connect.
- Introduction of CE connect Redis bulk access.
- Introduction of Redis connection pooling in Engine and CE Connect.
- SC Hotfix 434056-1 CommerceEngine 5.0.46.zip
- Cloned catalog/category is having ChildrenCategoryList from the master catalog instead of the cloned catalog.
- SC Hotfix 430776-1 CommerceEngineConnect 5.0.58.zip
- OrderDetails in ExperienceProfile shows empty CartLines if SXA Storefront is not installed.
- SC Hotfix 421385-1 Sitecore.Commerce.XA.Foundation.Common 4.0.126.zip
- ArgumentOutOfRangeException appears if to add the query parameter with no value
- SC Hotfix 421393-1 CommerceEngineConnect 5.0.57.zip
- SwitchOnRebuildSolrSearchIndex functionality not working with Solr.
- SC Hotfix 418775-418944-1 CommerceEngine 5.0.80.zip
- Performance degradation after upgrading Sitecore XC from 9.2.0 to 9.3.0 and installing Redis hotfix. Azure search latency.
- The poor performance of SelectListEntitiesByRange procedure with a big amount of the data.
- SC Hotfix 418773-1 Sitecore.Commerce.Experience.Accelerator.Scwdp.Content 4.0.125.zip
- Catalog & Cart controllers query SOLR/Azure services instead of taking the data from the cache thereby overloading search service.
- SC Hotfix 413145-1 CommerceEngine 5.0.22.zip
- Content Item is not retrieved from [ContentEntities] table, despite it exists. The request is sent to CM.
- SC Hotfix 412282-412582-1 CommerceEngine 5.0.78.zip
- Updated Redis client libraries to the latest one since the current one contains known performance issues.
- FindEntitiesPipeline and all other code need to use the Bulk get mechanism available in the new Redis library.
- SC Hotfix 410145-1 CommerceEngineConnect5.0.56.zip
- Threshold for cleaning all caches on indexing:completed event handler is not configurable.
- SC Hotfix 409753-1 CommerceEngine.zip
- The full path to the child entity in the index field handler is not calculated correctly if multiple versions of a parent entity exist.
- SC Hotfix 409668 Sitecore.Commerce.XA.Foundation.Common 4.0.124.zip
- VaryByUrlcomponent caching option overrides any other options.
- SC Hotfix 395228-1 Sitecore.Commerce.XA.Foundation.Connect 4.0.120.zip
- GetSellableItemSummary adds an extra slash to the request to Commerce Engine which breaks the ProductList page.
- SC Hotfix 393774-1 CommerceEngine 5.0.43.zip
- English properties values of promotion disappear after moving a promotion between workflow states Request Approval -> Reject.
- SC Hotfix 445593-1 CommerceEngineConnect 5.0.61.zip
- InitializeLanguages method of CommerceRepository class sets empty values to _languages collection and never updates it [1]
[1] The Sitecore.Commerce.Engine.Connect.dll in the rollup package has been updated to version 5.0.62. This version contains "SC Hotfix 445593-1 CommerceEngineConnect 5.0.61.zip" and a regression bug fix (453460)