Skip to content

Commit a272348

Browse files
authored
Merge pull request ceph#59301 from xxhdx1985126/wip-67604
crimson/common/tri_mutex: also wake up waiters when demoting Reviewed-by: Samuel Just <[email protected]> Reviewed-by: Yingxin Cheng <[email protected]>
2 parents 94163ec + f956fbc commit a272348

File tree

3 files changed

+20
-14
lines changed

3 files changed

+20
-14
lines changed

src/crimson/common/tri_mutex.cc

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ void tri_mutex::unlock_for_read()
7575
DEBUGDPP("", *this);
7676
assert(readers > 0);
7777
if (--readers == 0) {
78-
wake();
78+
assert(!readers && !writers && !exclusively_used);
79+
wake(type_t::none);
7980
}
8081
}
8182

@@ -85,7 +86,9 @@ void tri_mutex::demote_to_read()
8586
DEBUGDPP("", *this);
8687
assert(exclusively_used);
8788
exclusively_used = false;
89+
assert(!readers && !writers && !exclusively_used);
8890
++readers;
91+
wake(type_t::read);
8992
}
9093

9194
seastar::future<> tri_mutex::lock_for_write()
@@ -118,7 +121,8 @@ void tri_mutex::unlock_for_write()
118121
DEBUGDPP("", *this);
119122
assert(writers > 0);
120123
if (--writers == 0) {
121-
wake();
124+
assert(!readers && !writers && !exclusively_used);
125+
wake(type_t::none);
122126
}
123127
}
124128

@@ -128,7 +132,9 @@ void tri_mutex::demote_to_write()
128132
DEBUGDPP("", *this);
129133
assert(exclusively_used);
130134
exclusively_used = false;
135+
assert(!readers && !writers && !exclusively_used);
131136
++writers;
137+
wake(type_t::write);
132138
}
133139

134140
// for exclusive users
@@ -163,7 +169,8 @@ void tri_mutex::unlock_for_excl()
163169
DEBUGDPP("", *this);
164170
assert(exclusively_used);
165171
exclusively_used = false;
166-
wake();
172+
assert(!readers && !writers && !exclusively_used);
173+
wake(type_t::none);
167174
}
168175

169176
bool tri_mutex::is_acquired() const
@@ -181,23 +188,22 @@ bool tri_mutex::is_acquired() const
181188
}
182189
}
183190

184-
void tri_mutex::wake()
191+
void tri_mutex::wake(type_t type_to_wake)
185192
{
186193
LOG_PREFIX(tri_mutex::wake());
187194
DEBUGDPP("", *this);
188-
assert(!readers && !writers && !exclusively_used);
189-
type_t type = type_t::none;
195+
assert(type_to_wake != type_t::exclusive);
190196
while (!waiters.empty()) {
191197
auto& waiter = waiters.front();
192-
if (type == type_t::exclusive) {
198+
if (type_to_wake == type_t::exclusive) {
193199
break;
194-
} if (type == type_t::none) {
195-
type = waiter.type;
196-
} else if (type != waiter.type) {
200+
} if (type_to_wake == type_t::none) {
201+
type_to_wake = waiter.type;
202+
} else if (type_to_wake != waiter.type) {
197203
// to be woken in the next batch
198204
break;
199205
}
200-
switch (type) {
206+
switch (type_to_wake) {
201207
case type_t::read:
202208
++readers;
203209
break;

src/crimson/common/tri_mutex.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,6 @@ class tri_mutex : private read_lock,
106106
}
107107

108108
private:
109-
void wake();
110109
unsigned readers = 0;
111110
unsigned writers = 0;
112111
bool exclusively_used = false;
@@ -116,6 +115,7 @@ class tri_mutex : private read_lock,
116115
exclusive,
117116
none,
118117
};
118+
void wake(type_t);
119119
struct waiter_t {
120120
waiter_t(seastar::promise<>&& pr, type_t type)
121121
: pr(std::move(pr)), type(type)

src/crimson/osd/osd_operations/client_request.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -308,9 +308,9 @@ ClientRequest::recover_missing_snaps(
308308
if (oid) {
309309
auto unfound = co_await do_recover_missing(pg, *oid, m->get_reqid());
310310
if (unfound) {
311-
DEBUGDPP("{} unfound, hang it for now", *pg, m->get_hobj().get_head());
311+
DEBUGDPP("{} unfound, hang it for now", *pg, *oid);
312312
co_await interruptor::make_interruptible(
313-
pg->get_recovery_backend()->add_unfound(m->get_hobj().get_head()));
313+
pg->get_recovery_backend()->add_unfound(*oid));
314314
}
315315
}
316316
}

0 commit comments

Comments
 (0)