@nxtedition/rocksdb 6.0.2 → 6.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. package/BUILDING.md +12 -4
  2. package/binding.cc +2 -0
  3. package/deps/rocksdb/rocksdb/CMakeLists.txt +9 -0
  4. package/deps/rocksdb/rocksdb/Makefile +16 -5
  5. package/deps/rocksdb/rocksdb/TARGETS +23 -2
  6. package/deps/rocksdb/rocksdb/cmake/modules/CxxFlags.cmake +7 -0
  7. package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +29 -0
  8. package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +29 -0
  9. package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +29 -0
  10. package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +33 -0
  11. package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +29 -0
  12. package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +29 -0
  13. package/deps/rocksdb/rocksdb/cmake/modules/Finduring.cmake +26 -0
  14. package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +29 -0
  15. package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +10 -0
  16. package/deps/rocksdb/rocksdb/db/builder.cc +12 -4
  17. package/deps/rocksdb/rocksdb/db/c.cc +26 -0
  18. package/deps/rocksdb/rocksdb/db/c_test.c +3 -0
  19. package/deps/rocksdb/rocksdb/db/column_family.cc +8 -2
  20. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +29 -6
  21. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +8 -2
  22. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +16 -4
  23. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +2 -1
  24. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +16 -0
  25. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +402 -30
  26. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +2 -12
  27. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +14 -0
  28. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +7 -5
  29. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +1 -1
  30. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +33 -7
  31. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +54 -23
  32. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +3 -0
  33. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +8 -1
  34. package/deps/rocksdb/rocksdb/db/db_options_test.cc +16 -0
  35. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +14 -15
  36. package/deps/rocksdb/rocksdb/db/db_readonly_with_timestamp_test.cc +331 -0
  37. package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +5 -0
  38. package/deps/rocksdb/rocksdb/db/db_test.cc +16 -0
  39. package/deps/rocksdb/rocksdb/db/db_test2.cc +221 -92
  40. package/deps/rocksdb/rocksdb/db/db_test_util.cc +6 -2
  41. package/deps/rocksdb/rocksdb/db/db_test_util.h +4 -2
  42. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +1 -171
  43. package/deps/rocksdb/rocksdb/db/db_with_timestamp_test_util.cc +96 -0
  44. package/deps/rocksdb/rocksdb/db/db_with_timestamp_test_util.h +126 -0
  45. package/deps/rocksdb/rocksdb/db/experimental.cc +1 -1
  46. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +57 -0
  47. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +13 -2
  48. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +2 -0
  49. package/deps/rocksdb/rocksdb/db/flush_job.cc +10 -11
  50. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +11 -1
  51. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +6 -0
  52. package/deps/rocksdb/rocksdb/db/repair.cc +12 -1
  53. package/deps/rocksdb/rocksdb/db/repair_test.cc +32 -10
  54. package/deps/rocksdb/rocksdb/db/snapshot_impl.h +3 -1
  55. package/deps/rocksdb/rocksdb/db/table_cache.cc +19 -127
  56. package/deps/rocksdb/rocksdb/db/table_cache.h +3 -2
  57. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +140 -0
  58. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +130 -128
  59. package/deps/rocksdb/rocksdb/db/version_edit.cc +20 -0
  60. package/deps/rocksdb/rocksdb/db/version_edit.h +13 -4
  61. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +14 -14
  62. package/deps/rocksdb/rocksdb/db/version_set.cc +205 -212
  63. package/deps/rocksdb/rocksdb/db/version_set.h +11 -0
  64. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +154 -0
  65. package/deps/rocksdb/rocksdb/db/version_set_test.cc +10 -9
  66. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +2 -0
  67. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +13 -0
  68. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +15 -0
  69. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +159 -65
  70. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +43 -21
  71. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +142 -17
  72. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +23 -27
  73. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +2 -3
  74. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +23 -5
  75. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +14 -1
  76. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +2 -0
  77. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +17 -0
  78. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +2 -0
  79. package/deps/rocksdb/rocksdb/include/rocksdb/snapshot.h +4 -1
  80. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +3 -0
  81. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +189 -0
  82. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
  83. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +5 -0
  84. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +1 -1
  85. package/deps/rocksdb/rocksdb/options/cf_options.cc +13 -0
  86. package/deps/rocksdb/rocksdb/options/db_options.cc +8 -0
  87. package/deps/rocksdb/rocksdb/options/db_options.h +1 -0
  88. package/deps/rocksdb/rocksdb/options/options.cc +7 -0
  89. package/deps/rocksdb/rocksdb/options/options_helper.cc +4 -0
  90. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +6 -4
  91. package/deps/rocksdb/rocksdb/options/options_test.cc +107 -9
  92. package/deps/rocksdb/rocksdb/src.mk +4 -1
  93. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +9 -4
  94. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +80 -6
  95. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +8 -2
  96. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +81 -757
  97. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +21 -15
  98. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +9 -3
  99. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +754 -0
  100. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +2 -1
  101. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +8 -0
  102. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +1 -10
  103. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +59 -1
  104. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.h +18 -0
  105. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +0 -61
  106. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +0 -13
  107. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +1 -1
  108. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +3 -2
  109. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +2 -2
  110. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +2 -1
  111. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +2 -1
  112. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +60 -2
  113. package/deps/rocksdb/rocksdb/table/block_fetcher.h +2 -0
  114. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +39 -0
  115. package/deps/rocksdb/rocksdb/table/multiget_context.h +46 -2
  116. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +2 -1
  117. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +1 -1
  118. package/deps/rocksdb/rocksdb/table/table_reader.h +13 -0
  119. package/deps/rocksdb/rocksdb/table/unique_id.cc +27 -0
  120. package/deps/rocksdb/rocksdb/table/unique_id_impl.h +3 -0
  121. package/deps/rocksdb/rocksdb/test_util/testutil.cc +2 -0
  122. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +23 -7
  123. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +9 -1
  124. package/deps/rocksdb/rocksdb/util/async_file_reader.cc +72 -0
  125. package/deps/rocksdb/rocksdb/util/async_file_reader.h +144 -0
  126. package/deps/rocksdb/rocksdb/util/compression.h +49 -0
  127. package/deps/rocksdb/rocksdb/util/coro_utils.h +111 -0
  128. package/deps/rocksdb/rocksdb/util/single_thread_executor.h +55 -0
  129. package/deps/rocksdb/rocksdb.gyp +16 -15
  130. package/package-lock.json +23687 -0
  131. package/package.json +2 -30
  132. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  133. package/prebuilds/darwin-x64/node.napi.node +0 -0
  134. package/prebuilds/linux-x64/node.napi.node +0 -0
  135. package/deps/liburing/liburing/README +0 -46
  136. package/deps/liburing/liburing/test/232c93d07b74-test.c +0 -305
  137. package/deps/liburing/liburing/test/35fa71a030ca-test.c +0 -329
  138. package/deps/liburing/liburing/test/500f9fbadef8-test.c +0 -89
  139. package/deps/liburing/liburing/test/7ad0e4b2f83c-test.c +0 -93
  140. package/deps/liburing/liburing/test/8a9973408177-test.c +0 -106
  141. package/deps/liburing/liburing/test/917257daa0fe-test.c +0 -53
  142. package/deps/liburing/liburing/test/Makefile +0 -312
  143. package/deps/liburing/liburing/test/a0908ae19763-test.c +0 -58
  144. package/deps/liburing/liburing/test/a4c0b3decb33-test.c +0 -180
  145. package/deps/liburing/liburing/test/accept-link.c +0 -251
  146. package/deps/liburing/liburing/test/accept-reuse.c +0 -164
  147. package/deps/liburing/liburing/test/accept-test.c +0 -79
  148. package/deps/liburing/liburing/test/accept.c +0 -476
  149. package/deps/liburing/liburing/test/across-fork.c +0 -283
  150. package/deps/liburing/liburing/test/b19062a56726-test.c +0 -53
  151. package/deps/liburing/liburing/test/b5837bd5311d-test.c +0 -77
  152. package/deps/liburing/liburing/test/ce593a6c480a-test.c +0 -135
  153. package/deps/liburing/liburing/test/close-opath.c +0 -122
  154. package/deps/liburing/liburing/test/config +0 -10
  155. package/deps/liburing/liburing/test/connect.c +0 -398
  156. package/deps/liburing/liburing/test/cq-full.c +0 -96
  157. package/deps/liburing/liburing/test/cq-overflow.c +0 -294
  158. package/deps/liburing/liburing/test/cq-peek-batch.c +0 -102
  159. package/deps/liburing/liburing/test/cq-ready.c +0 -94
  160. package/deps/liburing/liburing/test/cq-size.c +0 -58
  161. package/deps/liburing/liburing/test/d4ae271dfaae-test.c +0 -96
  162. package/deps/liburing/liburing/test/d77a67ed5f27-test.c +0 -65
  163. package/deps/liburing/liburing/test/defer.c +0 -307
  164. package/deps/liburing/liburing/test/double-poll-crash.c +0 -186
  165. package/deps/liburing/liburing/test/eeed8b54e0df-test.c +0 -114
  166. package/deps/liburing/liburing/test/empty-eownerdead.c +0 -42
  167. package/deps/liburing/liburing/test/eventfd-disable.c +0 -151
  168. package/deps/liburing/liburing/test/eventfd-ring.c +0 -97
  169. package/deps/liburing/liburing/test/eventfd.c +0 -112
  170. package/deps/liburing/liburing/test/fadvise.c +0 -202
  171. package/deps/liburing/liburing/test/fallocate.c +0 -249
  172. package/deps/liburing/liburing/test/fc2a85cb02ef-test.c +0 -138
  173. package/deps/liburing/liburing/test/file-register.c +0 -843
  174. package/deps/liburing/liburing/test/file-update.c +0 -173
  175. package/deps/liburing/liburing/test/files-exit-hang-poll.c +0 -128
  176. package/deps/liburing/liburing/test/files-exit-hang-timeout.c +0 -134
  177. package/deps/liburing/liburing/test/fixed-link.c +0 -90
  178. package/deps/liburing/liburing/test/fsync.c +0 -224
  179. package/deps/liburing/liburing/test/hardlink.c +0 -136
  180. package/deps/liburing/liburing/test/helpers.c +0 -135
  181. package/deps/liburing/liburing/test/helpers.h +0 -67
  182. package/deps/liburing/liburing/test/io-cancel.c +0 -537
  183. package/deps/liburing/liburing/test/io_uring_enter.c +0 -296
  184. package/deps/liburing/liburing/test/io_uring_register.c +0 -664
  185. package/deps/liburing/liburing/test/io_uring_setup.c +0 -192
  186. package/deps/liburing/liburing/test/iopoll.c +0 -366
  187. package/deps/liburing/liburing/test/lfs-openat-write.c +0 -117
  188. package/deps/liburing/liburing/test/lfs-openat.c +0 -273
  189. package/deps/liburing/liburing/test/link-timeout.c +0 -1107
  190. package/deps/liburing/liburing/test/link.c +0 -496
  191. package/deps/liburing/liburing/test/link_drain.c +0 -229
  192. package/deps/liburing/liburing/test/madvise.c +0 -195
  193. package/deps/liburing/liburing/test/mkdir.c +0 -108
  194. package/deps/liburing/liburing/test/multicqes_drain.c +0 -383
  195. package/deps/liburing/liburing/test/nop-all-sizes.c +0 -107
  196. package/deps/liburing/liburing/test/nop.c +0 -115
  197. package/deps/liburing/liburing/test/open-close.c +0 -146
  198. package/deps/liburing/liburing/test/openat2.c +0 -240
  199. package/deps/liburing/liburing/test/personality.c +0 -204
  200. package/deps/liburing/liburing/test/pipe-eof.c +0 -81
  201. package/deps/liburing/liburing/test/pipe-reuse.c +0 -105
  202. package/deps/liburing/liburing/test/poll-cancel-ton.c +0 -139
  203. package/deps/liburing/liburing/test/poll-cancel.c +0 -135
  204. package/deps/liburing/liburing/test/poll-link.c +0 -227
  205. package/deps/liburing/liburing/test/poll-many.c +0 -208
  206. package/deps/liburing/liburing/test/poll-mshot-update.c +0 -273
  207. package/deps/liburing/liburing/test/poll-ring.c +0 -48
  208. package/deps/liburing/liburing/test/poll-v-poll.c +0 -353
  209. package/deps/liburing/liburing/test/poll.c +0 -109
  210. package/deps/liburing/liburing/test/probe.c +0 -137
  211. package/deps/liburing/liburing/test/read-write.c +0 -876
  212. package/deps/liburing/liburing/test/register-restrictions.c +0 -633
  213. package/deps/liburing/liburing/test/rename.c +0 -134
  214. package/deps/liburing/liburing/test/ring-leak.c +0 -173
  215. package/deps/liburing/liburing/test/ring-leak2.c +0 -249
  216. package/deps/liburing/liburing/test/rsrc_tags.c +0 -449
  217. package/deps/liburing/liburing/test/runtests-loop.sh +0 -16
  218. package/deps/liburing/liburing/test/runtests.sh +0 -170
  219. package/deps/liburing/liburing/test/rw_merge_test.c +0 -97
  220. package/deps/liburing/liburing/test/self.c +0 -91
  221. package/deps/liburing/liburing/test/send_recv.c +0 -291
  222. package/deps/liburing/liburing/test/send_recvmsg.c +0 -345
  223. package/deps/liburing/liburing/test/sendmsg_fs_cve.c +0 -198
  224. package/deps/liburing/liburing/test/shared-wq.c +0 -84
  225. package/deps/liburing/liburing/test/short-read.c +0 -75
  226. package/deps/liburing/liburing/test/shutdown.c +0 -163
  227. package/deps/liburing/liburing/test/sigfd-deadlock.c +0 -74
  228. package/deps/liburing/liburing/test/socket-rw-eagain.c +0 -156
  229. package/deps/liburing/liburing/test/socket-rw.c +0 -147
  230. package/deps/liburing/liburing/test/splice.c +0 -511
  231. package/deps/liburing/liburing/test/sq-full-cpp.cc +0 -45
  232. package/deps/liburing/liburing/test/sq-full.c +0 -45
  233. package/deps/liburing/liburing/test/sq-poll-dup.c +0 -200
  234. package/deps/liburing/liburing/test/sq-poll-kthread.c +0 -168
  235. package/deps/liburing/liburing/test/sq-poll-share.c +0 -137
  236. package/deps/liburing/liburing/test/sq-space_left.c +0 -159
  237. package/deps/liburing/liburing/test/sqpoll-cancel-hang.c +0 -159
  238. package/deps/liburing/liburing/test/sqpoll-disable-exit.c +0 -195
  239. package/deps/liburing/liburing/test/sqpoll-exit-hang.c +0 -77
  240. package/deps/liburing/liburing/test/sqpoll-sleep.c +0 -68
  241. package/deps/liburing/liburing/test/statx.c +0 -172
  242. package/deps/liburing/liburing/test/stdout.c +0 -232
  243. package/deps/liburing/liburing/test/submit-link-fail.c +0 -154
  244. package/deps/liburing/liburing/test/submit-reuse.c +0 -239
  245. package/deps/liburing/liburing/test/symlink.c +0 -116
  246. package/deps/liburing/liburing/test/teardowns.c +0 -58
  247. package/deps/liburing/liburing/test/thread-exit.c +0 -131
  248. package/deps/liburing/liburing/test/timeout-new.c +0 -246
  249. package/deps/liburing/liburing/test/timeout-overflow.c +0 -204
  250. package/deps/liburing/liburing/test/timeout.c +0 -1354
  251. package/deps/liburing/liburing/test/unlink.c +0 -111
  252. package/deps/liburing/liburing/test/wakeup-hang.c +0 -162
  253. package/deps/rocksdb/rocksdb/README.md +0 -32
  254. package/deps/rocksdb/rocksdb/microbench/README.md +0 -60
  255. package/deps/rocksdb/rocksdb/plugin/README.md +0 -43
  256. package/deps/rocksdb/rocksdb/port/README +0 -10
  257. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +0 -13
