[Driver] Ensure JSON driver has a singular lock per cog name (#3780)

This commit is contained in:
Draper 2020-04-26 17:21:48 +01:00 committed by GitHub
parent bd3d0dd64d
commit fc2dce6882
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -4,6 +4,7 @@ import logging
import os import os
import pickle import pickle
import weakref import weakref
from collections import defaultdict
from pathlib import Path from pathlib import Path
from typing import Any, AsyncIterator, Dict, Optional, Tuple from typing import Any, AsyncIterator, Dict, Optional, Tuple
from uuid import uuid4 from uuid import uuid4
@ -17,6 +18,7 @@ __all__ = ["JsonDriver"]
_shared_datastore = {} _shared_datastore = {}
_driver_counts = {} _driver_counts = {}
_finalizers = [] _finalizers = []
_locks = defaultdict(asyncio.Lock)
log = logging.getLogger("redbot.json_driver") log = logging.getLogger("redbot.json_driver")
@ -30,6 +32,8 @@ def finalize_driver(cog_name):
if _driver_counts[cog_name] == 0: if _driver_counts[cog_name] == 0:
if cog_name in _shared_datastore: if cog_name in _shared_datastore:
del _shared_datastore[cog_name] del _shared_datastore[cog_name]
if cog_name in _locks:
del _locks[cog_name]
for f in _finalizers: for f in _finalizers:
if not f.alive: if not f.alive:
@ -68,10 +72,12 @@ class JsonDriver(BaseDriver):
self.data_path = data_manager.cog_data_path(raw_name=cog_name) self.data_path = data_manager.cog_data_path(raw_name=cog_name)
self.data_path.mkdir(parents=True, exist_ok=True) self.data_path.mkdir(parents=True, exist_ok=True)
self.data_path = self.data_path / self.file_name self.data_path = self.data_path / self.file_name
self._lock = asyncio.Lock()
self._load_data() self._load_data()
@property
def _lock(self):
return _locks[self.cog_name]
@property @property
def data(self): def data(self):
return _shared_datastore.get(self.cog_name) return _shared_datastore.get(self.cog_name)