private void UpdateInnerStore(
DocumentStoreWrapper wrapper,
Action<DocumentStore> innerStoreInitializer)
{
DocumentStore existingInnerStore = wrapper.InnerStore;
DocumentStore newInnerStore = null;
bool newInnerStoreApplied = false;
try
{
var storeInstance = GetClosestInstanceOrDefault(wrapper);
if (wrapper.IsInitialized &&
wrapper.InnerStore.Url.Equals(storeInstance.Url.ToString(), StringComparison.OrdinalIgnoreCase) &&
!wrapper.InnerStore.WasDisposed)
{
logger.Debug("{0} {1} store Url did not change. It remains {2}.", wrapper.AccessMode, wrapper.Name, wrapper.InnerStore.Url);
return;
}
newInnerStore = this.CreateDocumentStore(storeInstance, wrapper.AccessMode);
innerStoreInitializer(newInnerStore);
wrapper.InnerStore = newInnerStore;
wrapper.IsInitialized = true;
newInnerStoreApplied = true;
logger.Info("{0} {1} store Url set to {2}.", wrapper.AccessMode, wrapper.Name, newInnerStore.Url);
}
catch (Exception exception)
{
LogException(exception, wrapper, newInnerStore);
if (exception.IsFatal())
{
throw;
}
}
finally
{
if (newInnerStoreApplied)
{
if (existingInnerStore != null)
{
// Wait for current operations to complete.
// This is on a background thread.
Thread.Sleep(5000);
logger.Debug("Disposing store for {0}", existingInnerStore.Url);
existingInnerStore.Dispose();
}
}
else
{
if (newInnerStore != null)
{
logger.Debug("Disposing store for {0}", newInnerStore.Url);
newInnerStore.Dispose();
}
}
}
}