@@ -1,1354 +0,0 @@
1
- /* SPDX-License-Identifier: MIT */
2
- /*
3
- * Description: run various timeout tests
4
- *
5
- */
6
- #include <errno.h>
7
- #include <stdio.h>
8
- #include <unistd.h>
9
- #include <stdlib.h>
10
- #include <string.h>
11
- #include <fcntl.h>
12
- #include <sys/time.h>
13
-
14
- #include "liburing.h"
15
- #include "../src/syscall.h"
16
-
17
- #define TIMEOUT_MSEC 200
18
- static int not_supported;
19
- static int no_modify;
20
-
21
- static void msec_to_ts(struct __kernel_timespec *ts, unsigned int msec)
22
- {
23
- ts->tv_sec = msec / 1000;
24
- ts->tv_nsec = (msec % 1000) * 1000000;
25
- }
26
-
27
- static unsigned long long mtime_since(const struct timeval *s,
28
- const struct timeval *e)
29
- {
30
- long long sec, usec;
31
-
32
- sec = e->tv_sec - s->tv_sec;
33
- usec = (e->tv_usec - s->tv_usec);
34
- if (sec > 0 && usec < 0) {
35
- sec--;
36
- usec += 1000000;
37
- }
38
-
39
- sec *= 1000;
40
- usec /= 1000;
41
- return sec + usec;
42
- }
43
-
44
- static unsigned long long mtime_since_now(struct timeval *tv)
45
- {
46
- struct timeval end;
47
-
48
- gettimeofday(&end, NULL);
49
- return mtime_since(tv, &end);
50
- }
51
-
52
- /*
53
- * Test that we return to userspace if a timeout triggers, even if we
54
- * don't satisfy the number of events asked for.
55
- */
56
- static int test_single_timeout_many(struct io_uring *ring)
57
- {
58
- struct io_uring_cqe *cqe;
59
- struct io_uring_sqe *sqe;
60
- unsigned long long exp;
61
- struct __kernel_timespec ts;
62
- struct timeval tv;
63
- int ret;
64
-
65
- sqe = io_uring_get_sqe(ring);
66
- if (!sqe) {
67
- fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__);
68
- goto err;
69
- }
70
-
71
- msec_to_ts(&ts, TIMEOUT_MSEC);
72
- io_uring_prep_timeout(sqe, &ts, 0, 0);
73
-
74
- ret = io_uring_submit(ring);
75
- if (ret <= 0) {
76
- fprintf(stderr, "%s: sqe submit failed: %d\n", __FUNCTION__, ret);
77
- goto err;
78
- }
79
-
80
- gettimeofday(&tv, NULL);
81
- ret = __sys_io_uring_enter(ring->ring_fd, 0, 4, IORING_ENTER_GETEVENTS,
82
- NULL);
83
- if (ret < 0) {
84
- fprintf(stderr, "%s: io_uring_enter %d\n", __FUNCTION__, ret);
85
- goto err;
86
- }
87
-
88
- ret = io_uring_wait_cqe(ring, &cqe);
89
- if (ret < 0) {
90
- fprintf(stderr, "%s: wait completion %d\n", __FUNCTION__, ret);
91
- goto err;
92
- }
93
- ret = cqe->res;
94
- io_uring_cqe_seen(ring, cqe);
95
- if (ret == -EINVAL) {
96
- fprintf(stdout, "Timeout not supported, ignored\n");
97
- not_supported = 1;
98
- return 0;
99
- } else if (ret != -ETIME) {
100
- fprintf(stderr, "Timeout: %s\n", strerror(-ret));
101
- goto err;
102
- }
103
-
104
- exp = mtime_since_now(&tv);
105
- if (exp >= TIMEOUT_MSEC / 2 && exp <= (TIMEOUT_MSEC * 3) / 2)
106
- return 0;
107
- fprintf(stderr, "%s: Timeout seems wonky (got %llu)\n", __FUNCTION__, exp);
108
- err:
109
- return 1;
110
- }
111
-
112
- /*
113
- * Test numbered trigger of timeout
114
- */
115
- static int test_single_timeout_nr(struct io_uring *ring, int nr)
116
- {
117
- struct io_uring_cqe *cqe;
118
- struct io_uring_sqe *sqe;
119
- struct __kernel_timespec ts;
120
- int i, ret;
121
-
122
- sqe = io_uring_get_sqe(ring);
123
- if (!sqe) {
124
- fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__);
125
- goto err;
126
- }
127
-
128
- msec_to_ts(&ts, TIMEOUT_MSEC);
129
- io_uring_prep_timeout(sqe, &ts, nr, 0);
130
-
131
- sqe = io_uring_get_sqe(ring);
132
- io_uring_prep_nop(sqe);
133
- io_uring_sqe_set_data(sqe, (void *) 1);
134
- sqe = io_uring_get_sqe(ring);
135
- io_uring_prep_nop(sqe);
136
- io_uring_sqe_set_data(sqe, (void *) 1);
137
-
138
- ret = io_uring_submit_and_wait(ring, 3);
139
- if (ret <= 0) {
140
- fprintf(stderr, "%s: sqe submit failed: %d\n", __FUNCTION__, ret);
141
- goto err;
142
- }
143
-
144
- i = 0;
145
- while (i < 3) {
146
- ret = io_uring_wait_cqe(ring, &cqe);
147
- if (ret < 0) {
148
- fprintf(stderr, "%s: wait completion %d\n", __FUNCTION__, ret);
149
- goto err;
150
- }
151
-
152
- ret = cqe->res;
153
-
154
- /*
155
- * NOP commands have user_data as 1. Check that we get the
156
- * at least 'nr' NOPs first, then the successfully removed timout.
157
- */
158
- if (io_uring_cqe_get_data(cqe) == NULL) {
159
- if (i < nr) {
160
- fprintf(stderr, "%s: timeout received too early\n", __FUNCTION__);
161
- goto err;
162
- }
163
- if (ret) {
164
- fprintf(stderr, "%s: timeout triggered by passage of"
165
- " time, not by events completed\n", __FUNCTION__);
166
- goto err;
167
- }
168
- }
169
-
170
- io_uring_cqe_seen(ring, cqe);
171
- if (ret) {
172
- fprintf(stderr, "res: %d\n", ret);
173
- goto err;
174
- }
175
- i++;
176
- };
177
-
178
- return 0;
179
- err:
180
- return 1;
181
- }
182
-
183
- static int test_single_timeout_wait(struct io_uring *ring,
184
- struct io_uring_params *p)
185
- {
186
- struct io_uring_cqe *cqe;
187
- struct io_uring_sqe *sqe;
188
- struct __kernel_timespec ts;
189
- int i, ret;
190
-
191
- sqe = io_uring_get_sqe(ring);
192
- io_uring_prep_nop(sqe);
193
- io_uring_sqe_set_data(sqe, (void *) 1);
194
-
195
- sqe = io_uring_get_sqe(ring);
196
- io_uring_prep_nop(sqe);
197
- io_uring_sqe_set_data(sqe, (void *) 1);
198
-
199
- /* no implied submit for newer kernels */
200
- if (p->features & IORING_FEAT_EXT_ARG) {
201
- ret = io_uring_submit(ring);
202
- if (ret != 2) {
203
- fprintf(stderr, "%s: submit %d\n", __FUNCTION__, ret);
204
- return 1;
205
- }
206
- }
207
-
208
- msec_to_ts(&ts, 1000);
209
-
210
- i = 0;
211
- do {
212
- ret = io_uring_wait_cqes(ring, &cqe, 2, &ts, NULL);
213
- if (ret == -ETIME)
214
- break;
215
- if (ret < 0) {
216
- fprintf(stderr, "%s: wait timeout failed: %d\n", __FUNCTION__, ret);
217
- goto err;
218
- }
219
-
220
- ret = cqe->res;
221
- io_uring_cqe_seen(ring, cqe);
222
- if (ret < 0) {
223
- fprintf(stderr, "res: %d\n", ret);
224
- goto err;
225
- }
226
- i++;
227
- } while (1);
228
-
229
- if (i != 2) {
230
- fprintf(stderr, "got %d completions\n", i);
231
- goto err;
232
- }
233
- return 0;
234
- err:
235
- return 1;
236
- }
237
-
238
- /*
239
- * Test single timeout waking us up
240
- */
241
- static int test_single_timeout(struct io_uring *ring)
242
- {
243
- struct io_uring_cqe *cqe;
244
- struct io_uring_sqe *sqe;
245
- unsigned long long exp;
246
- struct __kernel_timespec ts;
247
- struct timeval tv;
248
- int ret;
249
-
250
- sqe = io_uring_get_sqe(ring);
251
- if (!sqe) {
252
- fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__);
253
- goto err;
254
- }
255
-
256
- msec_to_ts(&ts, TIMEOUT_MSEC);
257
- io_uring_prep_timeout(sqe, &ts, 0, 0);
258
-
259
- ret = io_uring_submit(ring);
260
- if (ret <= 0) {
261
- fprintf(stderr, "%s: sqe submit failed: %d\n", __FUNCTION__, ret);
262
- goto err;
263
- }
264
-
265
- gettimeofday(&tv, NULL);
266
- ret = io_uring_wait_cqe(ring, &cqe);
267
- if (ret < 0) {
268
- fprintf(stderr, "%s: wait completion %d\n", __FUNCTION__, ret);
269
- goto err;
270
- }
271
- ret = cqe->res;
272
- io_uring_cqe_seen(ring, cqe);
273
- if (ret == -EINVAL) {
274
- fprintf(stdout, "%s: Timeout not supported, ignored\n", __FUNCTION__);
275
- not_supported = 1;
276
- return 0;
277
- } else if (ret != -ETIME) {
278
- fprintf(stderr, "%s: Timeout: %s\n", __FUNCTION__, strerror(-ret));
279
- goto err;
280
- }
281
-
282
- exp = mtime_since_now(&tv);
283
- if (exp >= TIMEOUT_MSEC / 2 && exp <= (TIMEOUT_MSEC * 3) / 2)
284
- return 0;
285
- fprintf(stderr, "%s: Timeout seems wonky (got %llu)\n", __FUNCTION__, exp);
286
- err:
287
- return 1;
288
- }
289
-
290
- static int test_single_timeout_remove_notfound(struct io_uring *ring)
291
- {
292
- struct io_uring_cqe *cqe;
293
- struct io_uring_sqe *sqe;
294
- struct __kernel_timespec ts;
295
- int ret, i;
296
-
297
- if (no_modify)
298
- return 0;
299
-
300
- sqe = io_uring_get_sqe(ring);
301
- if (!sqe) {
302
- fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__);
303
- goto err;
304
- }
305
-
306
- msec_to_ts(&ts, TIMEOUT_MSEC);
307
- io_uring_prep_timeout(sqe, &ts, 2, 0);
308
- sqe->user_data = 1;
309
-
310
- ret = io_uring_submit(ring);
311
- if (ret <= 0) {
312
- fprintf(stderr, "%s: sqe submit failed: %d\n", __FUNCTION__, ret);
313
- goto err;
314
- }
315
-
316
- sqe = io_uring_get_sqe(ring);
317
- if (!sqe) {
318
- fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__);
319
- goto err;
320
- }
321
-
322
- io_uring_prep_timeout_remove(sqe, 2, 0);
323
- sqe->user_data = 2;
324
-
325
- ret = io_uring_submit(ring);
326
- if (ret <= 0) {
327
- fprintf(stderr, "%s: sqe submit failed: %d\n", __FUNCTION__, ret);
328
- goto err;
329
- }
330
-
331
- /*
332
- * We should get two completions. One is our modify request, which should
333
- * complete with -ENOENT. The other is the timeout that will trigger after
334
- * TIMEOUT_MSEC.
335
- */
336
- for (i = 0; i < 2; i++) {
337
- ret = io_uring_wait_cqe(ring, &cqe);
338
- if (ret < 0) {
339
- fprintf(stderr, "%s: wait completion %d\n", __FUNCTION__, ret);
340
- goto err;
341
- }
342
- if (cqe->user_data == 2) {
343
- if (cqe->res != -ENOENT) {
344
- fprintf(stderr, "%s: modify ret %d, wanted ENOENT\n", __FUNCTION__, cqe->res);
345
- break;
346
- }
347
- } else if (cqe->user_data == 1) {
348
- if (cqe->res != -ETIME) {
349
- fprintf(stderr, "%s: timeout ret %d, wanted -ETIME\n", __FUNCTION__, cqe->res);
350
- break;
351
- }
352
- }
353
- io_uring_cqe_seen(ring, cqe);
354
- }
355
- return 0;
356
- err:
357
- return 1;
358
- }
359
-
360
- static int test_single_timeout_remove(struct io_uring *ring)
361
- {
362
- struct io_uring_cqe *cqe;
363
- struct io_uring_sqe *sqe;
364
- struct __kernel_timespec ts;
365
- int ret, i;
366
-
367
- sqe = io_uring_get_sqe(ring);
368
- if (!sqe) {
369
- fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__);
370
- goto err;
371
- }
372
-
373
- msec_to_ts(&ts, TIMEOUT_MSEC);
374
- io_uring_prep_timeout(sqe, &ts, 0, 0);
375
- sqe->user_data = 1;
376
-
377
- ret = io_uring_submit(ring);
378
- if (ret <= 0) {
379
- fprintf(stderr, "%s: sqe submit failed: %d\n", __FUNCTION__, ret);
380
- goto err;
381
- }
382
-
383
- sqe = io_uring_get_sqe(ring);
384
- if (!sqe) {
385
- fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__);
386
- goto err;
387
- }
388
-
389
- io_uring_prep_timeout_remove(sqe, 1, 0);
390
- sqe->user_data = 2;
391
-
392
- ret = io_uring_submit(ring);
393
- if (ret <= 0) {
394
- fprintf(stderr, "%s: sqe submit failed: %d\n", __FUNCTION__, ret);
395
- goto err;
396
- }
397
-
398
- /*
399
- * We should have two completions ready. One is for the original timeout
400
- * request, user_data == 1, that should have a ret of -ECANCELED. The other
401
- * is for our modify request, user_data == 2, that should have a ret of 0.
402
- */
403
- for (i = 0; i < 2; i++) {
404
- ret = io_uring_wait_cqe(ring, &cqe);
405
- if (ret < 0) {
406
- fprintf(stderr, "%s: wait completion %d\n", __FUNCTION__, ret);
407
- goto err;
408
- }
409
- if (no_modify)
410
- goto seen;
411
- if (cqe->res == -EINVAL && cqe->user_data == 2) {
412
- fprintf(stdout, "Timeout modify not supported, ignoring\n");
413
- no_modify = 1;
414
- goto seen;
415
- }
416
- if (cqe->user_data == 1) {
417
- if (cqe->res != -ECANCELED) {
418
- fprintf(stderr, "%s: timeout ret %d, wanted canceled\n", __FUNCTION__, cqe->res);
419
- break;
420
- }
421
- } else if (cqe->user_data == 2) {
422
- if (cqe->res) {
423
- fprintf(stderr, "%s: modify ret %d, wanted 0\n", __FUNCTION__, cqe->res);
424
- break;
425
- }
426
- }
427
- seen:
428
- io_uring_cqe_seen(ring, cqe);
429
- }
430
- return 0;
431
- err:
432
- return 1;
433
- }
434
-
435
- /*
436
- * Test single absolute timeout waking us up
437
- */
438
- static int test_single_timeout_abs(struct io_uring *ring)
439
- {
440
- struct io_uring_cqe *cqe;
441
- struct io_uring_sqe *sqe;
442
- unsigned long long exp;
443
- struct __kernel_timespec ts;
444
- struct timespec abs_ts;
445
- struct timeval tv;
446
- int ret;
447
-
448
- sqe = io_uring_get_sqe(ring);
449
- if (!sqe) {
450
- fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__);
451
- goto err;
452
- }
453
-
454
- clock_gettime(CLOCK_MONOTONIC, &abs_ts);
455
- ts.tv_sec = abs_ts.tv_sec + 1;
456
- ts.tv_nsec = abs_ts.tv_nsec;
457
- io_uring_prep_timeout(sqe, &ts, 0, IORING_TIMEOUT_ABS);
458
-
459
- ret = io_uring_submit(ring);
460
- if (ret <= 0) {
461
- fprintf(stderr, "%s: sqe submit failed: %d\n", __FUNCTION__, ret);
462
- goto err;
463
- }
464
-
465
- gettimeofday(&tv, NULL);
466
- ret = io_uring_wait_cqe(ring, &cqe);
467
- if (ret < 0) {
468
- fprintf(stderr, "%s: wait completion %d\n", __FUNCTION__, ret);
469
- goto err;
470
- }
471
- ret = cqe->res;
472
- io_uring_cqe_seen(ring, cqe);
473
- if (ret == -EINVAL) {
474
- fprintf(stdout, "Absolute timeouts not supported, ignored\n");
475
- return 0;
476
- } else if (ret != -ETIME) {
477
- fprintf(stderr, "Timeout: %s\n", strerror(-ret));
478
- goto err;
479
- }
480
-
481
- exp = mtime_since_now(&tv);
482
- if (exp >= 1000 / 2 && exp <= (1000 * 3) / 2)
483
- return 0;
484
- fprintf(stderr, "%s: Timeout seems wonky (got %llu)\n", __FUNCTION__, exp);
485
- err:
486
- return 1;
487
- }
488
-
489
- /*
490
- * Test that timeout is canceled on exit
491
- */
492
- static int test_single_timeout_exit(struct io_uring *ring)
493
- {
494
- struct io_uring_sqe *sqe;
495
- struct __kernel_timespec ts;
496
- int ret;
497
-
498
- sqe = io_uring_get_sqe(ring);
499
- if (!sqe) {
500
- fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__);
501
- goto err;
502
- }
503
-
504
- msec_to_ts(&ts, 30000);
505
- io_uring_prep_timeout(sqe, &ts, 0, 0);
506
-
507
- ret = io_uring_submit(ring);
508
- if (ret <= 0) {
509
- fprintf(stderr, "%s: sqe submit failed: %d\n", __FUNCTION__, ret);
510
- goto err;
511
- }
512
-
513
- io_uring_queue_exit(ring);
514
- return 0;
515
- err:
516
- io_uring_queue_exit(ring);
517
- return 1;
518
- }
519
-
520
- /*
521
- * Test multi timeouts waking us up
522
- */
523
- static int test_multi_timeout(struct io_uring *ring)
524
- {
525
- struct io_uring_sqe *sqe;
526
- struct io_uring_cqe *cqe;
527
- struct __kernel_timespec ts[2];
528
- unsigned int timeout[2];
529
- unsigned long long exp;
530
- struct timeval tv;
531
- int ret, i;
532
-
533
- /* req_1: timeout req, count = 1, time = (TIMEOUT_MSEC * 2) */
534
- timeout[0] = TIMEOUT_MSEC * 2;
535
- msec_to_ts(&ts[0], timeout[0]);
536
- sqe = io_uring_get_sqe(ring);
537
- if (!sqe) {
538
- fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__);
539
- goto err;
540
- }
541
- io_uring_prep_timeout(sqe, &ts[0], 1, 0);
542
- sqe->user_data = 1;
543
-
544
- /* req_2: timeout req, count = 1, time = TIMEOUT_MSEC */
545
- timeout[1] = TIMEOUT_MSEC;
546
- msec_to_ts(&ts[1], timeout[1]);
547
- sqe = io_uring_get_sqe(ring);
548
- if (!sqe) {
549
- fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__);
550
- goto err;
551
- }
552
- io_uring_prep_timeout(sqe, &ts[1], 1, 0);
553
- sqe->user_data = 2;
554
-
555
- ret = io_uring_submit(ring);
556
- if (ret <= 0) {
557
- fprintf(stderr, "%s: sqe submit failed: %d\n", __FUNCTION__, ret);
558
- goto err;
559
- }
560
-
561
- gettimeofday(&tv, NULL);
562
- for (i = 0; i < 2; i++) {
563
- unsigned int time;
564
- __u64 user_data;
565
-
566
- ret = io_uring_wait_cqe(ring, &cqe);
567
- if (ret < 0) {
568
- fprintf(stderr, "%s: wait completion %d\n", __FUNCTION__, ret);
569
- goto err;
570
- }
571
-
572
- /*
573
- * Both of these two reqs should timeout, but req_2 should
574
- * return before req_1.
575
- */
576
- switch (i) {
577
- case 0:
578
- user_data = 2;
579
- time = timeout[1];
580
- break;
581
- case 1:
582
- user_data = 1;
583
- time = timeout[0];
584
- break;
585
- }
586
-
587
- if (cqe->user_data != user_data) {
588
- fprintf(stderr, "%s: unexpected timeout req %d sequece\n",
589
- __FUNCTION__, i+1);
590
- goto err;
591
- }
592
- if (cqe->res != -ETIME) {
593
- fprintf(stderr, "%s: Req %d timeout: %s\n",
594
- __FUNCTION__, i+1, strerror(cqe->res));
595
- goto err;
596
- }
597
- exp = mtime_since_now(&tv);
598
- if (exp < time / 2 || exp > (time * 3) / 2) {
599
- fprintf(stderr, "%s: Req %d timeout seems wonky (got %llu)\n",
600
- __FUNCTION__, i+1, exp);
601
- goto err;
602
- }
603
- io_uring_cqe_seen(ring, cqe);
604
- }
605
-
606
- return 0;
607
- err:
608
- return 1;
609
- }
610
-
611
- /*
612
- * Test multi timeout req with different count
613
- */
614
- static int test_multi_timeout_nr(struct io_uring *ring)
615
- {
616
- struct io_uring_sqe *sqe;
617
- struct io_uring_cqe *cqe;
618
- struct __kernel_timespec ts;
619
- int ret, i;
620
-
621
- msec_to_ts(&ts, TIMEOUT_MSEC);
622
-
623
- /* req_1: timeout req, count = 2 */
624
- sqe = io_uring_get_sqe(ring);
625
- if (!sqe) {
626
- fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__);
627
- goto err;
628
- }
629
- io_uring_prep_timeout(sqe, &ts, 2, 0);
630
- sqe->user_data = 1;
631
-
632
- /* req_2: timeout req, count = 1 */
633
- sqe = io_uring_get_sqe(ring);
634
- if (!sqe) {
635
- fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__);
636
- goto err;
637
- }
638
- io_uring_prep_timeout(sqe, &ts, 1, 0);
639
- sqe->user_data = 2;
640
-
641
- /* req_3: nop req */
642
- sqe = io_uring_get_sqe(ring);
643
- if (!sqe) {
644
- fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__);
645
- goto err;
646
- }
647
- io_uring_prep_nop(sqe);
648
- io_uring_sqe_set_data(sqe, (void *) 1);
649
-
650
- ret = io_uring_submit(ring);
651
- if (ret <= 0) {
652
- fprintf(stderr, "%s: sqe submit failed: %d\n", __FUNCTION__, ret);
653
- goto err;
654
- }
655
-
656
- /*
657
- * req_2 (count=1) should return without error and req_1 (count=2)
658
- * should timeout.
659
- */
660
- for (i = 0; i < 3; i++) {
661
- ret = io_uring_wait_cqe(ring, &cqe);
662
- if (ret < 0) {
663
- fprintf(stderr, "%s: wait completion %d\n", __FUNCTION__, ret);
664
- goto err;
665
- }
666
-
667
- switch (i) {
668
- case 0:
669
- /* Should be nop req */
670
- if (io_uring_cqe_get_data(cqe) != (void *) 1) {
671
- fprintf(stderr, "%s: nop not seen as 1 or 2\n", __FUNCTION__);
672
- goto err;
673
- }
674
- break;
675
- case 1:
676
- /* Should be timeout req_2 */
677
- if (cqe->user_data != 2) {
678
- fprintf(stderr, "%s: unexpected timeout req %d sequece\n",
679
- __FUNCTION__, i+1);
680
- goto err;
681
- }
682
- if (cqe->res < 0) {
683
- fprintf(stderr, "%s: Req %d res %d\n",
684
- __FUNCTION__, i+1, cqe->res);
685
- goto err;
686
- }
687
- break;
688
- case 2:
689
- /* Should be timeout req_1 */
690
- if (cqe->user_data != 1) {
691
- fprintf(stderr, "%s: unexpected timeout req %d sequece\n",
692
- __FUNCTION__, i+1);
693
- goto err;
694
- }
695
- if (cqe->res != -ETIME) {
696
- fprintf(stderr, "%s: Req %d timeout: %s\n",
697
- __FUNCTION__, i+1, strerror(cqe->res));
698
- goto err;
699
- }
700
- break;
701
- }
702
- io_uring_cqe_seen(ring, cqe);
703
- }
704
-
705
- return 0;
706
- err:
707
- return 1;
708
- }
709
-
710
- /*
711
- * Test timeout <link> timeout <drain> timeout
712
- */
713
- static int test_timeout_flags1(struct io_uring *ring)
714
- {
715
- struct io_uring_sqe *sqe;
716
- struct io_uring_cqe *cqe;
717
- struct __kernel_timespec ts;
718
- int ret, i;
719
-
720
- msec_to_ts(&ts, TIMEOUT_MSEC);
721
-
722
- sqe = io_uring_get_sqe(ring);
723
- if (!sqe) {
724
- fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__);
725
- goto err;
726
- }
727
- io_uring_prep_timeout(sqe, &ts, 0, 0);
728
- sqe->user_data = 1;
729
- sqe->flags |= IOSQE_IO_LINK;
730
-
731
- sqe = io_uring_get_sqe(ring);
732
- if (!sqe) {
733
- fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__);
734
- goto err;
735
- }
736
- io_uring_prep_timeout(sqe, &ts, 0, 0);
737
- sqe->user_data = 2;
738
- sqe->flags |= IOSQE_IO_DRAIN;
739
-
740
- sqe = io_uring_get_sqe(ring);
741
- if (!sqe) {
742
- fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__);
743
- goto err;
744
- }
745
- io_uring_prep_timeout(sqe, &ts, 0, 0);
746
- sqe->user_data = 3;
747
-
748
- ret = io_uring_submit(ring);
749
- if (ret <= 0) {
750
- fprintf(stderr, "%s: sqe submit failed: %d\n", __FUNCTION__, ret);
751
- goto err;
752
- }
753
-
754
- for (i = 0; i < 3; i++) {
755
- ret = io_uring_wait_cqe(ring, &cqe);
756
- if (ret < 0) {
757
- fprintf(stderr, "%s: wait completion %d\n", __FUNCTION__, ret);
758
- goto err;
759
- }
760
-
761
- if (cqe->res == -EINVAL) {
762
- if (!i)
763
- fprintf(stdout, "%s: timeout flags not supported\n",
764
- __FUNCTION__);
765
- io_uring_cqe_seen(ring, cqe);
766
- continue;
767
- }
768
-
769
- switch (cqe->user_data) {
770
- case 1:
771
- if (cqe->res != -ETIME) {
772
- fprintf(stderr, "%s: got %d, wanted %d\n",
773
- __FUNCTION__, cqe->res, -ETIME);
774
- goto err;
775
- }
776
- break;
777
- case 2:
778
- if (cqe->res != -ECANCELED) {
779
- fprintf(stderr, "%s: got %d, wanted %d\n",
780
- __FUNCTION__, cqe->res,
781
- -ECANCELED);
782
- goto err;
783
- }
784
- break;
785
- case 3:
786
- if (cqe->res != -ETIME) {
787
- fprintf(stderr, "%s: got %d, wanted %d\n",
788
- __FUNCTION__, cqe->res, -ETIME);
789
- goto err;
790
- }
791
- break;
792
- }
793
- io_uring_cqe_seen(ring, cqe);
794
- }
795
-
796
- return 0;
797
- err:
798
- return 1;
799
- }
800
-
801
- /*
802
- * Test timeout <link> timeout <link> timeout
803
- */
804
- static int test_timeout_flags2(struct io_uring *ring)
805
- {
806
- struct io_uring_sqe *sqe;
807
- struct io_uring_cqe *cqe;
808
- struct __kernel_timespec ts;
809
- int ret, i;
810
-
811
- msec_to_ts(&ts, TIMEOUT_MSEC);
812
-
813
- sqe = io_uring_get_sqe(ring);
814
- if (!sqe) {
815
- fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__);
816
- goto err;
817
- }
818
- io_uring_prep_timeout(sqe, &ts, 0, 0);
819
- sqe->user_data = 1;
820
- sqe->flags |= IOSQE_IO_LINK;
821
-
822
- sqe = io_uring_get_sqe(ring);
823
- if (!sqe) {
824
- fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__);
825
- goto err;
826
- }
827
- io_uring_prep_timeout(sqe, &ts, 0, 0);
828
- sqe->user_data = 2;
829
- sqe->flags |= IOSQE_IO_LINK;
830
-
831
- sqe = io_uring_get_sqe(ring);
832
- if (!sqe) {
833
- fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__);
834
- goto err;
835
- }
836
- io_uring_prep_timeout(sqe, &ts, 0, 0);
837
- sqe->user_data = 3;
838
-
839
- ret = io_uring_submit(ring);
840
- if (ret <= 0) {
841
- fprintf(stderr, "%s: sqe submit failed: %d\n", __FUNCTION__, ret);
842
- goto err;
843
- }
844
-
845
- for (i = 0; i < 3; i++) {
846
- ret = io_uring_wait_cqe(ring, &cqe);
847
- if (ret < 0) {
848
- fprintf(stderr, "%s: wait completion %d\n", __FUNCTION__, ret);
849
- goto err;
850
- }
851
-
852
- if (cqe->res == -EINVAL) {
853
- if (!i)
854
- fprintf(stdout, "%s: timeout flags not supported\n",
855
- __FUNCTION__);
856
- io_uring_cqe_seen(ring, cqe);
857
- continue;
858
- }
859
-
860
- switch (cqe->user_data) {
861
- case 1:
862
- if (cqe->res != -ETIME) {
863
- fprintf(stderr, "%s: got %d, wanted %d\n",
864
- __FUNCTION__, cqe->res, -ETIME);
865
- goto err;
866
- }
867
- break;
868
- case 2:
869
- case 3:
870
- if (cqe->res != -ECANCELED) {
871
- fprintf(stderr, "%s: got %d, wanted %d\n",
872
- __FUNCTION__, cqe->res,
873
- -ECANCELED);
874
- goto err;
875
- }
876
- break;
877
- }
878
- io_uring_cqe_seen(ring, cqe);
879
- }
880
-
881
- return 0;
882
- err:
883
- return 1;
884
- }
885
-
886
- /*
887
- * Test timeout <drain> timeout <link> timeout
888
- */
889
- static int test_timeout_flags3(struct io_uring *ring)
890
- {
891
- struct io_uring_sqe *sqe;
892
- struct io_uring_cqe *cqe;
893
- struct __kernel_timespec ts;
894
- int ret, i;
895
-
896
- msec_to_ts(&ts, TIMEOUT_MSEC);
897
-
898
- sqe = io_uring_get_sqe(ring);
899
- if (!sqe) {
900
- fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__);
901
- goto err;
902
- }
903
- io_uring_prep_timeout(sqe, &ts, 0, 0);
904
- sqe->user_data = 1;
905
- sqe->flags |= IOSQE_IO_DRAIN;
906
-
907
- sqe = io_uring_get_sqe(ring);
908
- if (!sqe) {
909
- fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__);
910
- goto err;
911
- }
912
- io_uring_prep_timeout(sqe, &ts, 0, 0);
913
- sqe->user_data = 2;
914
- sqe->flags |= IOSQE_IO_LINK;
915
-
916
- sqe = io_uring_get_sqe(ring);
917
- if (!sqe) {
918
- fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__);
919
- goto err;
920
- }
921
- io_uring_prep_timeout(sqe, &ts, 0, 0);
922
- sqe->user_data = 3;
923
-
924
- ret = io_uring_submit(ring);
925
- if (ret <= 0) {
926
- fprintf(stderr, "%s: sqe submit failed: %d\n", __FUNCTION__, ret);
927
- goto err;
928
- }
929
-
930
- for (i = 0; i < 3; i++) {
931
- ret = io_uring_wait_cqe(ring, &cqe);
932
- if (ret < 0) {
933
- fprintf(stderr, "%s: wait completion %d\n", __FUNCTION__, ret);
934
- goto err;
935
- }
936
-
937
- if (cqe->res == -EINVAL) {
938
- if (!i)
939
- fprintf(stdout, "%s: timeout flags not supported\n",
940
- __FUNCTION__);
941
- io_uring_cqe_seen(ring, cqe);
942
- continue;
943
- }
944
-
945
- switch (cqe->user_data) {
946
- case 1:
947
- case 2:
948
- if (cqe->res != -ETIME) {
949
- fprintf(stderr, "%s: got %d, wanted %d\n",
950
- __FUNCTION__, cqe->res, -ETIME);
951
- goto err;
952
- }
953
- break;
954
- case 3:
955
- if (cqe->res != -ECANCELED) {
956
- fprintf(stderr, "%s: got %d, wanted %d\n",
957
- __FUNCTION__, cqe->res,
958
- -ECANCELED);
959
- goto err;
960
- }
961
- break;
962
- }
963
- io_uring_cqe_seen(ring, cqe);
964
- }
965
-
966
- return 0;
967
- err:
968
- return 1;
969
- }
970
-
971
- static int test_update_timeout(struct io_uring *ring, unsigned long ms,
972
- bool abs, bool async, bool linked)
973
- {
974
- struct io_uring_sqe *sqe;
975
- struct io_uring_cqe *cqe;
976
- struct __kernel_timespec ts, ts_upd;
977
- unsigned long long exp_ms, base_ms = 10000;
978
- struct timeval tv;
979
- int ret, i, nr = 2;
980
- __u32 mode = abs ? IORING_TIMEOUT_ABS : 0;
981
-
982
- msec_to_ts(&ts_upd, ms);
983
- gettimeofday(&tv, NULL);
984
-
985
- sqe = io_uring_get_sqe(ring);
986
- if (!sqe) {
987
- fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__);
988
- goto err;
989
- }
990
- msec_to_ts(&ts, base_ms);
991
- io_uring_prep_timeout(sqe, &ts, 0, 0);
992
- sqe->user_data = 1;
993
-
994
- if (linked) {
995
- sqe = io_uring_get_sqe(ring);
996
- if (!sqe) {
997
- fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__);
998
- goto err;
999
- }
1000
- io_uring_prep_nop(sqe);
1001
- sqe->user_data = 3;
1002
- sqe->flags = IOSQE_IO_LINK;
1003
- if (async)
1004
- sqe->flags |= IOSQE_ASYNC;
1005
- nr++;
1006
- }
1007
-
1008
- sqe = io_uring_get_sqe(ring);
1009
- if (!sqe) {
1010
- fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__);
1011
- goto err;
1012
- }
1013
- io_uring_prep_timeout_update(sqe, &ts_upd, 1, mode);
1014
- sqe->user_data = 2;
1015
- if (async)
1016
- sqe->flags |= IOSQE_ASYNC;
1017
-
1018
- ret = io_uring_submit(ring);
1019
- if (ret != nr) {
1020
- fprintf(stderr, "%s: sqe submit failed: %d\n", __FUNCTION__, ret);
1021
- goto err;
1022
- }
1023
-
1024
- for (i = 0; i < nr; i++) {
1025
- ret = io_uring_wait_cqe(ring, &cqe);
1026
- if (ret < 0) {
1027
- fprintf(stderr, "%s: wait completion %d\n", __FUNCTION__, ret);
1028
- goto err;
1029
- }
1030
-
1031
- switch (cqe->user_data) {
1032
- case 1:
1033
- if (cqe->res != -ETIME) {
1034
- fprintf(stderr, "%s: got %d, wanted %d\n",
1035
- __FUNCTION__, cqe->res, -ETIME);
1036
- goto err;
1037
- }
1038
- break;
1039
- case 2:
1040
- if (cqe->res != 0) {
1041
- fprintf(stderr, "%s: got %d, wanted %d\n",
1042
- __FUNCTION__, cqe->res,
1043
- 0);
1044
- goto err;
1045
- }
1046
- break;
1047
- case 3:
1048
- if (cqe->res != 0) {
1049
- fprintf(stderr, "nop failed\n");
1050
- goto err;
1051
- }
1052
- break;
1053
- default:
1054
- goto err;
1055
- }
1056
- io_uring_cqe_seen(ring, cqe);
1057
- }
1058
-
1059
- exp_ms = mtime_since_now(&tv);
1060
- if (exp_ms >= base_ms / 2) {
1061
- fprintf(stderr, "too long, timeout wasn't updated\n");
1062
- goto err;
1063
- }
1064
- if (ms >= 1000 && !abs && exp_ms < ms / 2) {
1065
- fprintf(stderr, "fired too early, potentially updated to 0 ms"
1066
- "instead of %lu\n", ms);
1067
- goto err;
1068
- }
1069
- return 0;
1070
- err:
1071
- return 1;
1072
- }
1073
-
1074
- static int test_update_nonexistent_timeout(struct io_uring *ring)
1075
- {
1076
- struct io_uring_sqe *sqe;
1077
- struct io_uring_cqe *cqe;
1078
- struct __kernel_timespec ts;
1079
- int ret;
1080
-
1081
- sqe = io_uring_get_sqe(ring);
1082
- if (!sqe) {
1083
- fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__);
1084
- goto err;
1085
- }
1086
- msec_to_ts(&ts, 0);
1087
- io_uring_prep_timeout_update(sqe, &ts, 42, 0);
1088
-
1089
- ret = io_uring_submit(ring);
1090
- if (ret != 1) {
1091
- fprintf(stderr, "%s: sqe submit failed: %d\n", __FUNCTION__, ret);
1092
- goto err;
1093
- }
1094
-
1095
- ret = io_uring_wait_cqe(ring, &cqe);
1096
- if (ret < 0) {
1097
- fprintf(stderr, "%s: wait completion %d\n", __FUNCTION__, ret);
1098
- goto err;
1099
- }
1100
-
1101
- ret = cqe->res;
1102
- if (ret == -ENOENT)
1103
- ret = 0;
1104
- io_uring_cqe_seen(ring, cqe);
1105
- return ret;
1106
- err:
1107
- return 1;
1108
- }
1109
-
1110
- static int test_update_invalid_flags(struct io_uring *ring)
1111
- {
1112
- struct io_uring_sqe *sqe;
1113
- struct io_uring_cqe *cqe;
1114
- struct __kernel_timespec ts;
1115
- int ret;
1116
-
1117
- sqe = io_uring_get_sqe(ring);
1118
- if (!sqe) {
1119
- fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__);
1120
- goto err;
1121
- }
1122
- io_uring_prep_timeout_remove(sqe, 0, IORING_TIMEOUT_ABS);
1123
-
1124
- ret = io_uring_submit(ring);
1125
- if (ret != 1) {
1126
- fprintf(stderr, "%s: sqe submit failed: %d\n", __FUNCTION__, ret);
1127
- goto err;
1128
- }
1129
-
1130
- ret = io_uring_wait_cqe(ring, &cqe);
1131
- if (ret < 0) {
1132
- fprintf(stderr, "%s: wait completion %d\n", __FUNCTION__, ret);
1133
- goto err;
1134
- }
1135
- if (cqe->res != -EINVAL) {
1136
- fprintf(stderr, "%s: got %d, wanted %d\n",
1137
- __FUNCTION__, cqe->res, -EINVAL);
1138
- goto err;
1139
- }
1140
- io_uring_cqe_seen(ring, cqe);
1141
-
1142
-
1143
- sqe = io_uring_get_sqe(ring);
1144
- if (!sqe) {
1145
- fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__);
1146
- goto err;
1147
- }
1148
- msec_to_ts(&ts, 0);
1149
- io_uring_prep_timeout_update(sqe, &ts, 0, -1);
1150
-
1151
- ret = io_uring_submit(ring);
1152
- if (ret != 1) {
1153
- fprintf(stderr, "%s: sqe submit failed: %d\n", __FUNCTION__, ret);
1154
- goto err;
1155
- }
1156
-
1157
- ret = io_uring_wait_cqe(ring, &cqe);
1158
- if (ret < 0) {
1159
- fprintf(stderr, "%s: wait completion %d\n", __FUNCTION__, ret);
1160
- goto err;
1161
- }
1162
- if (cqe->res != -EINVAL) {
1163
- fprintf(stderr, "%s: got %d, wanted %d\n",
1164
- __FUNCTION__, cqe->res, -EINVAL);
1165
- goto err;
1166
- }
1167
- io_uring_cqe_seen(ring, cqe);
1168
-
1169
- return 0;
1170
- err:
1171
- return 1;
1172
- }
1173
-
1174
- int main(int argc, char *argv[])
1175
- {
1176
- struct io_uring ring, sqpoll_ring;
1177
- bool has_timeout_update, sqpoll;
1178
- struct io_uring_params p = { };
1179
- int ret;
1180
-
1181
- if (argc > 1)
1182
- return 0;
1183
-
1184
- ret = io_uring_queue_init_params(8, &ring, &p);
1185
- if (ret) {
1186
- fprintf(stderr, "ring setup failed\n");
1187
- return 1;
1188
- }
1189
-
1190
- ret = io_uring_queue_init(8, &sqpoll_ring, IORING_SETUP_SQPOLL);
1191
- sqpoll = !ret;
1192
-
1193
- ret = test_single_timeout(&ring);
1194
- if (ret) {
1195
- fprintf(stderr, "test_single_timeout failed\n");
1196
- return ret;
1197
- }
1198
- if (not_supported)
1199
- return 0;
1200
-
1201
- ret = test_multi_timeout(&ring);
1202
- if (ret) {
1203
- fprintf(stderr, "test_multi_timeout failed\n");
1204
- return ret;
1205
- }
1206
-
1207
- ret = test_single_timeout_abs(&ring);
1208
- if (ret) {
1209
- fprintf(stderr, "test_single_timeout_abs failed\n");
1210
- return ret;
1211
- }
1212
-
1213
- ret = test_single_timeout_remove(&ring);
1214
- if (ret) {
1215
- fprintf(stderr, "test_single_timeout_remove failed\n");
1216
- return ret;
1217
- }
1218
-
1219
- ret = test_single_timeout_remove_notfound(&ring);
1220
- if (ret) {
1221
- fprintf(stderr, "test_single_timeout_remove_notfound failed\n");
1222
- return ret;
1223
- }
1224
-
1225
- ret = test_single_timeout_many(&ring);
1226
- if (ret) {
1227
- fprintf(stderr, "test_single_timeout_many failed\n");
1228
- return ret;
1229
- }
1230
-
1231
- ret = test_single_timeout_nr(&ring, 1);
1232
- if (ret) {
1233
- fprintf(stderr, "test_single_timeout_nr(1) failed\n");
1234
- return ret;
1235
- }
1236
- ret = test_single_timeout_nr(&ring, 2);
1237
- if (ret) {
1238
- fprintf(stderr, "test_single_timeout_nr(2) failed\n");
1239
- return ret;
1240
- }
1241
-
1242
- ret = test_multi_timeout_nr(&ring);
1243
- if (ret) {
1244
- fprintf(stderr, "test_multi_timeout_nr failed\n");
1245
- return ret;
1246
- }
1247
-
1248
- ret = test_timeout_flags1(&ring);
1249
- if (ret) {
1250
- fprintf(stderr, "test_timeout_flags1 failed\n");
1251
- return ret;
1252
- }
1253
-
1254
- ret = test_timeout_flags2(&ring);
1255
- if (ret) {
1256
- fprintf(stderr, "test_timeout_flags2 failed\n");
1257
- return ret;
1258
- }
1259
-
1260
- ret = test_timeout_flags3(&ring);
1261
- if (ret) {
1262
- fprintf(stderr, "test_timeout_flags3 failed\n");
1263
- return ret;
1264
- }
1265
-
1266
- ret = test_single_timeout_wait(&ring, &p);
1267
- if (ret) {
1268
- fprintf(stderr, "test_single_timeout_wait failed\n");
1269
- return ret;
1270
- }
1271
-
1272
- /* io_uring_wait_cqes() may have left a timeout, reinit ring */
1273
- io_uring_queue_exit(&ring);
1274
- ret = io_uring_queue_init(8, &ring, 0);
1275
- if (ret) {
1276
- fprintf(stderr, "ring setup failed\n");
1277
- return 1;
1278
- }
1279
-
1280
- ret = test_update_nonexistent_timeout(&ring);
1281
- has_timeout_update = (ret != -EINVAL);
1282
- if (has_timeout_update) {
1283
- if (ret) {
1284
- fprintf(stderr, "test_update_nonexistent_timeout failed\n");
1285
- return ret;
1286
- }
1287
-
1288
- ret = test_update_invalid_flags(&ring);
1289
- if (ret) {
1290
- fprintf(stderr, "test_update_invalid_flags failed\n");
1291
- return ret;
1292
- }
1293
-
1294
- ret = test_update_timeout(&ring, 0, false, false, false);
1295
- if (ret) {
1296
- fprintf(stderr, "test_update_timeout failed\n");
1297
- return ret;
1298
- }
1299
-
1300
- ret = test_update_timeout(&ring, 1, false, false, false);
1301
- if (ret) {
1302
- fprintf(stderr, "test_update_timeout 1ms failed\n");
1303
- return ret;
1304
- }
1305
-
1306
- ret = test_update_timeout(&ring, 1000, false, false, false);
1307
- if (ret) {
1308
- fprintf(stderr, "test_update_timeout 1s failed\n");
1309
- return ret;
1310
- }
1311
-
1312
- ret = test_update_timeout(&ring, 0, true, true, false);
1313
- if (ret) {
1314
- fprintf(stderr, "test_update_timeout abs failed\n");
1315
- return ret;
1316
- }
1317
-
1318
-
1319
- ret = test_update_timeout(&ring, 0, false, true, false);
1320
- if (ret) {
1321
- fprintf(stderr, "test_update_timeout async failed\n");
1322
- return ret;
1323
- }
1324
-
1325
- ret = test_update_timeout(&ring, 0, false, false, true);
1326
- if (ret) {
1327
- fprintf(stderr, "test_update_timeout linked failed\n");
1328
- return ret;
1329
- }
1330
-
1331
- if (sqpoll) {
1332
- ret = test_update_timeout(&sqpoll_ring, 0, false, false,
1333
- false);
1334
- if (ret) {
1335
- fprintf(stderr, "test_update_timeout sqpoll"
1336
- "failed\n");
1337
- return ret;
1338
- }
1339
- }
1340
- }
1341
-
1342
- /*
1343
- * this test must go last, it kills the ring
1344
- */
1345
- ret = test_single_timeout_exit(&ring);
1346
- if (ret) {
1347
- fprintf(stderr, "test_single_timeout_exit failed\n");
1348
- return ret;
1349
- }
1350
-
1351
- if (sqpoll)
1352
- io_uring_queue_exit(&sqpoll_ring);
1353
- return 0;
1354
- }