Known issues in Content Delivery

The following list describes issues that are known to exist in Content Delivery.

Quick installation script mentions wrong Content Deployer folder names
The Content Delivery quick installation scripts mentions the following folders:
  • deployer
  • deployer-worker
  • deployer-combined
But to ensure a correct installation of the Content Deployer role, you should modify them as follows, respectively:
  • deployer-sites
  • deployer-sites-worker
  • deployer-sites-combined
All Content Delivery microservices contain Add-on service client even when they don't use the Add-on service
Currently, all microservices contain an Add-on service client, while only Content Deployer and the (Session-enabled) Content Service can have Extensions. This has the following consequences:
  • If the addonserviceurl environment variable is set on its machine, a microservice will send heartbeats to the Add-on service, even when it doesn't use the Add-on service.
  • A microservice fails to start if the addonserviceurl environment variable is set on its machine, while at the same time, the Add-on service is not up and running --regardless of whether the microservice actually uses the Add-on service.
After loading an Add-on, affected microservices must be restarted

After uploading an Add-on containing Extensions to Content Delivery microservices, you must restart each microservice that has been extended in order for the Extension or Extensions to take effect.

No status is reported if the same Extension is loaded twice from two different Add-on packages

If you upload two Add-ons, both of which contain the same Extensions to a Content Delivery microservice, the microservice does not report a problem, even if in fact, the two Extensions cause a conflict.

Requests for non-published items still require a database roundtrip, possibly impacting performance

In certain scenarios, a query for an item that was never published (for example, as part of trying to resolve a hyperlink) results in a request to the database. The item being requested is what is called a "null value." Previously, such a query for a null value would be resolved by the cache. But now, such a query always results in a (fruitless) database roundtrip, which has the potential of impacting performance.

If multiple base URLs were specified when configuring a Content Delivery environment in Topology Manager, Content Delivery queries return a random base URL

In Topology Manager, the Add-TtmWebsite script for configuring a website allows you to specify a list of one or more base URLs for the website. Specifying multiple base URLs can be useful if visitors access your website using multiple base URLs, say, by the site's IP address or by a hostname.

However, with the website configured this way, a Content Delivery query return a URL that randomly uses one of the base URLs specified. For example, imagine that you have set the BaseUrls property of the Add-TtmWebsite command to "http://myhost:84/", "http://122.3.4.5/", and that your website runs the following query to get an image called example.jpg:
{
  tcm_binary: link(namespaceId: 1, publicationId: 5, itemId: 258, type: BINARY) {
    url
  }
}
The response to this query would now randomly be one of the following:
http://myhost:84/example.jpg
or
http://122.3.4.5/example.jpg

To prevent this from happening, set BaseUrls to a single value when you run the Add-TtmWebsite script.

Specifying multiple targets for UGC in Topology Manager does not work

In Topology Manager, you can add UGC to a Publication mapping by including the ExtensionProperties switch in your Set-TtmMapping command, in which you specify a value for the UGCTargetName property.

All UGC Capabilities need to reference one single target. It is not possible to configure multiple UGC targets, especially if you use multiple UGC databases.

Content API filtering on custom metadata does not work if the metadata keys or values contain non-Latin characters
Here is an example of a GraphQL Content API query that does not return proper results, but instead returns null:
{
  publications(namespaceId: 2, filter: {value: "conditionset.generated.value={\"Пример1\":[\"Вибірка 3\"],\"مثال\":[\"متغير2\"]}", valueType: STRING, queryType: CUSTOM_META}) {
    edges {
      cursor
      node {
        publicationId
        itemType
      }
    }
  }
}
Content API filtering on a Float format returns null
Here is an example of a GraphQL Content API query that does not return proper results, but instead returns null:
{
  publications(namespaceId: 2, filter: {value: "ishlogicalref.object.id=1312760.0", valueType: FLOAT, queryType: CUSTOM_META}) {
    edges {
      cursor
      node {
        publicationId
        itemType
      }
    }
  }
}
Content Service throws null pointer exception in response to a query with a non-existent URL
When using the dynamic metadata API to get back Page metadata for a URL that does not exist, the Content Service throws a null pointer exception, rather than a friendly and informative error message.
.NET method Uri.EscapeDataString(urlString) has changed behavior
Version 4.0 or older of the Microsoft .NET Framework is not supported. This may have an effect on how your URLs are parsed if they contain brackets:
  • In .NET 4.0 and older, characters that are reserved in RFC 2396 are escaped. RFC 2396 allows brackets.
  • In .NET 4.5 and newer, characters that are restricted in RFC 3986 are escaped. RFC 3986 restricts brackets.
