]>
Commit | Line | Data |
---|---|---|
20effc67 TL |
1 | #!/usr/bin/env bash |
2 | ||
3 | set -ex | |
4 | ||
5 | rbd create --size 256 img | |
6 | ||
7 | IMAGE_SIZE=$(rbd info --format=json img | python3 -c 'import sys, json; print(json.load(sys.stdin)["size"])') | |
8 | OBJECT_SIZE=$(rbd info --format=json img | python3 -c 'import sys, json; print(json.load(sys.stdin)["object_size"])') | |
9 | NUM_OBJECTS=$((IMAGE_SIZE / OBJECT_SIZE)) | |
10 | [[ $((IMAGE_SIZE % OBJECT_SIZE)) -eq 0 ]] | |
11 | OP_SIZE=16384 | |
12 | ||
13 | DEV=$(sudo rbd map img) | |
14 | { | |
15 | for ((i = 0; i < $NUM_OBJECTS; i++)); do | |
16 | echo pwrite -b $OP_SIZE -S $i $((i * OBJECT_SIZE)) $OP_SIZE | |
17 | done | |
18 | echo fsync | |
19 | echo quit | |
20 | } | xfs_io $DEV | |
21 | sudo rbd unmap $DEV | |
22 | ||
23 | g++ -xc++ -o racereads - -lpthread <<EOF | |
24 | #include <assert.h> | |
25 | #include <fcntl.h> | |
26 | #include <stdlib.h> | |
27 | #include <sys/types.h> | |
28 | #include <sys/stat.h> | |
29 | #include <unistd.h> | |
30 | ||
31 | #include <thread> | |
32 | #include <vector> | |
33 | ||
34 | const int object_size = $OBJECT_SIZE; | |
35 | const int num_objects = $NUM_OBJECTS; | |
36 | const int read_len = $OP_SIZE; | |
37 | const int num_reads = 1024; | |
38 | ||
39 | int main() { | |
40 | int fd = open("$DEV", O_DIRECT | O_RDONLY); | |
41 | assert(fd >= 0); | |
42 | ||
43 | void *buf; | |
44 | int r = posix_memalign(&buf, 512, read_len); | |
45 | assert(r == 0); | |
46 | ||
47 | std::vector<std::thread> threads; | |
48 | for (int i = 0; i < num_objects; i++) { | |
49 | threads.emplace_back( | |
50 | [fd, buf, read_off = static_cast<off_t>(i) * object_size]() { | |
51 | for (int i = 0; i < num_reads; i++) { | |
52 | auto len = pread(fd, buf, read_len, read_off); | |
53 | assert(len == read_len); | |
54 | } | |
55 | }); | |
56 | } | |
57 | ||
58 | for (auto &t : threads) { | |
59 | t.join(); | |
60 | } | |
61 | } | |
62 | EOF | |
63 | ||
64 | DEV=$(sudo rbd map -o ms_mode=legacy img) | |
65 | sudo dmesg -C | |
66 | ./racereads | |
67 | [[ $(dmesg | grep -c 'libceph: osd.* bad crc/signature') -gt 100 ]] | |
68 | sudo rbd unmap $DEV | |
69 | ||
70 | DEV=$(sudo rbd map -o ms_mode=legacy,rxbounce img) | |
71 | sudo dmesg -C | |
72 | ./racereads | |
73 | [[ $(dmesg | grep -c 'libceph: osd.* bad crc/signature') -eq 0 ]] | |
74 | sudo rbd unmap $DEV | |
75 | ||
76 | DEV=$(sudo rbd map -o ms_mode=crc img) | |
77 | sudo dmesg -C | |
78 | ./racereads | |
79 | [[ $(dmesg | grep -c 'libceph: osd.* integrity error') -gt 100 ]] | |
80 | sudo rbd unmap $DEV | |
81 | ||
82 | DEV=$(sudo rbd map -o ms_mode=crc,rxbounce img) | |
83 | sudo dmesg -C | |
84 | ./racereads | |
85 | [[ $(dmesg | grep -c 'libceph: osd.* integrity error') -eq 0 ]] | |
86 | sudo rbd unmap $DEV | |
87 | ||
88 | # rxbounce is a no-op for secure mode | |
89 | DEV=$(sudo rbd map -o ms_mode=secure img) | |
90 | sudo dmesg -C | |
91 | ./racereads | |
92 | [[ $(dmesg | grep -c 'libceph: osd.* integrity error') -eq 0 ]] | |
93 | sudo rbd unmap $DEV | |
94 | ||
95 | DEV=$(sudo rbd map -o ms_mode=secure,rxbounce img) | |
96 | sudo dmesg -C | |
97 | ./racereads | |
98 | [[ $(dmesg | grep -c 'libceph: osd.* integrity error') -eq 0 ]] | |
99 | sudo rbd unmap $DEV | |
100 | ||
101 | rbd rm img | |
102 | ||
103 | echo OK |