This commit is contained in:
2026-05-14 17:48:42 +06:00
parent adee0bc805
commit dfff1ffd7e
2 changed files with 45 additions and 0 deletions

View File

@@ -776,6 +776,46 @@ func (db *LineDb) ClearCache(collectionName string, options LineDbAdapterOptions
return nil
}
// DBMutex возвращает RWMutex уровня LineDb: им сериализуются Insert/Update/Delete/Read и др. при обычных вызовах.
// Пары вызовов: Lock/Unlock (эксклюзивно) и RLock/RUnlock (чтение). Неверный порядок вместе с AdapterMutex может дать взаимную блокировку.
func (db *LineDb) DBMutex() *sync.RWMutex {
return &db.mutex
}
// AdapterMutex возвращает RWMutex JSONL-адаптера для имени хранилища (логическая коллекция или имя партиции, например events_A).
// Пустое collectionName — первая коллекция из конфигурации. Поиск выполняется под RLock карты адаптеров.
func (db *LineDb) AdapterMutex(collectionName string) (*sync.RWMutex, error) {
db.mutex.RLock()
defer db.mutex.RUnlock()
if collectionName == "" {
collectionName = db.getFirstCollection()
}
if collectionName == "" {
return nil, fmt.Errorf("no collection configured")
}
a, ok := db.adapters[collectionName]
if !ok {
return nil, fmt.Errorf("collection %s not found", collectionName)
}
return a.Mutex(), nil
}
// AdapterMutexAssumeDBLocked возвращает RWMutex адаптера. Вызывать только если текущая горутина
// уже удерживает DBMutex().RLock() или Lock() — иначе доступ к карте адаптеров не синхронизирован.
func (db *LineDb) AdapterMutexAssumeDBLocked(collectionName string) (*sync.RWMutex, error) {
if collectionName == "" {
collectionName = db.getFirstCollection()
}
if collectionName == "" {
return nil, fmt.Errorf("no collection configured")
}
a, ok := db.adapters[collectionName]
if !ok {
return nil, fmt.Errorf("collection %s not found", collectionName)
}
return a.Mutex(), nil
}
// clearCacheForCollection сбрасывает кэш запросов по логической коллекции (включая ключи партиций base_*).
func (db *LineDb) clearCacheForCollection(collectionName string) {
if db.cacheExternal == nil || collectionName == "" {