This change is related to the enabling of IRIs (Internationalized Resource Identifiers). For more information, refer to this page on the MSDN Web site: https://msdn.microsoft.com/en-us/library/system.uri%28v=vs.110%29.aspx
To quickly see the difference in behavior, run the following code, targeting first .NET 4.0 and then .NET 4.6.2:
string url= @"http://some.url/page (bracketed).html";
Console.WriteLine(url);
Console.WriteLine(Uri.EscapeDataString(url));
The complete list of characters that are restricted (that is, that will be encoded) as per RFC 3986 are:
: / ? # [ ] @ ! $ & ' ( ) * + , ; =
Publish transactions fail in a high-volume publishing scenario

If you are executing a high-volume publish, you might find that some publish actions fail.

This is due to incidental conflicts that occur when the Content Data Store database is updated. Content Delivery has a fallback mechanism to deal with this problem: it retries the deployment of the content for up to 10 times. But if the number of conflicts is too high, this may not be enough.

If this happens, you have the following options:
  • You can set up your Content Deployer as a separate endpoint and worker, and set up multiple Content Deployer workers so that you can handle high-volume publishing.
  • If you want to limit yourself to a single Content Deployer worker, contact SDL Customer Support to obtain the latest hotfixes for SDL Tridion Sites 9.1, and go through the Troubleshooting section to learn how to fine-tune your Publisher and Content Deployer.
  • Finally, you can republish the content that failed.
Staged upgrades do not support OAuth in Web sites for which Preview is enabled

The Preview Service does not work with an Experience Manager fast track publishing service if OAuth is enabled. To work around this problem, disable OAuth on the servers until they can complete the upgrade by upgrading Content Manager as well.

-auto-register switch does not automatically register the Web Capability

If you start the Discovery Service using the -auto-register switch, the Web Capability (used for mapping Publications to Web applications) is not registered automatically. To work around this problem, use the Discovery Service registration tool to register this Capability by hand.

The Content Interaction Library cannot be used to render JSP or ASCX fragments

It is not possible to render dynamic component presentations based upon ASCX Web Controls or JSP Script fragments through the client-side Content Interaction Library. Instead customers should publish their content using the Render Engine Language (REL).

No Context Engine Server Controls in the Content Interaction Library

We do not provide Context Engine Server Controls that will run using the Content Interaction Library. To use expression evaluation, use REL tags instead.

Personalization and Profiling API not available in Content Interaction Library

The API is not available.

UGC .NET Web site extension required forwarding of Claims to be configured in an inconsistent location

The Java/JSP version of the UGC Web site extension expects its configuration of the forwarding of Claims to be in cd_ugc_conf.xml. But the .NET version of the same software component expects it in cd_ambient_conf.xml. This is inconsistent.

PageContentAssembler limitation

When you use this class, the file system page name must match the Page name in Content Manager. If not, Experience Manager cannot render correctly using the Context Interaction Database.

A Taxonomy Keyword with multiple parents can no longer retrieve its multiple parents

In the event that a Keyword in your Taxonomy has multiple parents, a call to primaryKeyword.getParentKeywords() used to be able to retrieve said parents. But this API call no longer works properly.

Some older versions of CIL require a hotfix to talk to the CIS included with SDL Tridion Sites 9.1

If you are using Content Interaction Libraries from before SDL Tridion Sites 9 to talk to the SDL Tridion Sites 9.1 Content Interaction Services (microservices), contact SDL Customer Support to obtain a hotfix.

Context Engine Cartridge: Expression cannot refer to property defined by another expression

If you define a property in your custom vocabulary (which means the property is defined by an expression), then you cannot refer to this property from another expression that defines another property in your custom vocabulary.

Aspect properties in Context Engine Cartridge Claims are of a different type than before
The following incorrect type changes for aspect properties have been detected:
PropertyOld typeNew type
taf:claim:context:browser:cssVersioncom.sdl.context.api.types.GenericVersioncom.google.gson.internal.LinkedTreeMap
taf:claim:context:browser:displayColorDepthjava.lang.Integerjava.lang.Double
taf:request:cookiesjava.util.collections$UnmodifiableMapcom.google.gson.internal.LinkedTreeMap
Context Engine Cartridge does not work in combination with Footprint functionality in Experience Manager

Because the Footprint functionality overrides an Ambient Data Framework Claim indicating browser model, but not the user agent Claim, unexpected behavior occurs. This is because the Context Engine Cartridge determines the value of its browser.model property on the user agent.

Names of Context Engine Cartridge aspects and aspect properties cannot be equal to CEL reserved words
The name of an aspect or aspect property cannot be equal to a reserved word in CEL. To work around this problem, give your aspect or aspect property a different name. Specifically, your aspect or aspect property cannot be one of the following:
  • or
  • and
  • eq
  • ne
  • lt
  • gt
  • le
  • ge
  • div
  • mod
  • not
  • null
  • true
  • false
  • new
  • var
  • return