Skip to content

Commit c8f0146

Browse files
crud: do not change input tuple object
If crud request uses tuple as input argument (insert, upsert and replace operations) and its bucket_id is empty, the module will fill this field and damage input argument tuple. This patch fixes this behavior. After this patch, performance of insert, upsert and replace has decreased by 5%. Part of #212
1 parent 2454862 commit c8f0146

File tree

5 files changed

+57
-3
lines changed

5 files changed

+57
-3
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
2222
### Fixed
2323
* Fix processing storage error for tuple-merger implementation of
2424
select/pairs (#271).
25+
* Do not change input tuple object in requests.
2526

2627
## [0.10.0] - 01-12-21
2728

crud/insert.lua

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ end
4343
-- returns result, err, need_reload
4444
-- need_reload indicates if reloading schema could help
4545
-- see crud.common.schema.wrap_func_reload()
46-
local function call_insert_on_router(space_name, tuple, opts)
46+
local function call_insert_on_router(space_name, original_tuple, opts)
4747
dev_checks('string', 'table', {
4848
timeout = '?number',
4949
bucket_id = '?number|cdata',
@@ -58,6 +58,8 @@ local function call_insert_on_router(space_name, tuple, opts)
5858
return nil, InsertError:new("Space %q doesn't exist", space_name), true
5959
end
6060

61+
local tuple = table.deepcopy(original_tuple)
62+
6163
local bucket_id, err = sharding.tuple_set_and_return_bucket_id(tuple, space, opts.bucket_id)
6264
if err ~= nil then
6365
return nil, InsertError:new("Failed to get bucket ID: %s", err), true

crud/replace.lua

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ end
4343
-- returns result, err, need_reload
4444
-- need_reload indicates if reloading schema could help
4545
-- see crud.common.schema.wrap_func_reload()
46-
local function call_replace_on_router(space_name, tuple, opts)
46+
local function call_replace_on_router(space_name, original_tuple, opts)
4747
dev_checks('string', 'table', {
4848
timeout = '?number',
4949
bucket_id = '?number|cdata',
@@ -62,6 +62,8 @@ local function call_replace_on_router(space_name, tuple, opts)
6262
return nil, ReplaceError:new("Space %q doesn't exist", space_name), true
6363
end
6464

65+
local tuple = table.deepcopy(original_tuple)
66+
6567
local bucket_id, err = sharding.tuple_set_and_return_bucket_id(tuple, space, opts.bucket_id)
6668
if err ~= nil then
6769
return nil, ReplaceError:new("Failed to get bucket ID: %s", err), true

crud/upsert.lua

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ end
4141
-- returns result, err, need_reload
4242
-- need_reload indicates if reloading schema could help
4343
-- see crud.common.schema.wrap_func_reload()
44-
local function call_upsert_on_router(space_name, tuple, user_operations, opts)
44+
local function call_upsert_on_router(space_name, original_tuple, user_operations, opts)
4545
dev_checks('string', '?', 'table', {
4646
timeout = '?number',
4747
bucket_id = '?number|cdata',
@@ -69,6 +69,8 @@ local function call_upsert_on_router(space_name, tuple, user_operations, opts)
6969
end
7070
end
7171

72+
local tuple = table.deepcopy(original_tuple)
73+
7274
local bucket_id, err = sharding.tuple_set_and_return_bucket_id(tuple, space, opts.bucket_id)
7375
if err ~= nil then
7476
return nil, UpsertError:new("Failed to get bucket ID: %s", err), true

test/integration/simple_operations_test.lua

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1008,6 +1008,53 @@ pgroup.test_partial_result_bad_input = function(g)
10081008
t.assert_str_contains(err.err, 'Space format doesn\'t contain field named "lastname"')
10091009
end
10101010

1011+
pgroup.test_tuple_not_damaged = function(g)
1012+
-- insert
1013+
local insert_tuple = {22, box.NULL, 'Elizabeth', 24}
1014+
local new_insert_tuple, err = g.cluster.main_server:eval([[
1015+
local crud = require('crud')
1016+
1017+
local insert_tuple = ...
1018+
1019+
local _, err = crud.insert('customers', insert_tuple)
1020+
1021+
return insert_tuple, err
1022+
]], {insert_tuple})
1023+
1024+
t.assert_equals(err, nil)
1025+
t.assert_equals(new_insert_tuple, insert_tuple)
1026+
1027+
-- upsert
1028+
local upsert_tuple = {33, box.NULL, 'Peter', 35}
1029+
local new_upsert_tuple, err = g.cluster.main_server:eval([[
1030+
local crud = require('crud')
1031+
1032+
local upsert_tuple = ...
1033+
1034+
local _, err = crud.upsert('customers', upsert_tuple, {{'+', 'age', 1}})
1035+
1036+
return upsert_tuple, err
1037+
]], {upsert_tuple})
1038+
1039+
t.assert_equals(err, nil)
1040+
t.assert_equals(new_upsert_tuple, upsert_tuple)
1041+
1042+
-- replace
1043+
local replace_tuple = {22, box.NULL, 'Elizabeth', 24}
1044+
local new_replace_tuple, err = g.cluster.main_server:eval([[
1045+
local crud = require('crud')
1046+
1047+
local replace_tuple = ...
1048+
1049+
local _, err = crud.replace('customers', replace_tuple)
1050+
1051+
return replace_tuple, err
1052+
]], {replace_tuple})
1053+
1054+
t.assert_equals(err, nil)
1055+
t.assert_equals(new_replace_tuple, replace_tuple)
1056+
end
1057+
10111058
pgroup.test_opts_not_damaged = function(g)
10121059
-- insert
10131060
local insert_opts = {timeout = 1, bucket_id = 655, fields = {'name', 'age'}}

0 commit comments

Comments
 (0)