fix: Use EqualReadWriteLocker with file locker to prevent deadlocks

This commit is contained in:
Joachim Van Herwegen 2023-04-18 15:57:55 +02:00
parent c3f48ddb97
commit 0a30be55ef
2 changed files with 5 additions and 8 deletions

View File

@ -6,18 +6,12 @@
"@id": "urn:solid-server:default:ResourceLocker", "@id": "urn:solid-server:default:ResourceLocker",
"@type": "WrappedExpiringReadWriteLocker", "@type": "WrappedExpiringReadWriteLocker",
"locker": { "locker": {
"@type": "GreedyReadWriteLocker", "@type": "EqualReadWriteLocker",
"locker": { "locker": {
"@id": "urn:solid-server:default:FileSystemResourceLocker", "@id": "urn:solid-server:default:FileSystemResourceLocker",
"@type": "FileSystemResourceLocker", "@type": "FileSystemResourceLocker",
"args_rootFilePath": { "@id": "urn:solid-server:default:variable:rootFilePath" } "args_rootFilePath": { "@id": "urn:solid-server:default:variable:rootFilePath" }
}, }
"storage": {
"@id": "urn:solid-server:default:LockStorage"
},
"suffixes_count": "count",
"suffixes_read": "read",
"suffixes_write": "write"
}, },
"expiration": 6000 "expiration": 6000
}, },

View File

@ -53,6 +53,9 @@ function isCodedError(err: unknown): err is { code: string } & Error {
/** /**
* A resource locker making use of the [proper-lockfile](https://www.npmjs.com/package/proper-lockfile) library. * A resource locker making use of the [proper-lockfile](https://www.npmjs.com/package/proper-lockfile) library.
* Note that no locks are kept in memory, thus this is considered thread- and process-safe. * Note that no locks are kept in memory, thus this is considered thread- and process-safe.
* While it stores the actual locks on disk, it also tracks them in memory for when they need to be released.
* This means only the worker thread that acquired a lock can release it again,
* making this implementation unusable in combination with a wrapping read/write lock implementation.
* *
* This **proper-lockfile** library has its own retry mechanism for the operations, since a lock/unlock call will * This **proper-lockfile** library has its own retry mechanism for the operations, since a lock/unlock call will
* either resolve successfully or reject immediately with the causing error. The retry function of the library * either resolve successfully or reject immediately with the causing error. The retry function of the library