Skip to content

Commit 9f0a393

Browse files
committed
fix
1 parent 2292d06 commit 9f0a393

12 files changed

+261
-111
lines changed

.vscode/settings.json

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
11
{
2-
"thunder-client.saveToWorkspace": true
2+
"thunder-client.saveToWorkspace": true,
3+
"files.associations": {
4+
"uio.h": "c",
5+
"data.private.h": "c",
6+
"string.h": "c",
7+
"stdio.h": "c"
8+
}
39
}

Makefile

-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ debug_kadb: src/data.c src/socket.c src/ring.c src/main.c
1212
test: test_data kadb
1313
./test_data
1414
diff data.dot data.ground.dot
15-
./correct_test.sh
1615

1716
debug_test: debug_test_data
1817

correct_test.sh

-13
This file was deleted.

data.ground.dot

+13-13
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,26 @@
11
digraph {
2-
p[shape=record,label="{key=p|max_items=0000000000000001|n_items=0000000000000001|height=0000000000000004|acc_lens=0000000000000005|raw=dummy}"]
3-
n[shape=record,label="{key=n|max_items=0000000000000001|n_items=0000000000000001|height=0000000000000002|acc_lens=0000000000000005|raw=dummy}"]
4-
b[shape=record,label="{key=b|max_items=0000000000000001|n_items=0000000000000001|height=0000000000000001|acc_lens=0000000000000002|raw=12}"]
5-
a[shape=record,label="{key=a|max_items=0000000000000001|n_items=0000000000000001|height=0000000000000000|acc_lens=0000000000000001|raw=1}"]
2+
p[shape=record,label="{key=p|max_items=0000000000000001|n_items=0000000000000001|height=0000000000000004|acc_lens=0000000000000006|raw=+dummy}"]
3+
n[shape=record,label="{key=n|max_items=0000000000000001|n_items=0000000000000001|height=0000000000000002|acc_lens=0000000000000006|raw=+dummy}"]
4+
b[shape=record,label="{key=b|max_items=0000000000000001|n_items=0000000000000001|height=0000000000000001|acc_lens=0000000000000003|raw=+12}"]
5+
a[shape=record,label="{key=a|max_items=0000000000000001|n_items=0000000000000001|height=0000000000000000|acc_lens=0000000000000002|raw=+1}"]
66
b -> a
7-
m[shape=record,label="{key=m|max_items=0000000000000001|n_items=0000000000000001|height=0000000000000000|acc_lens=0000000000000005|raw=dummy}"]
7+
m[shape=record,label="{key=m|max_items=0000000000000001|n_items=0000000000000001|height=0000000000000000|acc_lens=0000000000000006|raw=+dummy}"]
88
b -> m
99
n -> b
10-
o[shape=record,label="{key=o|max_items=0000000000000001|n_items=0000000000000001|height=0000000000000000|acc_lens=0000000000000005|raw=dummy}"]
10+
o[shape=record,label="{key=o|max_items=0000000000000001|n_items=0000000000000001|height=0000000000000000|acc_lens=0000000000000006|raw=+dummy}"]
1111
n -> o
1212
p -> n
13-
cd[shape=record,label="{key=cd|max_items=0000000000000004|n_items=0000000000000003|height=0000000000000003|acc_lens=00000000000000030000000000000007000000000000000c|raw=3456789dummy}"]
14-
r[shape=record,label="{key=r|max_items=0000000000000001|n_items=0000000000000001|height=0000000000000002|acc_lens=0000000000000005|raw=dummy}"]
15-
q[shape=record,label="{key=q|max_items=0000000000000001|n_items=0000000000000001|height=0000000000000000|acc_lens=0000000000000005|raw=dummy}"]
13+
cd[shape=record,label="{key=cd|max_items=0000000000000004|n_items=0000000000000003|height=0000000000000003|acc_lens=00000000000000040000000000000009000000000000000f|raw=+345+6789+dummy}"]
14+
r[shape=record,label="{key=r|max_items=0000000000000001|n_items=0000000000000001|height=0000000000000002|acc_lens=0000000000000006|raw=+dummy}"]
15+
q[shape=record,label="{key=q|max_items=0000000000000001|n_items=0000000000000001|height=0000000000000000|acc_lens=0000000000000006|raw=+dummy}"]
1616
r -> q
17-
s[shape=record,label="{key=s|max_items=0000000000000001|n_items=0000000000000001|height=0000000000000001|acc_lens=0000000000000005|raw=dummy}"]
18-
t[shape=record,label="{key=t|max_items=0000000000000001|n_items=0000000000000001|height=0000000000000000|acc_lens=0000000000000005|raw=dummy}"]
17+
s[shape=record,label="{key=s|max_items=0000000000000001|n_items=0000000000000001|height=0000000000000001|acc_lens=0000000000000006|raw=+dummy}"]
18+
t[shape=record,label="{key=t|max_items=0000000000000001|n_items=0000000000000001|height=0000000000000000|acc_lens=0000000000000006|raw=+dummy}"]
1919
s -> t
2020
r -> s
2121
cd -> r
22-
efg[shape=record,label="{key=efg|max_items=0000000000000001|n_items=0000000000000001|height=0000000000000001|acc_lens=0000000000000005|raw=dummy}"]
23-
hijk[shape=record,label="{key=hijk|max_items=0000000000000001|n_items=0000000000000001|height=0000000000000000|acc_lens=0000000000000005|raw=dummy}"]
22+
efg[shape=record,label="{key=efg|max_items=0000000000000001|n_items=0000000000000001|height=0000000000000001|acc_lens=0000000000000006|raw=+dummy}"]
23+
hijk[shape=record,label="{key=hijk|max_items=0000000000000001|n_items=0000000000000001|height=0000000000000000|acc_lens=0000000000000006|raw=+dummy}"]
2424
efg -> hijk
2525
cd -> efg
2626
p -> cd

dev.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ cycle() {
77
}
88

99
cycle
10-
while inotifywait -e close_write src include test Makefile *_test.sh; do
10+
while inotifywait -e close_write src include test Makefile; do
1111
cycle
1212
done

include/types.h

-2
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55

66
typedef struct
77
{
8-
size_t total_n_items;
98
size_t n_items;
10-
struct iovec acc_lens;
119
struct iovec raw;
1210
} DataGetResult;

src/data.c

+22-21
Original file line numberDiff line numberDiff line change
@@ -97,11 +97,15 @@ Node *new_node(
9797
.max_items = 1,
9898
.n_items = 1,
9999
.acc_lens = malloc(sizeof(size_t)),
100-
.raw = {.iov_len = value.iov_len, .iov_base = malloc(value.iov_len)},
100+
.raw = {
101+
.iov_len = value.iov_len + 1,
102+
.iov_base = malloc(value.iov_len + 1),
103+
},
101104
}};
102105
memcpy(node->key.iov_base, key.iov_base, key.iov_len);
103-
memcpy(node->array.raw.iov_base, value.iov_base, value.iov_len);
104-
node->array.acc_lens[0] = value.iov_len;
106+
((uint8_t *)node->array.raw.iov_base)[0] = '+';
107+
memcpy(node->array.raw.iov_base + 1, value.iov_base, value.iov_len);
108+
node->array.acc_lens[0] = value.iov_len + 1;
105109
return node;
106110
}
107111

