]> www.infradead.org Git - users/hch/xfstests-dev.git/commit
fstests: use syncfs rather than sync
authorDave Chinner <dchinner@redhat.com>
Tue, 26 Nov 2024 20:48:41 +0000 (07:48 +1100)
committerZorro Lang <zlang@kernel.org>
Sun, 8 Dec 2024 14:05:46 +0000 (22:05 +0800)
commitf8d5367e01a7c859c3378a76b6afc047728b7652
tree0b31af5c5538cc320615ae301b2b3399d7fae00b
parent9d8d91a05a41f3632718895218219779592fb2cb
fstests: use syncfs rather than sync

sync(1) is a system wide sync and is implemented by iterating all
the superblocks in the system. In most cases, fstests require just
the filesystem under test to be synced - we require syncfs(2)
semantics but what we use is sync(2) semantics.

The result of this is that when running many concurrent fstests at
the same time, we can have *hundreds* of concurrent sync operations
in progress (thanks fsstress!) and this causes excessive
interference with other tests that are running on other filesystems.

For example, some tests try to specifically control extent layout
via specific write and fsync patterns. All these global syncs
perturb them and cause them to spuriously fail.

A random snapshot of running concurrent tests shows just how many
tests are explicitly blocked in sync(1):

check-parallel───check───077───077─┬─cut
      │                                    ├─du
      │                                    └─tail
      ├─check-parallel───check───311───xfs_scrub───{xfs_scrub}
      ├─check-parallel───check───531───128*[t_open_tmpfiles]
      ├─check-parallel───check───227
      ├─check-parallel───check───388
      ├─check-parallel───check───070───fsstress───fsstress───{fsstress+
      ├─check-parallel───check───232───fsstress───7*[fsstress───{fsstr+
      ├─check-parallel───check───648───sleep
      ├─check-parallel───check───409───sync
      ├─check-parallel───check───683───sync
      ├─check-parallel───check───013─┬─013───sleep
      │                              └─fsstress───2*[fsstress───{fsstr+
      ├─check-parallel───check───684───sync
      ├─check-parallel───check───673───sync
      ├─check-parallel───check───118───dd
      ├─check-parallel───check───467───open_by_handle
      ├─check-parallel───check─┬─622
      │                        └─check
      ├─check-parallel───check───685───sync
      ├─check-parallel───check───049───fsstress───fsstress───{fsstress+
      ├─check-parallel───check───599
      ├─check-parallel───check───426───open_by_handle
      ├─check-parallel───check───057───umount
      ├─check-parallel───check───390───fsstress─┬─18*[fsstress───{fsst+
      │                                         └─fsstress
      ├─check-parallel───check───158───fsstress───fsstress───{fsstress+
      ├─check-parallel───check───017
      ├─check-parallel───check───032───fsstress───fsstress
      ├─check-parallel───check───076
      ├─check-parallel───check───477───open_by_handle
      ├─check-parallel───check───170───2*[170───170]
      ├─check-parallel───check───112
      ├─check-parallel───check───686───sync
      ├─4*[check-parallel───check───check───xfs_scrub───{xfs_scrub}]
      ├─check-parallel───check───387───xfs_io───{xfs_io}
      ├─check-parallel───check───615───615
      ├─check-parallel───check─┬─051
      │                        └─check───xfs_repair
      ├─check-parallel───check───049
      ├─check-parallel───check───247
      ├─check-parallel───check───674───sync
      ├─check-parallel───check───040
      ├─check-parallel───check───560───fsstress───fsstress───{fsstress+
      ├─check-parallel───check───030─┬─030─┬─030───xfs_repair
      │                              │     └─030───perl
      │                              ├─sed
      │                              └─uniq
      ├─check-parallel───check───055───055
      ├─2*[check-parallel───check───check]
      ├─check-parallel───check───042
      ├─check-parallel───check───204
      ├─check-parallel───check───271─┬─271───sed
      │                              └─md5sum
      ├─check-parallel───check───091─┬─fsx
      │                              └─tee
      ├─check-parallel───check───063───sleep
      ├─check-parallel───check───026
      ├─check-parallel───check───459───lvm
      ├─check-parallel───check───495
      ├─check-parallel───check───141───fsstress───4*[fsstress]
      ├─check-parallel───check───011─┬─fsstress─┬─fsstress───{fsstress+
      │                              │          └─fsstress
      │                              └─sleep
      ├─check-parallel───check───328───sync
      ├─check-parallel───check───507───507
      ├─check-parallel───check
      ├─check-parallel───check───687───sync
      ├─check-parallel───check───109───mkfs.xfs
      ├─check-parallel───check───324
      ├─check-parallel───check───114───aio-dio-eof-rac
      └─check-parallel───check───503───xfs_scrub───2*[{xfs_scrub}]

There are ~10 sync(1) calls blocked and at least half of the 50-odd
fsstress processes currently running are also going to be stuck in
sync(2) calls.

They are stuck because the superblock iteration has to wait for
mount, unmount, freeze, thaw and any other operation that locks a
superblock exclusively. When running dozens of tests concurrently,
there can be tens of superblocks that are locked exclusively for
every second for significant lengths of time.

Hence the use of sync has impact on both performance and test
behaviour and we need to minimise the amount of sync(1) and
sync(2) usage as much as possible.

Introduce _test_sync() and _scratch_sync() so we can implement
a syncfs mechanism with a fallback to sync(1) if it is not supported
without dirtying all the test code unnecessarily. Then convert
fsstress to use syncfs(2) in preference to sync(2).

This commit changes all the generic and XFS tests to use the new
sync functions, other filesystem specific tests will eventually
need to be converted to avoid similar problems.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Zorro lang <zlang@redhat.com>
Signed-off-by: Zorro Lang <zlang@kernel.org>
208 files changed:
common/encrypt
common/log
common/quota
common/rc
common/repair
common/report
common/verity
common/xfs
ltp/fsstress.c
tests/generic/015
tests/generic/029
tests/generic/030
tests/generic/032
tests/generic/034
tests/generic/039
tests/generic/040
tests/generic/041
tests/generic/048
tests/generic/049
tests/generic/051
tests/generic/054
tests/generic/057
tests/generic/059
tests/generic/065
tests/generic/066
tests/generic/073
tests/generic/090
tests/generic/092
tests/generic/098
tests/generic/101
tests/generic/104
tests/generic/106
tests/generic/107
tests/generic/150
tests/generic/151
tests/generic/152
tests/generic/157
tests/generic/158
tests/generic/159
tests/generic/160
tests/generic/171
tests/generic/172
tests/generic/173
tests/generic/174
tests/generic/204
tests/generic/247
tests/generic/250
tests/generic/252
tests/generic/265
tests/generic/266
tests/generic/267
tests/generic/268
tests/generic/271
tests/generic/272
tests/generic/273
tests/generic/274
tests/generic/275
tests/generic/276
tests/generic/278
tests/generic/279
tests/generic/281
tests/generic/282
tests/generic/283
tests/generic/315
tests/generic/317
tests/generic/318
tests/generic/325
tests/generic/328
tests/generic/329
tests/generic/330
tests/generic/331
tests/generic/332
tests/generic/335
tests/generic/336
tests/generic/341
tests/generic/342
tests/generic/343
tests/generic/347
tests/generic/348
tests/generic/353
tests/generic/376
tests/generic/382
tests/generic/387
tests/generic/391
tests/generic/409
tests/generic/410
tests/generic/411
tests/generic/416
tests/generic/422
tests/generic/425
tests/generic/461
tests/generic/474
tests/generic/479
tests/generic/480
tests/generic/483
tests/generic/489
tests/generic/502
tests/generic/505
tests/generic/506
tests/generic/507
tests/generic/508
tests/generic/510
tests/generic/520
tests/generic/526
tests/generic/527
tests/generic/535
tests/generic/546
tests/generic/556
tests/generic/579
tests/generic/589
tests/generic/599
tests/generic/610
tests/generic/628
tests/generic/629
tests/generic/640
tests/generic/673
tests/generic/674
tests/generic/675
tests/generic/677
tests/generic/683
tests/generic/684
tests/generic/685
tests/generic/686
tests/generic/687
tests/generic/688
tests/generic/690
tests/generic/694
tests/generic/695
tests/generic/703
tests/generic/716
tests/generic/718
tests/generic/719
tests/generic/721
tests/generic/725
tests/generic/726
tests/generic/727
tests/generic/735
tests/generic/738
tests/generic/745
tests/generic/746
tests/generic/747
tests/generic/749
tests/xfs/016
tests/xfs/052
tests/xfs/110
tests/xfs/118
tests/xfs/119
tests/xfs/128
tests/xfs/133
tests/xfs/134
tests/xfs/161
tests/xfs/176
tests/xfs/195
tests/xfs/201
tests/xfs/212
tests/xfs/227
tests/xfs/231
tests/xfs/232
tests/xfs/234
tests/xfs/236
tests/xfs/237
tests/xfs/239
tests/xfs/240
tests/xfs/241
tests/xfs/243
tests/xfs/246
tests/xfs/265
tests/xfs/272
tests/xfs/274
tests/xfs/276
tests/xfs/291
tests/xfs/309
tests/xfs/312
tests/xfs/313
tests/xfs/314
tests/xfs/315
tests/xfs/316
tests/xfs/317
tests/xfs/318
tests/xfs/319
tests/xfs/320
tests/xfs/321
tests/xfs/322
tests/xfs/323
tests/xfs/324
tests/xfs/325
tests/xfs/326
tests/xfs/327
tests/xfs/420
tests/xfs/421
tests/xfs/423
tests/xfs/438
tests/xfs/440
tests/xfs/442
tests/xfs/511
tests/xfs/519
tests/xfs/520
tests/xfs/541
tests/xfs/553
tests/xfs/558
tests/xfs/607
tests/xfs/617
tests/xfs/629
tests/xfs/630
tests/xfs/631
tests/xfs/790
tests/xfs/791
tests/xfs/792