Orleans error: Orleans.Storage.BadProviderConfigException: No storage providers found loading grain type
Next step in my journey into Orleans land, was using ‘Declarative Persistence’. Sometimes you want the state inside your actors(grains in Orleans terminology) being persisted in some kind of permanent storage, so that it can survive a silo shutdown. Orleans provides a simple declarative model that makes this possible.
Unfortunately while following the related tutorial, I got the following error message:
[2016-10-04 07:19:17.848 GMT 11 ERROR 103104 Catalog 127.0.0.1:11111] !!!!!!!!!! No storage providers found loading grain type Grains1.Manager
No storage providers found loading grain type Grains1.Manager
Exception = Orleans.Storage.BadProviderConfigException: No storage providers found loading grain type Grains1.Manager
at Orleans.Runtime.Catalog.SetupStorageProvider(ActivationData data)
at Orleans.Runtime.Catalog.CreateGrainInstance(String grainTypeName, ActivationData data, String genericArguments)
at Orleans.Runtime.Catalog.SetupActivationInstance(ActivationData result, String grainType, String genericInterface)
at Orleans.Runtime.Catalog.GetOrCreateActivation(ActivationAddress address, Boolean newPlacement, String grainType, String genericArguments, Dictionary`2 requestContextData, Task& activatedPromise)
at Orleans.Runtime.Dispatcher.ReceiveMessage(Message message)
[2016-10-04 07:19:17.853 GMT 11 ERROR 101540 Dispatcher 127.0.0.1:11111] !!!!!!!!!! Error creating activation for Grains1.Manager. Message NewPlacement Request S127.0.0.1:11111:213261543*cli/893aa39f@4423baaf->S127.0.0.1:11111:213261543*grn/913DAEDD/af761896@76d92c9c #4: global::GrainInterfaces1.IManager:AsEmployee()
Exc level 0: Orleans.Storage.BadProviderConfigException: No storage providers found loading grain type Grains1.Manager
at Orleans.Runtime.Catalog.SetupStorageProvider(ActivationData data)
at Orleans.Runtime.Catalog.CreateGrainInstance(String grainTypeName, ActivationData data, String genericArguments)
at Orleans.Runtime.Catalog.SetupActivationInstance(ActivationData result, String grainType, String genericInterface)
at Orleans.Runtime.Catalog.GetOrCreateActivation(ActivationAddress address, Boolean newPlacement, String grainType, String genericArguments, Dictionary`2 requestContextData, Task& activatedPromise)
at Orleans.Runtime.Dispatcher.ReceiveMessage(Message message)
What I was missing were the following lines inside my orleansconfiguration.xml:
<OrleansConfiguration xmlns="urn:orleans">
<Globals>
<SeedNode Address="localhost" Port="11111" />
<StorageProviders>
<Provider Name="AzureStore" Type="Orleans.Storage.AzureTableStorage" DataConnectionString="UseDevelopmentStorage=true"/>
</StorageProviders>
</Globals>
<Defaults>
<Networking Address="localhost" Port="11111" />
<ProxyingGateway Address="localhost" Port="30000" />
</Defaults>
</OrleansConfiguration>
On my grains I had the following attribute added:
[StorageProvider(ProviderName = "AzureStore")]
public class Employee : Grain<EmployeeState>, IEmployee
{