Skip to content

Commit 20fb7be

Browse files
borders: support mode
This patch follows the previous one. To stabilize tests, we perform read operations on masters. Now it is possible to perform min/max on write instances, and tests were updated to do so.
1 parent 7d2e91d commit 20fb7be

File tree

4 files changed

+93
-37
lines changed

4 files changed

+93
-37
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
77

88
## Unreleased
99

10+
### Added
11+
* `mode` option for `crud.min` and `crud.max` (#404).
12+
1013
### Fixed
1114
* Compatibility with vshard 0.1.25 `name_as_key` identification mode
1215
for Tarantool 3.0 (#403).

README.md

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1100,9 +1100,33 @@ See more examples of pairs queries [here.](https://github.com/tarantool/crud/blo
11001100

11011101
### Min and max
11021102

1103+
`CRUD` supports operations to get the minimum (maximum) object from the space index
1104+
1105+
```lua
1106+
local objects, err = crud.min(space_name, index_id, opts)
1107+
local objects, err = crud.max(space_name, index_id, opts)
1108+
```
1109+
1110+
where:
1111+
1112+
* `space_name` (`string`) - name of the space
1113+
* `index_id` (`?string|number`) - index name or index id. Primary index by default
1114+
* `opts`:
1115+
* `timeout` (`?number`) - `vshard.call` timeout (in seconds)
1116+
* `fields` (`?table`) - field names for getting only a subset of fields
1117+
* `mode` (`?string`, `read` or `write`) - if `write` is specified then `select` is
1118+
performed on master, default value is `read`
1119+
* `vshard_router` (`?string|table`) - Cartridge vshard group name or
1120+
vshard router instance. Set this parameter if your space is not
1121+
a part of the default vshard cluster
1122+
* `fetch_latest_metadata` (`?boolean`) - guarantees the
1123+
up-to-date metadata (space format) in first return value, otherwise
1124+
it may not take into account the latest migration of the data format.
1125+
Performance overhead is up to 15%. `false` by default
1126+
11031127
```lua
11041128
-- Find the minimum value in the specified index
1105-
local result, err = crud.min(space_name, 'age', opts)
1129+
local result, err = crud.min('customers', 'age')
11061130
---
11071131
- metadata:
11081132
- {'name': 'id', 'type': 'unsigned'}
@@ -1113,7 +1137,7 @@ local result, err = crud.min(space_name, 'age', opts)
11131137
- [1, 477, 'Elizabeth', 12]
11141138

11151139
-- Find the maximum value in the specified index
1116-
local result, err = crud.max(space_name, 'age', opts)
1140+
local result, err = crud.max('customers', 'age')
11171141
---
11181142
- metadata:
11191143
- {'name': 'id', 'type': 'unsigned'}

crud/borders.lua

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ local function call_get_border_on_router(vshard_router, border_name, space_name,
7272
checks('table', 'string', 'string', '?string|number', {
7373
timeout = '?number',
7474
fields = '?table',
75+
mode = '?string',
7576
vshard_router = '?string|table',
7677
fetch_latest_metadata = '?boolean',
7778
})
@@ -107,7 +108,7 @@ local function call_get_border_on_router(vshard_router, border_name, space_name,
107108
return nil, BorderError:new("Failed to get router replicasets: %s", err)
108109
end
109110
local call_opts = {
110-
mode = 'read',
111+
mode = opts.mode or 'read',
111112
replicasets = replicasets,
112113
timeout = opts.timeout,
113114
}

test/integration/borders_test.lua

Lines changed: 62 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -128,61 +128,73 @@ pgroup.test_min = function(g)
128128
table.sort(customers, function(obj1, obj2) return obj1.id < obj2.id end)
129129

130130
-- by primary
131-
local result, err = g.cluster.main_server.net_box:call('crud.min', {'customers'})
131+
local result, err = g.cluster.main_server.net_box:call('crud.min', {
132+
'customers', nil, {mode = 'write'},
133+
})
132134
t.assert_equals(err, nil)
133135
local objects = crud.unflatten_rows(result.rows, result.metadata)
134136
t.assert_equals(objects, helpers.get_objects_by_idxs(customers, {1}))
135137

136138
-- by primary, index ID is specified
137-
local result, err = g.cluster.main_server.net_box:call('crud.min', {'customers', 0})
139+
local result, err = g.cluster.main_server.net_box:call('crud.min', {
140+
'customers', 0, {mode = 'write'},
141+
})
138142
t.assert_equals(err, nil)
139143
local objects = crud.unflatten_rows(result.rows, result.metadata)
140144
t.assert_equals(objects, helpers.get_objects_by_idxs(customers, {1}))
141145

142146
-- by primary with fields
143-
local result, err = g.cluster.main_server.net_box:call('crud.min',
144-
{'customers', nil, {fields = {'name', 'last_name'}}}
145-
)
147+
local result, err = g.cluster.main_server.net_box:call('crud.min', {
148+
'customers', nil, {fields = {'name', 'last_name'}, mode = 'write'},
149+
})
146150
t.assert_equals(err, nil)
147151
local objects = crud.unflatten_rows(result.rows, result.metadata)
148152
t.assert_equals(objects, {{name = "Elizabeth", last_name = "Jackson"}})
149153

150154
-- by age index
151-
local result, err = g.cluster.main_server.net_box:call('crud.min', {'customers', 'age_index'})
155+
local result, err = g.cluster.main_server.net_box:call('crud.min', {
156+
'customers', 'age_index', {mode = 'write'},
157+
})
152158
t.assert_equals(err, nil)
153159
local objects = crud.unflatten_rows(result.rows, result.metadata)
154160
t.assert_equals(objects, helpers.get_objects_by_idxs(customers, {4}))
155161

156162
-- by age index, index ID is specified
157-
local result, err = g.cluster.main_server.net_box:call('crud.min', {'customers', 2})
163+
local result, err = g.cluster.main_server.net_box:call('crud.min', {
164+
'customers', 2, {mode = 'write'},
165+
})
158166
t.assert_equals(err, nil)
159167
local objects = crud.unflatten_rows(result.rows, result.metadata)
160168
t.assert_equals(objects, helpers.get_objects_by_idxs(customers, {4}))
161169

162170
-- by age index with fields
163-
local result, err = g.cluster.main_server.net_box:call('crud.min',
164-
{'customers', 'age_index', {fields = {'name', 'last_name'}}}
165-
)
171+
local result, err = g.cluster.main_server.net_box:call('crud.min', {
172+
'customers', 'age_index', {fields = {'name', 'last_name'}, mode = 'write'},
173+
})
166174
t.assert_equals(err, nil)
167175
local objects = crud.unflatten_rows(result.rows, result.metadata)
168176
t.assert_equals(objects, {{name = "William", last_name = "White"}})
169177

170178
-- by composite index full_name
171-
local result, err = g.cluster.main_server.net_box:call('crud.min', {'customers', 'full_name'})
179+
local result, err = g.cluster.main_server.net_box:call('crud.min', {
180+
'customers', 'full_name', {mode = 'write'},
181+
})
172182
t.assert_equals(err, nil)
173183
local objects = crud.unflatten_rows(result.rows, result.metadata)
174184
t.assert_equals(objects, helpers.get_objects_by_idxs(customers, {3}))
175185

176186
-- by composite index full_name, index ID is specified
177-
local result, err = g.cluster.main_server.net_box:call('crud.min', {'customers', 5})
187+
local result, err = g.cluster.main_server.net_box:call('crud.min', {
188+
'customers', 5, {mode = 'write'},
189+
})
178190
t.assert_equals(err, nil)
179191
local objects = crud.unflatten_rows(result.rows, result.metadata)
180192
t.assert_equals(objects, helpers.get_objects_by_idxs(customers, {3}))
181193

182194
-- by composite index full_name with fields
183-
local result, err = g.cluster.main_server.net_box:call('crud.min',
184-
{'customers', 'full_name', {fields = {'name', 'last_name'}}}
185-
)
195+
local result, err = g.cluster.main_server.net_box:call('crud.min', {
196+
'customers', 'full_name', {fields = {'name', 'last_name'}, mode = 'write'},
197+
})
186198
t.assert_equals(err, nil)
187199
local objects = crud.unflatten_rows(result.rows, result.metadata)
188200
t.assert_equals(objects, {{name = "David", last_name = "Smith"}})
@@ -208,61 +220,73 @@ pgroup.test_max = function(g)
208220
table.sort(customers, function(obj1, obj2) return obj1.id < obj2.id end)
209221

210222
-- by primary
211-
local result, err = g.cluster.main_server.net_box:call('crud.max', {'customers'})
223+
local result, err = g.cluster.main_server.net_box:call('crud.max', {
224+
'customers', nil, {mode = 'write'},
225+
})
212226
t.assert_equals(err, nil)
213227
local objects = crud.unflatten_rows(result.rows, result.metadata)
214228
t.assert_equals(objects, helpers.get_objects_by_idxs(customers, {4}))
215229

216230
-- by primary, index ID is specified
217-
local result, err = g.cluster.main_server.net_box:call('crud.max', {'customers', 0})
231+
local result, err = g.cluster.main_server.net_box:call('crud.max', {
232+
'customers', 0, {mode = 'write'},
233+
})
218234
t.assert_equals(err, nil)
219235
local objects = crud.unflatten_rows(result.rows, result.metadata)
220236
t.assert_equals(objects, helpers.get_objects_by_idxs(customers, {4}))
221237

222238
-- by primary with fields
223-
local result, err = g.cluster.main_server.net_box:call('crud.max',
224-
{'customers', nil, {fields = {'name', 'last_name'}}}
225-
)
239+
local result, err = g.cluster.main_server.net_box:call('crud.max', {
240+
'customers', nil, {fields = {'name', 'last_name'}, mode = 'write'}
241+
})
226242
t.assert_equals(err, nil)
227243
local objects = crud.unflatten_rows(result.rows, result.metadata)
228244
t.assert_equals(objects, {{name = "William", last_name = "White"}})
229245

230246
-- by age index
231-
local result, err = g.cluster.main_server.net_box:call('crud.max', {'customers', 'age_index'})
247+
local result, err = g.cluster.main_server.net_box:call('crud.max', {
248+
'customers', 'age_index', {mode = 'write'},
249+
})
232250
t.assert_equals(err, nil)
233251
local objects = crud.unflatten_rows(result.rows, result.metadata)
234252
t.assert_equals(objects, helpers.get_objects_by_idxs(customers, {2}))
235253

236254
-- by age index, index ID is specified
237-
local result, err = g.cluster.main_server.net_box:call('crud.max', {'customers', 2})
255+
local result, err = g.cluster.main_server.net_box:call('crud.max', {
256+
'customers', 2, {mode = 'write'},
257+
})
238258
t.assert_equals(err, nil)
239259
local objects = crud.unflatten_rows(result.rows, result.metadata)
240260
t.assert_equals(objects, helpers.get_objects_by_idxs(customers, {2}))
241261

242262
-- by age index with fields
243-
local result, err = g.cluster.main_server.net_box:call('crud.max',
244-
{'customers', 'age_index', {fields = {'name', 'last_name'}}}
245-
)
263+
local result, err = g.cluster.main_server.net_box:call('crud.max', {
264+
'customers', 'age_index', {fields = {'name', 'last_name'}, mode = 'write'},
265+
})
246266
t.assert_equals(err, nil)
247267
local objects = crud.unflatten_rows(result.rows, result.metadata)
248268
t.assert_equals(objects, {{name = "Mary", last_name = "Brown"}})
249269

250270
-- by composite index full_name
251-
local result, err = g.cluster.main_server.net_box:call('crud.max', {'customers', 'full_name'})
271+
local result, err = g.cluster.main_server.net_box:call('crud.max', {
272+
'customers', 'full_name', {mode = 'write'},
273+
})
252274
t.assert_equals(err, nil)
253275
local objects = crud.unflatten_rows(result.rows, result.metadata)
254276
t.assert_equals(objects, helpers.get_objects_by_idxs(customers, {4}))
255277

256278
-- by composite index full_name, index ID is specified
257-
local result, err = g.cluster.main_server.net_box:call('crud.max', {'customers', 5})
279+
local result, err = g.cluster.main_server.net_box:call('crud.max', {
280+
'customers', 5, {mode = 'write'},
281+
})
258282
t.assert_equals(err, nil)
259283
local objects = crud.unflatten_rows(result.rows, result.metadata)
260284
t.assert_equals(objects, helpers.get_objects_by_idxs(customers, {4}))
261285

262286
-- by composite index full_name with fields
263-
local result, err = g.cluster.main_server.net_box:call('crud.max',
264-
{'customers', 'full_name', {fields = {'name', 'last_name'}}}
265-
)
287+
local result, err = g.cluster.main_server.net_box:call('crud.max', {
288+
'customers', 'full_name', {fields = {'name', 'last_name'}, mode = 'write'},
289+
})
266290
t.assert_equals(err, nil)
267291
local objects = crud.unflatten_rows(result.rows, result.metadata)
268292
t.assert_equals(objects, {{name = "William", last_name = "White"}})
@@ -290,13 +314,17 @@ pgroup.test_equal_secondary_keys = function(g)
290314
table.sort(customers, function(obj1, obj2) return obj1.id < obj2.id end)
291315

292316
-- min
293-
local result, err = g.cluster.main_server.net_box:call('crud.min', {'customers', 'age_index'})
317+
local result, err = g.cluster.main_server.net_box:call('crud.min', {
318+
'customers', 'age_index', {mode = 'write'},
319+
})
294320
t.assert_equals(err, nil)
295321
local objects = crud.unflatten_rows(result.rows, result.metadata)
296322
t.assert_equals(objects, helpers.get_objects_by_idxs(customers, {1}))
297323

298324
-- max
299-
local result, err = g.cluster.main_server.net_box:call('crud.max', {'customers', 'age_index'})
325+
local result, err = g.cluster.main_server.net_box:call('crud.max', {
326+
'customers', 'age_index', {mode = 'write'},
327+
})
300328
t.assert_equals(err, nil)
301329
local objects = crud.unflatten_rows(result.rows, result.metadata)
302330
t.assert_equals(objects, helpers.get_objects_by_idxs(customers, {2}))
@@ -320,7 +348,7 @@ pgroup.test_opts_not_damaged = function(g)
320348
})
321349

322350
-- min
323-
local min_opts = {timeout = 1, fields = {'name', 'age'}}
351+
local min_opts = {timeout = 1, fields = {'name', 'age'}, mode = 'write'}
324352
local new_min_opts, err = g.cluster.main_server:eval([[
325353
local crud = require('crud')
326354
@@ -335,7 +363,7 @@ pgroup.test_opts_not_damaged = function(g)
335363
t.assert_equals(new_min_opts, min_opts)
336364

337365
-- max
338-
local max_opts = {timeout = 1, fields = {'name', 'age'}}
366+
local max_opts = {timeout = 1, fields = {'name', 'age'}, mode = 'write'}
339367
local new_max_opts, err = g.cluster.main_server:eval([[
340368
local crud = require('crud')
341369

0 commit comments

Comments
 (0)