void RebuildIndexItemThreadProc(object oParam) { RebuildIndexItemThreadProc_Params param = (RebuildIndexItemThreadProc_Params)oParam; int threadMod = 0; lock (param.State) { threadMod = param.State.ThreadsStarted; param.State.ThreadsStarted++; Thread.CurrentThread.Name = "RebuildIndexItemThreadProc_" + param.State.ThreadsStarted; param.Initialized.Set(); } for (int i = 0; i < param.DocumentCatalog.Collection.Count; i++) { if ((i % param.State.TargetThreadCount) == threadMod) { var documentCatalogItem = param.DocumentCatalog.Collection[i]; string documentDiskPath = Path.Combine(param.SchemaMeta.DiskPath, documentCatalogItem.FileName); var persistDocument = core.IO.GetJson <PersistDocument>(param.Transaction, documentDiskPath, LockOperation.Read); InsertDocumentIntoIndex(param.Transaction, param.SchemaMeta, param.IndexMeta, persistDocument, param.IndexPageCatalog, false); } } lock (param.State) { param.State.ThreadsCompleted++; } }
/// <summary> /// Inserts all documents in a schema into a single index in the schema. /// </summary> /// <param name="transaction"></param> /// <param name="schemaMeta"></param> /// <param name="indexMeta"></param> private void RebuildIndex(Transaction transaction, PersistSchema schemaMeta, PersistIndex indexMeta) { try { var filePath = Path.Combine(schemaMeta.DiskPath, Constants.DocumentCatalogFile); var documentCatalog = core.IO.GetJson <PersistDocumentCatalog>(transaction, filePath, LockOperation.Read); //Clear out the existing index pages. core.IO.PutPBuf(transaction, indexMeta.DiskPath, new PersistIndexPageCatalog()); var indexPageCatalog = core.IO.GetPBuf <PersistIndexPageCatalog>(transaction, indexMeta.DiskPath, LockOperation.Write); var state = new RebuildIndexItemThreadProc_ParallelState() { TargetThreadCount = Environment.ProcessorCount * 2, }; state.TargetThreadCount = 8; var param = new RebuildIndexItemThreadProc_Params() { DocumentCatalog = documentCatalog, State = state, IndexMeta = indexMeta, IndexPageCatalog = indexPageCatalog, SchemaMeta = schemaMeta, Transaction = transaction }; for (int i = 0; i < state.TargetThreadCount; i++) { new Thread(RebuildIndexItemThreadProc).Start(param); param.Initialized.WaitOne(Timeout.Infinite); } while (state.IsComplete == false) { Thread.Sleep(1); } if (state.Success == false) { throw new LeafSQLExceptionBase($"Failed to build index: {state.Exception.ToString()}"); } core.IO.PutPBuf(transaction, indexMeta.DiskPath, indexPageCatalog); } catch (Exception ex) { core.Log.Write(String.Format("Failed to rebuild single index for process {0}.", transaction.ProcessId), ex); throw; } }
void RebuildIndexItemThreadProc(object oParam) { RebuildIndexItemThreadProc_Params param = (RebuildIndexItemThreadProc_Params)oParam; try { int threadMod = 0; lock (param.State) { threadMod = param.State.ThreadsStarted; param.State.ThreadsStarted++; Thread.CurrentThread.Name = $"IDXTHD_{param.Transaction.Session.InstanceKey}_{param.State.ThreadsStarted}"; param.Initialized.Set(); } for (int i = 0; i < param.DocumentCatalog.Collection.Count; i++) { if ((i % param.State.TargetThreadCount) == threadMod) { var documentCatalogItem = param.DocumentCatalog.Collection[i]; string documentDiskPath = Path.Combine(param.SchemaMeta.DiskPath, documentCatalogItem.FileName); var persistDocument = core.IO.GetJson <PersistDocument>(param.Transaction, documentDiskPath, LockOperation.Read); InsertDocumentIntoIndex(param.Transaction, param.SchemaMeta, param.IndexMeta, persistDocument, param.IndexPageCatalog, false); } if (param.State.Cancel) { break; } } } catch (Exception ex) { param.State.Success = false; param.State.Cancel = true; lock (param.State.Exception) { param.State.Exception.Append(ex.Message); } } lock (param.State) { param.State.ThreadsCompleted++; } }