@@ -119,7 +123,7 @@ Node *put(
119123
{
120124
Array *array = &node->array;
121125
array->n_items++;
122-
while (array->n_items > array->max_items)
126+
while (array->max_items < array->n_items)
123127
{
124128
array->max_items *= 2;
125129
array->acc_lens = realloc(
@@ -131,17 +135,18 @@ Node *put(
131135
array->n_items > 1
132136
? array->acc_lens[array->n_items - 2]
133137
: 0,
134-
acc_len = previous_acc_len + value.iov_len;
135-
while (acc_len > array->raw.iov_len)
138+
acc_len = previous_acc_len + value.iov_len + 1;
139+
while (array->raw.iov_len < acc_len)
136140
{
137141
array->raw.iov_len *= 2;
138142
array->raw.iov_base = realloc(
139143
array->raw.iov_base,
140144
array->raw.iov_len * sizeof(uint8_t));
141145
}
142146
array->acc_lens[array->n_items - 1] = acc_len;
147+
((uint8_t *)node->array.raw.iov_base)[previous_acc_len] = '+';
143148
memcpy(
144-
array->raw.iov_base + previous_acc_len,
149+
array->raw.iov_base + previous_acc_len + 1,
145150
value.iov_base,
146151
value.iov_len);
147152
}
@@ -182,7 +187,6 @@ void data_put(
182187

183188
const DataGetResult empty_result = {
184189
.n_items = 0,
185-
.acc_lens = {.iov_base = NULL, .iov_len = 0},
186190
.raw = {.iov_base = NULL, .iov_len = 0}};
187191

188192
const DataGetResult data_get(
@@ -209,25 +213,22 @@ const DataGetResult data_get(
209213
}
210214
if (node)
211215
{
216+
if (offset >= node->array.n_items || n_items <= 0)
217+
{
218+
return empty_result;
219+
}
212220
const size_t
213-
result_offset = MIN(offset, node->array.n_items - 1),
214221
to = MIN(offset + n_items, node->array.n_items),
215-
result_n_items = to - result_offset,
216-
data_offset =
217-
result_offset == 0
222+
raw_offset =
223+
offset == 0
218224
? 0
219-
: node->array.acc_lens[result_offset - 1],
220-
raw_len = node->array.acc_lens[to - 1] - data_offset;
225+
: node->array.acc_lens[offset - 1],
226+
raw_len = node->array.acc_lens[to - 1] - raw_offset;
221227
return (DataGetResult){
222-
.total_n_items = node->array.n_items,
223-
.n_items = result_n_items,
224-
.acc_lens = {
225-
.iov_len = result_n_items * sizeof(size_t),
226-
.iov_base = node->array.acc_lens + offset},
228+
.n_items = node->array.n_items,
227229
.raw = {
228230
.iov_len = raw_len,
229-
.iov_base = node->array.raw.iov_base + data_offset,
230-
}};
231+
.iov_base = node->array.raw.iov_base + raw_offset}};
231232
}
232233
return empty_result;
233234
}

src/main.c

+32-32
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,38 @@ int handle_request(
6363
{
6464
return ring_read(socket, ACTION_LEN, req);
6565
}
66+
// GET
67+
if (iovcmp(req, GET) == 0)
68+
{
69+
return ring_read(socket, GET_META_SIZE, req);
70+
}
71+
if (iovncmp(req, GET, ACTION_LEN) == 0 &&
72+
req.iov_len == ACTION_LEN + GET_META_SIZE)
73+
{
74+
const GetMeta *meta = req.iov_base + ACTION_LEN;
75+
if (meta->slash_1 == '/' &&
76+
meta->slash_2 == '/' &&
77+
meta->slash_3 == '/' &&
78+
meta->slash_4 == '/')
79+
{
80+
return ring_read(socket, strntoul(meta->key_len), req);
81+
}
82+
}
83+
if (iovncmp(req, GET, ACTION_LEN) == 0 &&
84+
req.iov_len > ACTION_LEN + GET_META_SIZE)
85+
{
86+
const GetMeta *meta = req.iov_base + ACTION_LEN;
87+
const DataGetResult result = data_get(
88+
(const struct iovec){
89+
.iov_len = strntoul(meta->key_len),
90+
.iov_base =
91+
req.iov_base +
92+
ACTION_LEN +
93+
GET_META_SIZE},
94+
strntoul(meta->offset),
95+
strntoul(meta->n_items));
96+
return ring_write_data(socket, result);
97+
}
6698
// PUT
6799
if (iovcmp(req, PUT) == 0)
68100
{
@@ -102,38 +134,6 @@ int handle_request(
102134
strntoul(meta->key_len)});
103135
return ring_write_no_content(socket);
104136
}
105-
// GET
106-
if (iovcmp(req, GET) == 0)
107-
{
108-
return ring_read(socket, GET_META_SIZE, req);
109-
}
110-
if (iovncmp(req, GET, ACTION_LEN) == 0 &&
111-
req.iov_len == ACTION_LEN + GET_META_SIZE)
112-
{
113-
const GetMeta *meta = req.iov_base + ACTION_LEN;
114-
if (meta->slash_1 == '/' &&
115-
meta->slash_2 == '/' &&
116-
meta->slash_3 == '/' &&
117-
meta->slash_4 == '/')
118-
{
119-
return ring_read(socket, strntoul(meta->key_len), req);
120-
}
121-
}
122-
if (iovncmp(req, GET, ACTION_LEN) == 0 &&
123-
req.iov_len > ACTION_LEN + GET_META_SIZE)
124-
{
125-
const GetMeta *meta = req.iov_base + ACTION_LEN;
126-
const DataGetResult result = data_get(
127-
(const struct iovec){
128-
.iov_len = strntoul(meta->key_len),
129-
.iov_base =
130-
req.iov_base +
131-
ACTION_LEN +
132-
GET_META_SIZE},
133-
strntoul(meta->offset),
134-
strntoul(meta->n_items));
135-
return ring_write_data(socket, result);
136-
}
137137
return ring_write_bad_request(socket);
138138
}
139139

src/ring.c

+3-8
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ typedef struct
4141
{
4242
EventReadWrite parent;
4343
struct iovec header;
44-
struct iovec acc_lens;
4544
struct iovec raw;
4645
} EventWriteData;
4746

@@ -82,7 +81,6 @@ int ring_read(
8281
event->parent.parent.data.iov_base,
8382
data.iov_base,
8483
data.iov_len);
85-
8684
struct io_uring_sqe *sqe = io_uring_get_sqe(&ring);
8785
io_uring_prep_read(
8886
sqe,
@@ -201,9 +199,8 @@ int ring_write_no_content(int socket)
201199

202200
uint8_t DATA_FMT[] =
203201
"HTTP/1.0 200 OK\r\n"
204-
"Content-Type: application/octet-stream\r\n"
202+
"Content-Type: plain/text\r\n"
205203
"Content-Length: %zu\r\n"
206-
"Kadb-total_n_items: %zu\r\n"
207204
"Kadb-n_items: %zu\r\n\r\n";
208205

209206
int ring_write_data(
@@ -214,8 +211,7 @@ int ring_write_data(
214211
sprintf(
215212
header,
216213
DATA_FMT,
217-
result.acc_lens.iov_len + result.raw.iov_len,
218-
result.total_n_items,
214+
result.raw.iov_len,
219215
result.n_items);
220216
EventWriteData *write = malloc(sizeof(EventWriteData));
221217
*write = (EventWriteData){
@@ -224,14 +220,13 @@ int ring_write_data(
224220
.header = {
225221
.iov_len = strlen(header),
226222
.iov_base = header},
227-
.acc_lens = result.acc_lens,
228223
.raw = result.raw};
229224
struct io_uring_sqe *sqe = io_uring_get_sqe(&ring);
230225
io_uring_prep_writev(
231226
sqe,
232227
write->parent.socket,
233228
&write->header,
234-
3,
229+
2,
235230
0);
236231
io_uring_sqe_set_data(sqe, write);
237232
return io_uring_submit(&ring);

test/data.c

+4-10
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
void result_cmp(const DataGetResult a, const DataGetResult b)
1010
{
1111
assert(a.n_items == b.n_items);
12-
assert(iovcmp(a.acc_lens, b.acc_lens) == 0);
1312
assert(iovcmp(a.raw, b.raw) == 0);
1413
}
1514

@@ -45,24 +44,19 @@ int main()
4544
data_get(data_vec("d"), 1, 3),
4645
(const DataGetResult){
4746
.n_items = 0,
48-
.acc_lens = {.iov_len = 0, .iov_base = NULL},
4947
.raw = {.iov_len = 0, .iov_base = NULL}});
5048

5149
// get 2 items
52-
size_t acc_lens_1[2] = {3, 7};
5350
result_cmp(
5451
data_get(data_vec("cd"), 0, 2),
5552
(const DataGetResult){
56-
.n_items = 2,
57-
.acc_lens = {.iov_len = 2 * sizeof(size_t), .iov_base = acc_lens_1},
58-
.raw = data_vec("3456789")});
53+
.n_items = 3,
54+
.raw = data_vec("+345+6789")});
5955

6056
// get 2 items with invalid len
61-
size_t acc_lens_2[2] = {7, 12};
6257
result_cmp(
6358
data_get(data_vec("cd"), 1, 3),
6459
(const DataGetResult){
65-
.n_items = 2,
66-
.acc_lens = {.iov_len = 2 * sizeof(size_t), .iov_base = acc_lens_2},
67-
.raw = data_vec("6789dummy")});
60+
.n_items = 3,
61+
.raw = data_vec("+6789+dummy")});
6862
}

thunder-tests/thunderCollection.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"colName": "kadb",
55
"created": "2022-09-10T02:06:30.529Z",
66
"sortNum": 10000,
7-
"folders": []
7+
"folders": [],
8+
"settings": {}
89
}
910
]

0 commit comments

Comments
 (0)