Early adoption can be risky…

Later this week I’ve got the chance to do some training on the Coveo for Sitecore search solution. The invite to the training said that attendees need to bring a computer running an instance of the software to use during the class. So I’ve been spending a bit of time building up a virtual machine for this purpose, to get a handle on the install process for Coveo.

Being the enthusiastic type, I tried doing this installation on a machine running Visual Studio 2015 and .Net 4.6 – but it turns out this wasn’t a great idea.

Coveo’s website gives a good set of instructions for getting a basic install of their product up and running in a simple “everything on one server” configuration. I worked my way through this, and got to the “rebuild your indexes” point. Everything appeared to be working, except that the documentation’s description of what I should see in the Coveo Server Console didn’t match what I was seeing when I ran an index build. No entries saying “indexed” ever appeared in my log…

Firing up the Coveo Diagnostics, I found this:

Coveo Diagnostics

The underlying error from the REST Endpoint was:

System.Net.WebException: The remote server returned an error: (400) Bad Request.
   at System.Net.HttpWebRequest.GetResponse()
   at Coveo.SearchProvider.Applications.StateVerifier.<>c__DisplayClassd.<GetRestEndpointState>b__c()
   at Coveo.SearchProvider.Applications.BaseVerifier.VerifyComponent(Func`1 p_VerifyMethod, String p_ComponentName)

Digging into the Search API logs, I found the following exception:

00:01:17.837 [qtp1131040331-45] DEBUG c.c.search.api.http.SimpleHttpClient - Request to https://localhost:52810/7.0/CoveoSearchService executed in 23ms. Response status is 500.
00:01:17.839 [qtp1131040331-45] WARN  c.c.s.a.e.soap.v7.SoapSearchEndpoint - Error response 500 from server: <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:b="http://www.w3.org/2001/XMLSchema" xmlns:c="urn:CoveoSearchService"><s:Body><s:Fault><faultcode>s:Server</faultcode><faultstring><![CDATA[Exception Name:class Merlin::SecurityProviderOnErrorException, What:class Merlin::SecurityProviderOnErrorException: Security Provider "Sitecore Security Provider for WIN-LQTROHSDR5I-seven" failed to start: Unable to get the Blade description for Security Provider "Sitecore Security Provider for WIN-LQTROHSDR5I-seven": class CDFNodesHelper::NodeNotStartedException: Unable to create process "GetBladesDescriptionsNode Managed": "".]]></faultstring><detail><c:ExceptionBaseDetail xmlns="urn:CoveoSearchServiceSchema"><c:Inner><Name>class Merlin::SecurityProviderOnErrorException</Name><What><![CDATA[class Merlin::SecurityProviderOnErrorException: Security Provider "Sitecore Security Provider for WIN-LQTROHSDR5I-seven" failed to start: Unable to get the Blade description for Security Provider "Sitecore Security Provider for WIN-LQTROHSDR5I-seven": class CDFNodesHelper::NodeNotStartedException: Unable to create process "GetBladesDescriptionsNode Managed": "".]]></What></c:Inner></c:ExceptionBaseDetail></detail></s:Fault></s:Body></s:Envelope>
00:01:17.843 [qtp1131040331-45] WARN  c.c.s.a.r.search.RestSearchService - Query triggered server exception
com.coveo.search.api.endpoints.soap.ServerReturnedSoapFaultException: Call returned SOAP fault: class Merlin::SecurityProviderOnErrorException: Security Provider "Sitecore Security Provider for WIN-LQTROHSDR5I-seven" failed to start: Unable to get the Blade description for Security Provider "Sitecore Security Provider for WIN-LQTROHSDR5I-seven": class CDFNodesHelper::NodeNotStartedException: Unable to create process "GetBladesDescriptionsNode Managed": "".
	at com.coveo.search.api.endpoints.soap.v7.SoapSearchEndpoint$.trapErrors(SoapSearchEndpoint.scala:160) ~[coveo-search-api-server.jar:na]
	at com.coveo.search.api.endpoints.soap.v7.SoapSearchSession.executeQuery(SoapSearchSession.scala:80) ~[coveo-search-api-server.jar:na]
	at com.coveo.search.api.rest.search.RestSearchService$$anonfun$performQueryAndReturnJson$1.apply(RestSearchService.scala:49) ~[coveo-search-api-server.jar:na]
	at com.coveo.search.api.rest.search.RestSearchService$$anonfun$performQueryAndReturnJson$1.apply(RestSearchService.scala:36) ~[coveo-search-api-server.jar:na]
	at com.coveo.search.api.rest.search.RestSearchService.handleExceptions(RestSearchService.scala:895) [coveo-search-api-server.jar:na]
	at com.coveo.search.api.rest.search.RestSearchService.performQueryAndReturnJson(RestSearchService.scala:36) [coveo-search-api-server.jar:na]
	at com.coveo.search.api.rest.search.BaseSearchServlet$class.com$coveo$search$api$rest$search$BaseSearchServlet$$doExecuteQuery(BaseSearchServlet.scala:119) [coveo-search-api-server.jar:na]
	at com.coveo.search.api.rest.search.BaseSearchServlet$$anonfun$9.apply(BaseSearchServlet.scala:110) [coveo-search-api-server.jar:na]
	at com.coveo.search.api.rest.search.BaseSearchServlet$$anonfun$9.apply(BaseSearchServlet.scala:108) [coveo-search-api-server.jar:na]
	at org.scalatra.ScalatraBase$class.org$scalatra$ScalatraBase$$liftAction(ScalatraBase.scala:270) [coveo-search-api-server.jar:na]
	at org.scalatra.ScalatraBase$$anonfun$invoke$1.apply(ScalatraBase.scala:265) [coveo-search-api-server.jar:na]
	at org.scalatra.ScalatraBase$$anonfun$invoke$1.apply(ScalatraBase.scala:265) [coveo-search-api-server.jar:na]
	at org.scalatra.ApiFormats$class.withRouteMultiParams(ApiFormats.scala:178) [coveo-search-api-server.jar:na]
	at com.coveo.search.api.rest.search.SearchServlet.withRouteMultiParams(SearchServlet.scala:10) 

(Stack trace snipped – it went on for ages…)

Seeing as that mentioned security providers, I opened the Administration web page, and drilled down to the security provider settings. They showed:

Admin Provider

And clicking the Sitecore provider gave:

Admin Error

So not looking good…

I did a bit of googling for information about the ‘CDFNodesHelper::NodeNotStartedException: Unable to create process “GetBladesDescriptionsNode Managed”‘ messages and found a few posts on the Coveo developer sites which had similar error messages, but not seeming to be about the same issue. Generally the advice for fixing these was either “restart the Coveo service” (which didn’t work for me) or “talk to support”…

At this point (purely by coincidence) a post appeared in my RSS Reader discussing a bug in the .Net 4.6 runtime’s JIT optimiser, which can break some code. This made me wonder if my problem might be related to Coveo not supporting the latest version of the .Net Framework…

I tried searching Coveo’s docs for issues relating to the latest release of .Net, but didn’t find anything. However a quick tweet gave me reason to confirm my suspicions:

Thanks to J-F L'Heureux for clearing this up for me. Trying the Coveo install again on a base Virtual Machine which had Visual Studio 2013 Update 5 on it (And hence .Net 4.5) instead of 2015 gave me a working instance to start experimenting with.

And I can try 2015 again in October, hopefully…

Edited to add: It’s worth noting that I think this issue only affects the Coveo for Sitecore back-end search services. If you install the Coveo services on a server which is running .Net 4.5 then it should be happy, even if Sitecore itself is running on a server that has .Net 4.6 installed. (Though I have not explicitly tested this approach, since I was building an all-in-one virtual machine)

Advertisements

4 thoughts on “Early adoption can be risky…

  1. Yes, this happened in our case too. We upgraded our entire solution to 4.6 without verifying that Coveo would be affected. We are going to revert back our solution. Also, I might restore my VM to point before I installed VS2015

  2. Pingback: Coveo facets based on ID fields | Jeremy Davis

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s