예제 #1
0
        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++;
            }
        }
예제 #2
0
        /// <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;
            }
        }
예제 #3
0
        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++;
            }
        }