Skip to content

Commit 9b8a1b7

Browse files
committed
[experimental] rgw/sfs: add DBConn::lock
This is for use around transactions so we don't accidentally end up with transactions inside transations across multiple threads. Signed-off-by: Tim Serong <[email protected]>
1 parent fd3eb65 commit 9b8a1b7

File tree

4 files changed

+20
-1
lines changed

4 files changed

+20
-1
lines changed

src/rgw/driver/sfs/sqlite/dbconn.h

+1
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,7 @@ class DBConn {
263263
sqlite3* first_sqlite_conn;
264264
CephContext* const cct;
265265
const bool profile_enabled;
266+
ceph::mutex lock = ceph::make_mutex("sfs_db_lock");
266267

267268
DBConn(CephContext* _cct);
268269
virtual ~DBConn() = default;

src/rgw/driver/sfs/sqlite/sqlite_buckets.cc

+3
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,9 @@ std::optional<DBDeletedObjectItems> SQLiteBuckets::delete_bucket_transact(
142142
RetrySQLite<DBDeletedObjectItems> retry([&]() {
143143
bucket_deleted = false;
144144
DBDeletedObjectItems ret_values;
145+
std::lock_guard l(conn->lock);
146+
// FIXME: looks like this transaction will never rollback/commit if anything below throws.
147+
// FIXME: I assume this wants to be storage.transaction_guard()?
145148
storage.begin_transaction();
146149
// first get all the objects and versions for that bucket
147150
ret_values = storage.select(

src/rgw/driver/sfs/sqlite/sqlite_multipart.cc

+10-1
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ int SQLiteMultipart::abort_multiparts_by_bucket_id(const std::string& bucket_id
9292
) const {
9393
auto& storage = conn->get_storage();
9494
uint64_t num_changes = 0;
95+
std::lock_guard l(conn->lock);
9596
storage.transaction([&]() mutable {
9697
storage.update_all(
9798
set(c(&DBMultipart::state) = MultipartState::ABORTED,
@@ -222,7 +223,7 @@ std::optional<DBMultipartPart> SQLiteMultipart::create_or_reset_part(
222223
) const {
223224
auto& storage = conn->get_storage();
224225
std::optional<DBMultipartPart> entry = std::nullopt;
225-
226+
std::lock_guard l(conn->lock);
226227
storage.transaction([&]() mutable {
227228
auto cnt = storage.count<DBMultipart>(where(
228229
is_equal(&DBMultipart::upload_id, upload_id) and
@@ -299,6 +300,7 @@ bool SQLiteMultipart::finish_part(
299300
uint64_t bytes_written
300301
) const {
301302
auto& storage = conn->get_storage();
303+
std::lock_guard l(conn->lock);
302304
bool committed = storage.transaction([&]() mutable {
303305
storage.update_all(
304306
set(c(&DBMultipartPart::etag) = etag,
@@ -320,6 +322,7 @@ bool SQLiteMultipart::finish_part(
320322

321323
bool SQLiteMultipart::abort(const std::string& upload_id) const {
322324
auto& storage = conn->get_storage();
325+
std::lock_guard l(conn->lock);
323326
auto committed = storage.transaction([&]() mutable {
324327
storage.update_all(
325328
set(c(&DBMultipart::state) = MultipartState::ABORTED,
@@ -358,6 +361,7 @@ static int _mark_complete(
358361

359362
bool SQLiteMultipart::mark_complete(const std::string& upload_id) const {
360363
auto& storage = conn->get_storage();
364+
std::lock_guard l(conn->lock);
361365
auto committed = storage.transaction([&]() mutable {
362366
auto num_complete = _mark_complete(storage, upload_id);
363367
if (num_complete == 0) {
@@ -375,6 +379,7 @@ bool SQLiteMultipart::mark_complete(
375379
) const {
376380
ceph_assert(duplicate != nullptr);
377381
auto& storage = conn->get_storage();
382+
std::lock_guard l(conn->lock);
378383
auto committed = storage.transaction([&]() mutable {
379384
auto entries = storage.get_all<DBMultipart>(
380385
where(is_equal(&DBMultipart::upload_id, upload_id))
@@ -401,6 +406,7 @@ bool SQLiteMultipart::mark_complete(
401406

402407
bool SQLiteMultipart::mark_aggregating(const std::string& upload_id) const {
403408
auto& storage = conn->get_storage();
409+
std::lock_guard l(conn->lock);
404410
auto committed = storage.transaction([&]() mutable {
405411
storage.update_all(
406412
set(c(&DBMultipart::state) = MultipartState::AGGREGATING,
@@ -423,6 +429,7 @@ bool SQLiteMultipart::mark_aggregating(const std::string& upload_id) const {
423429

424430
bool SQLiteMultipart::mark_done(const std::string& upload_id) const {
425431
auto& storage = conn->get_storage();
432+
std::lock_guard l(conn->lock);
426433
auto committed = storage.transaction([&]() mutable {
427434
storage.update_all(
428435
set(c(&DBMultipart::state) = MultipartState::DONE,
@@ -464,6 +471,7 @@ SQLiteMultipart::remove_multiparts_by_bucket_id_transact(
464471
DBDeletedMultipartItems ret_parts;
465472
auto& storage = conn->get_storage();
466473
RetrySQLite<DBDeletedMultipartItems> retry([&]() {
474+
std::lock_guard l(conn->lock);
467475
auto transaction = storage.transaction_guard();
468476
// get first the list of parts to be deleted up to max_items
469477
ret_parts = storage.select(
@@ -525,6 +533,7 @@ SQLiteMultipart::remove_done_or_aborted_multiparts_transact(uint max_items
525533
DBDeletedMultipartItems ret_parts;
526534
auto& storage = conn->get_storage();
527535
RetrySQLite<DBDeletedMultipartItems> retry([&]() {
536+
std::lock_guard l(conn->lock);
528537
auto transaction = storage.transaction_guard();
529538
// get first the list of parts to be deleted up to max_items
530539
ret_parts = storage.select(

src/rgw/driver/sfs/sqlite/sqlite_versioned_objects.cc

+6
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ bool SQLiteVersionedObjects::store_versioned_object_if_state(
119119
const DBVersionedObject& object, std::vector<ObjectState> allowed_states
120120
) const {
121121
auto& storage = conn->get_storage();
122+
std::lock_guard l(conn->lock);
122123
auto transaction = storage.transaction_guard();
123124
transaction.commit_on_destroy = true;
124125
storage.update_all(
@@ -148,6 +149,7 @@ bool SQLiteVersionedObjects::
148149
) const {
149150
auto& storage = conn->get_storage();
150151
RetrySQLite<bool> retry([&]() {
152+
std::lock_guard l(conn->lock);
151153
auto transaction = storage.transaction_guard();
152154
storage.update_all(
153155
set(c(&DBVersionedObject::object_id) = object.object_id,
@@ -299,6 +301,7 @@ SQLiteVersionedObjects::delete_version_and_get_previous_transact(
299301
) const {
300302
try {
301303
auto& storage = conn->get_storage();
304+
std::lock_guard l(conn->lock);
302305
auto transaction = storage.transaction_guard();
303306
std::optional<DBVersionedObject> ret_value = std::nullopt;
304307
storage.remove<DBVersionedObject>(id);
@@ -338,6 +341,7 @@ uint SQLiteVersionedObjects::add_delete_marker_transact(
338341
added = false;
339342
try {
340343
auto& storage = conn->get_storage();
344+
std::lock_guard l(conn->lock);
341345
auto transaction = storage.transaction_guard();
342346
auto last_version_select = storage.get_all<DBVersionedObject>(
343347
where(
@@ -452,6 +456,7 @@ SQLiteVersionedObjects::create_new_versioned_object_transact(
452456
) const {
453457
auto& storage = conn->get_storage();
454458
RetrySQLite<DBVersionedObject> retry([&]() {
459+
std::lock_guard l(conn->lock);
455460
auto transaction = storage.transaction_guard();
456461
auto objs = storage.select(
457462
columns(&DBObject::uuid),
@@ -494,6 +499,7 @@ SQLiteVersionedObjects::remove_deleted_versions_transact(uint max_objects
494499
DBDeletedObjectItems ret_objs;
495500
auto& storage = conn->get_storage();
496501
RetrySQLite<DBDeletedObjectItems> retry([&]() {
502+
std::lock_guard l(conn->lock);
497503
auto transaction = storage.transaction_guard();
498504
// get first the list of objects to be deleted up to max_objects
499505
// order by size so when we delete the versions data we are more efficient

0 commit comments

Comments
 (0)