Hi!
I've noticed that txn-list operations are not being synchronized on Windows
around trunk@1568806. FSFS makes use of two different types of locks: there
are mutexes synchronizing the fcntl file locking (POSIX only) and ordinary
mutexes (e.g. txn-list-lock). The former are only required on POSIX, the
latter, however, should be enabled under all OSes.
Since r1182459 [1], the txn-list-lock mutex is being erroneously enabled and
disabled under the same condition as the mutexes required for the fcntl locking
mechanism to work. This effectively makes the txn-list operations work without
any serialization on Windows.
I have attached a patch that fixes this problem. Log message:
[[[
Ensure that access to the transaction list and free transaction pointer is
properly synchronized on Windows. Before this changeset, the corresponding
txn-list-lock mutex was being enabled/disabled under the same condition as
the mutexes required for the POSIX fcntl file locking. This effectively ended
up in no synchronization for the txn-list operations on Windows.
* subversion/libsvn_fs_fs/fs.c
(fs_serialized_init): Unconditionally enable the TXN_LIST_LOCK mutex.
Patch by: Evgeny Kotkov <evgeny.kotkov{_AT_}visualsvn.com>
]]]
[1] http://svn.apache.org/viewvc?view=revision&revision=r1182459
Thanks and regards,
Evgeny Kotkov
Index: subversion/libsvn_fs_fs/fs.c
===================================================================
--- subversion/libsvn_fs_fs/fs.c (revision 1568806)
+++ subversion/libsvn_fs_fs/fs.c (working copy)
@@ -103,8 +103,10 @@ fs_serialized_init(svn_fs_t *fs, apr_pool_t *commo
SVN_ERR(svn_mutex__init(&ffsd->txn_current_lock,
SVN_FS_FS__USE_LOCK_MUTEX, common_pool));
- SVN_ERR(svn_mutex__init(&ffsd->txn_list_lock,
- SVN_FS_FS__USE_LOCK_MUTEX, common_pool));
+ /* We also need a mutex for synchronizing access to the active
+ transaction list and free transaction pointer. This one is
+ enabled unconditionally. */
+ SVN_ERR(svn_mutex__init(&ffsd->txn_list_lock, TRUE, common_pool));
key = apr_pstrdup(common_pool, key);
status = apr_pool_userdata_set(ffsd, key, NULL, common_pool);