diff --git a/glc/conf/config.go b/glc/conf/config.go index ffa9f8e..4bc1a97 100644 --- a/glc/conf/config.go +++ b/glc/conf/config.go @@ -51,6 +51,7 @@ var minioPassword string var minioBucket string var enableUploadMinio bool var goMaxProcess int +var goMaxProcessIdx int var enableCors bool var pageSize int var nearSearchSize int @@ -61,7 +62,6 @@ var aryWhite []string var aryBlack []string var ipAddCity bool var enableChatAi bool -var createIndexSync bool func init() { UpdateConfigByEnv() @@ -101,18 +101,13 @@ func UpdateConfigByEnv() { minioBucket = cmn.GetEnvStr("GLC_MINIO_BUCKET", "") // 【X】MINIO桶名,默认“” enableUploadMinio = cmn.GetEnvBool("GLC_ENABLE_UPLOAD_MINIO", false) // 【X】是否开启上传备份至MINIO服务器,默认false goMaxProcess = getGoMaxProcessConf(cmn.GetEnvInt("GLC_GOMAXPROCS", -1)) // 使用的最大CPU数量,默认是最大CPU数量(设定值不在实际数量范围是按最大看待) + goMaxProcessIdx = getGoMaxProcessConf(cmn.GetEnvInt("GLC_GOMAXPROCS_IDX", -1)) // 创建索引使用的最大协程数量,默认是最大CPU数量(设定值不在实际数量范围是按最大看待) enableCors = cmn.GetEnvBool("GLC_ENABLE_CORS", false) // 是否允许跨域,默认false pageSize = getPageSizeConf(cmn.GetEnvInt("GLC_PAGE_SIZE", 100)) // 每次检索件数,默认100(有效范围1~1000) nearSearchSize = getNearSearchSizeConf(cmn.GetEnvInt("GLC_NEAR_SEARCH_SIZE", 200)) // 定位相邻检索的查询件数,默认200(有效范围50~1000) mulitLineSearch = cmn.GetEnvBool("GLC_SEARCH_MULIT_LINE", false) // 是否检索日志的全部行(日志可能有换行),默认false仅第一行 testMode = cmn.GetEnvBool("GLC_TEST_MODE", false) // 是否测试模式,默认false enableChatAi = cmn.GetEnvBool("GLC_ENABLE_CHATAI", true) // 是否开启GLC智能助手,默认true - createIndexSync = cmn.GetEnvBool("GLC_CREATE_INDEX_SYNC", false) // 是否同步创建索引,默认false -} - -// 取配置: 是否同步创建索引 -func IsCreateIndexSync() bool { - return createIndexSync } // 取配置: 是否开启GLC智能助手 @@ -188,6 +183,11 @@ func IsEnableCors() bool { return enableCors } +// 取配置: 创建索引使用的最大协程数量,默认是最大CPU数量(设定值不在实际数量范围是按最大看待) +func GetGoMaxProcessIdx() int { + return goMaxProcessIdx +} + // 取配置: 使用的最大CPU数量,可通过环境变量“GLC_GOMAXPROCS”设定,默认最大CPU数量 func GetGoMaxProcess() int { return goMaxProcess diff --git a/glc/ldb/storage/logdata/logdata_storage.go b/glc/ldb/storage/logdata/logdata_storage.go index 513710e..964db7e 100644 --- a/glc/ldb/storage/logdata/logdata_storage.go +++ b/glc/ldb/storage/logdata/logdata_storage.go @@ -34,6 +34,8 @@ type LogDataStorage struct { closing bool // 是否关闭中状态 mu sync.Mutex // 锁 wg sync.WaitGroup // 计数 + muIdx sync.Mutex // 建索引锁 + } var zeroUint32Bytes []byte = cmn.Uint32ToBytes(0) @@ -133,12 +135,11 @@ func (s *LogDataStorage) readyGo() { break } s.saveLogData(data) // 保存日志数据 - - if conf.IsCreateIndexSync() { - s.createInvertedIndex() // 按配置要求同步生成反向索引 - } default: - // 空时再生成索引,一次一条日志,有空则生成直到全部完成 + // 空时再生成索引,多协程跑起来加快速度,再来一次单条同步用于判断,有空则生成直到全部完成 + for i := 0; i < conf.GetGoMaxProcessIdx()-1; i++ { + go s.createInvertedIndex() // 多协程跑起来加快速度 + } n := s.createInvertedIndex() // 生成反向索引 // 索引生成完成后,等待接收保存日志 @@ -178,17 +179,21 @@ func (s *LogDataStorage) saveLogData(model *LogDataModel) { // 创建日志索引(一次建一条日志的索引),没有可建索引时返回0 func (s *LogDataStorage) createInvertedIndex() int { + s.muIdx.Lock() // 索引锁,建索引略需时间,手动控制不做全称锁 // 索引信息和日志数量相互比较,判断是否继续创建索引 if s.TotalCount() == 0 || s.indexedCount >= s.TotalCount() { + s.muIdx.Unlock() return 0 // 没有新的日志需要建索引 } - s.indexedCount++ // 下一条要建索引的日志id - docm, err := s.GetLogDataModel(s.indexedCount) // 取出日志模型数据 + docm, err := s.GetLogDataModel(s.indexedCount + 1) // 取出日志模型数据 if err != nil { + s.muIdx.Unlock() cmn.Error("取日志模型数据失败:", s.indexedCount, err) return 2 } + s.indexedCount++ // 下一条要建索引的日志id + s.muIdx.Unlock() // 整理生成关键词 var adds []string