Fixes: U4-6891 Can't get to the "Rebuild" button when Lucene index folder is empty as well as how the polling works.

This commit is contained in:
Shannon
2015-08-05 18:32:59 +02:00
parent 4c20441c4e
commit 91a5b19378
2 changed files with 49 additions and 11 deletions

View File

@@ -164,12 +164,23 @@ namespace Umbraco.Web.WebServices
var msg = ValidateLuceneIndexer(indexerName, out indexer);
if (msg.IsSuccessStatusCode)
{
//remove it in case there's a handler there alraedy
indexer.IndexOperationComplete -= Indexer_IndexOperationComplete;
//now add a single handler
indexer.IndexOperationComplete += Indexer_IndexOperationComplete;
var cacheKey = "temp_indexing_op_" + indexer.Name;
//put temp val in cache which is used as a rudimentary way to know when the indexing is done
ApplicationContext.ApplicationCache.RuntimeCache.InsertCacheItem(cacheKey, () => "tempValue", TimeSpan.FromMinutes(5), isSliding: false);
try
{
indexer.RebuildIndex();
}
catch (Exception ex)
{
//ensure it's not listening
indexer.IndexOperationComplete -= Indexer_IndexOperationComplete;
LogHelper.Error<ExamineManagementApiController>("An error occurred rebuilding index", ex);
var response = Request.CreateResponse(HttpStatusCode.Conflict);
response.Content = new StringContent(string.Format("The index could not be rebuilt at this time, most likely there is another thread currently writing to the index. Error: {0}", ex));
@@ -180,14 +191,26 @@ namespace Umbraco.Web.WebServices
return msg;
}
//static listener so it's not GC'd
private static void Indexer_IndexOperationComplete(object sender, EventArgs e)
{
var indexer = (LuceneIndexer) sender;
//ensure it's not listening anymore
indexer.IndexOperationComplete -= Indexer_IndexOperationComplete;
var cacheKey = "temp_indexing_op_" + indexer.Name;
ApplicationContext.Current.ApplicationCache.RuntimeCache.ClearCacheItem(cacheKey);
}
/// <summary>
/// Check if the index has been rebuilt
/// </summary>
/// <param name="indexerName"></param>
/// <returns></returns>
/// <remarks>
/// This is kind of rudimentary since there's no way we can know that the index has rebuilt, we'll just check
/// if the index is locked based on Lucene apis
/// This is kind of rudimentary since there's no way we can know that the index has rebuilt, we
/// have a listener for the index op complete so we'll just check if that key is no longer there in the runtime cache
/// </remarks>
public ExamineIndexerModel PostCheckRebuildIndex(string indexerName)
{
@@ -195,9 +218,11 @@ namespace Umbraco.Web.WebServices
var msg = ValidateLuceneIndexer(indexerName, out indexer);
if (msg.IsSuccessStatusCode)
{
var isLocked = indexer.IsIndexLocked();
return isLocked
? null
var cacheKey = "temp_indexing_op_" + indexerName;
var found = ApplicationContext.ApplicationCache.RuntimeCache.GetCacheItem(cacheKey);
//if its still there then it's not done
return found != null
? null
: CreateModel(indexer);
}
throw new HttpResponseException(msg);
@@ -239,13 +264,24 @@ namespace Umbraco.Web.WebServices
}
var luceneIndexer = indexer as LuceneIndexer;
if (luceneIndexer != null && luceneIndexer.IndexExists())
if (luceneIndexer != null)
{
indexerModel.IsLuceneIndex = true;
indexerModel.DocumentCount = luceneIndexer.GetIndexDocumentCount();
indexerModel.FieldCount = luceneIndexer.GetIndexFieldCount();
indexerModel.IsOptimized = luceneIndexer.IsIndexOptimized();
indexerModel.DeletionCount = luceneIndexer.GetDeletedDocumentsCount();
if (luceneIndexer.IndexExists())
{
indexerModel.DocumentCount = luceneIndexer.GetIndexDocumentCount();
indexerModel.FieldCount = luceneIndexer.GetIndexFieldCount();
indexerModel.IsOptimized = luceneIndexer.IsIndexOptimized();
indexerModel.DeletionCount = luceneIndexer.GetDeletedDocumentsCount();
}
else
{
indexerModel.DocumentCount = 0;
indexerModel.FieldCount = 0;
indexerModel.IsOptimized = true;
indexerModel.DeletionCount = 0;
}
}
return indexerModel;
}