rwlock: require info keys to be present in schema (#3283)

Co-authored-by: Ruslan Kuprieiev <[email protected]>

Co-authored-by: Ruslan Kuprieiev <[email protected]>
This commit is contained in:
Mr. Outis
2020-02-05 19:24:41 +02:00
committed by GitHub
co-authored by Ruslan Kuprieiev
parent d9ed98b951
commit 509ce3e16e
+9 -6
View File
@@ -4,15 +4,20 @@ import json
from collections import defaultdict
from contextlib import contextmanager
from voluptuous import Schema, Invalid
from voluptuous import Schema, Invalid, Required, Optional
from .exceptions import DvcException
from .lock import LockError
from .utils import relpath
INFO_SCHEMA = {"pid": int, "cmd": str}
INFO_SCHEMA = {Required("pid"): int, Required("cmd"): str}
SCHEMA = Schema({"write": {str: INFO_SCHEMA}, "read": {str: [INFO_SCHEMA]}})
SCHEMA = Schema(
{
Optional("write", default={}): {str: INFO_SCHEMA},
Optional("read", default={}): {str: [INFO_SCHEMA]},
}
)
class RWLockFileCorruptedError(DvcException):
@@ -35,15 +40,13 @@ def _edit_rwlock(lock_dir):
path = os.path.join(lock_dir, "rwlock")
try:
with open(path, "r") as fobj:
lock = json.load(fobj)
lock = SCHEMA(lock)
lock = SCHEMA(json.load(fobj))
except FileNotFoundError:
lock = SCHEMA({})
except json.JSONDecodeError as exc:
raise RWLockFileCorruptedError(path) from exc
except Invalid as exc:
raise RWLockFileFormatError(path) from exc
lock = defaultdict(dict, lock)
lock["read"] = defaultdict(list, lock["read"])
lock["write"] = defaultdict(dict, lock["write"])
yield lock