1- --- module to call vshard.storage.bucket_ref / vshard.storage.bucket_unref
1+ --- Module to call vshard.storage.bucket_ref / vshard.storage.bucket_unref
22--- on write requests
33--- there are two modes: safe and fast. on safe mode module
44--- calls vshard.storage.bucket_ref / vshard.storage.bucket_unref
55--- on fast mode it does nothing.
6- --- default is fast mode.
6+ --- Default is fast mode.
77
88--- bucket_ref/bucket_unref must be called in one transaction in order to prevent
99--- safe_mode change during execution.
@@ -15,12 +15,12 @@ local rebalance = require('crud.common.rebalance')
1515local safe_methods
1616local fast_methods
1717
18- local M = {
18+ local bucket_ref_unref = {
1919 BucketRefError = errors .new_class (' bucket_ref_error' , {capture_stack = false })
2020}
2121
2222local function make_bucket_ref_err (bucket_id , vshard_ref_err )
23- local err = M .BucketRefError :new (
23+ local err = bucket_ref_unref .BucketRefError :new (
2424 " failed bucket_ref: %s, bucket_id: %s" ,
2525 vshard_ref_err .name ,
2626 bucket_id
@@ -34,83 +34,74 @@ local function make_bucket_ref_err(bucket_id, vshard_ref_err)
3434 return err
3535end
3636
37- --- on module initialization safe_mode_status func must be set
38- --- it's rebalance.safe_mode_status
39- function M .safe_mode_status ()
40- error (' safe_mode_status not set' )
41- end
42-
43- --- Slow bucket_refrw implementation that calls vshard.storage.bucket_refrw.
37+ --- Safe bucket_refrw implementation that calls vshard.storage.bucket_refrw.
4438--- must be called with bucket_unrefrw in transaction
45- function M ._bucket_refrw (bucket_id )
39+ function bucket_ref_unref ._bucket_refrw (bucket_id )
4640 local ref_ok , vshard_ref_err = vshard .storage .bucket_refrw (bucket_id )
4741 if not ref_ok then
48- return false , make_bucket_ref_err (bucket_id , vshard_ref_err )
42+ return nil , make_bucket_ref_err (bucket_id , vshard_ref_err )
4943 end
5044
5145 return true
5246end
5347
54- --- Slow bucket_unrefrw implementation that calls vshard.storage.bucket_unrefrw.
48+ --- Safe bucket_unrefrw implementation that calls vshard.storage.bucket_unrefrw.
5549--- must be called with bucket_refrw in transaction
56- function M ._bucket_unrefrw (bucket_id )
50+ function bucket_ref_unref ._bucket_unrefrw (bucket_id )
5751 return vshard .storage .bucket_unrefrw (bucket_id )
5852end
5953
60- --- Slow bucket_refro implementation that calls vshard.storage.bucket_refro.
61- function M ._bucket_refro (bucket_id )
54+ --- Safe bucket_refro implementation that calls vshard.storage.bucket_refro.
55+ function bucket_ref_unref ._bucket_refro (bucket_id )
6256 local ref_ok , vshard_ref_err = vshard .storage .bucket_refro (bucket_id )
6357 if not ref_ok then
64- return false , make_bucket_ref_err (bucket_id , vshard_ref_err )
58+ return nil , make_bucket_ref_err (bucket_id , vshard_ref_err )
6559 end
6660
6761 return true
6862end
6963
70- --- Slow bucket_unrefro implementation that calls vshard.storage.bucket_unrefro.
64+ --- Safe bucket_unrefro implementation that calls vshard.storage.bucket_unrefro.
7165--- must be called in one transaction with bucket_refrw_many
72- function M ._bucket_unrefro (bucket_id )
66+ function bucket_ref_unref ._bucket_unrefro (bucket_id )
7367 return vshard .storage .bucket_unrefro (bucket_id )
7468end
7569
76- --- Slow bucket_refrw_many that calls bucket_refrw for every bucket and aggregates errors
70+ --- Safe bucket_refrw_many that calls bucket_refrw for every bucket and aggregates errors
7771--- @param bucket_ids table<number , boolean>
78- function M ._bucket_refrw_many (bucket_ids )
72+ function bucket_ref_unref ._bucket_refrw_many (bucket_ids )
7973 local bucket_ref_errs = {}
8074 local reffed_bucket_ids = {}
8175 for bucket_id in pairs (bucket_ids ) do
8276 local ref_ok , bucket_refrw_err = safe_methods .bucket_refrw (bucket_id )
8377 if not ref_ok then
84-
8578 table.insert (bucket_ref_errs , bucket_refrw_err .bucket_ref_errs [1 ])
86- goto continue
79+ break
8780 end
88-
8981 reffed_bucket_ids [bucket_id ] = true
90- :: continue::
9182 end
9283
9384 if next (bucket_ref_errs ) ~= nil then
94- local err = M .BucketRefError :new (M .BucketRefError :new (" failed bucket_ref" ))
85+ local err = bucket_ref_unref .BucketRefError :new (bucket_ref_unref .BucketRefError :new (" failed bucket_ref" ))
9586 err .bucket_ref_errs = bucket_ref_errs
96- safe_methods . bucket_unrefrw_many (reffed_bucket_ids )
87+ bucket_ref_unref . _bucket_unrefrw_many (reffed_bucket_ids )
9788 return nil , err
9889 end
9990
10091 return true
10192end
10293
103- --- Slow bucket_unrefrw_many that calls vshard.storage.bucket_unrefrw for every bucket.
94+ --- Safe bucket_unrefrw_many that calls vshard.storage.bucket_unrefrw for every bucket.
10495--- must be called in one transaction with bucket_refrw_many
10596--- will never happen in called in one transaction with bucket_refrw_many
106- --- @param bucket_ids table<number , true >
107- function M ._bucket_unrefrw_many (bucket_ids )
97+ --- @param bucket_ids table<number , boolean >
98+ function bucket_ref_unref ._bucket_unrefrw_many (bucket_ids )
10899 local unref_all_ok = true
109100 local unref_last_err
110101 for reffed_bucket_id in pairs (bucket_ids ) do
111102 local unref_ok , unref_err = safe_methods .bucket_unrefrw (reffed_bucket_id )
112103 if not unref_ok then
113- unref_all_ok = nil
104+ unref_all_ok = false
114105 unref_last_err = unref_err
115106 end
116107 end
@@ -122,31 +113,31 @@ function M._bucket_unrefrw_many(bucket_ids)
122113end
123114
124115--- _fast implements module logic for fast mode
125- function M ._fast ()
116+ function bucket_ref_unref ._fast ()
126117 return true
127118end
128119
129120safe_methods = {
130- bucket_refrw = M ._bucket_refrw ,
131- bucket_unrefrw = M ._bucket_unrefrw ,
132- bucket_refro = M ._bucket_refro ,
133- bucket_unrefro = M ._bucket_unrefro ,
134- bucket_refrw_many = M ._bucket_refrw_many ,
135- bucket_unrefrw_many = M ._bucket_unrefrw_many ,
121+ bucket_refrw = bucket_ref_unref ._bucket_refrw ,
122+ bucket_unrefrw = bucket_ref_unref ._bucket_unrefrw ,
123+ bucket_refro = bucket_ref_unref ._bucket_refro ,
124+ bucket_unrefro = bucket_ref_unref ._bucket_unrefro ,
125+ bucket_refrw_many = bucket_ref_unref ._bucket_refrw_many ,
126+ bucket_unrefrw_many = bucket_ref_unref ._bucket_unrefrw_many ,
136127}
137128
138129fast_methods = {
139- bucket_refrw = M ._fast ,
140- bucket_unrefrw = M ._fast ,
141- bucket_refro = M ._fast ,
142- bucket_unrefro = M ._fast ,
143- bucket_refrw_many = M ._fast ,
144- bucket_unrefrw_many = M ._fast ,
130+ bucket_refrw = bucket_ref_unref ._fast ,
131+ bucket_unrefrw = bucket_ref_unref ._fast ,
132+ bucket_refro = bucket_ref_unref ._fast ,
133+ bucket_unrefro = bucket_ref_unref ._fast ,
134+ bucket_refrw_many = bucket_ref_unref ._fast ,
135+ bucket_unrefrw_many = bucket_ref_unref ._fast ,
145136}
146137
147138local function set_methods (methods )
148139 for method_name , func in pairs (methods ) do
149- M [method_name ] = func
140+ bucket_ref_unref [method_name ] = func
150141 end
151142end
152143
@@ -158,32 +149,18 @@ local function set_fast_mode()
158149 set_methods (fast_methods )
159150end
160151
161- local hooks_registered = false
162-
163- --- set safe mode func
164- --- from rebalance.safe_mode_status
165- function M .set_safe_mode_status (safe_mode_status )
166- M .safe_mode_status = safe_mode_status
152+ if rebalance .safe_mode then
153+ set_safe_mode ()
154+ else
155+ set_fast_mode ()
156+ end
167157
168- if safe_mode_status () then
158+ rebalance .on_safe_mode_toggle (function (is_enabled )
159+ if is_enabled then
169160 set_safe_mode ()
170161 else
171162 set_fast_mode ()
172163 end
164+ end )
173165
174- if not hooks_registered then
175- rebalance .on_safe_mode_toggle (function (is_enabled )
176- if is_enabled then
177- set_safe_mode ()
178- else
179- set_fast_mode ()
180- end
181- end )
182-
183- hooks_registered = true
184- end
185- end
186-
187- set_fast_mode ()
188-
189- return M
166+ return bucket_ref_unref
0 commit comments