}
void Client::send_cap(Inode *in, MetaSession *session, Cap *cap,
- bool sync, int used, int want, int retain,
+ int flags, int used, int want, int retain,
int flush, ceph_tid_t flush_tid)
{
int held = cap->issued | cap->implemented;
ldout(cct, 10) << __func__ << " " << *in
<< " mds." << session->mds_num << " seq " << cap->seq
- << (sync ? " sync " : " async ")
<< " used " << ccap_string(used)
<< " want " << ccap_string(want)
<< " flush " << ccap_string(flush)
m->btime = in->btime;
m->time_warp_seq = in->time_warp_seq;
m->change_attr = in->change_attr;
- if (sync)
- m->flags |= MClientCaps::FLAG_SYNC;
- if (!in->cap_snaps.empty())
- m->flags |= MClientCaps::FLAG_PENDING_CAPSNAP;
-
+
+ if (!(flags & MClientCaps::FLAG_PENDING_CAPSNAP) &&
+ !in->cap_snaps.empty() &&
+ in->cap_snaps.rbegin()->second.flush_tid == 0)
+ flags |= MClientCaps::FLAG_PENDING_CAPSNAP;
+ m->flags = flags;
+
if (flush & CEPH_CAP_FILE_WR) {
m->inline_version = in->inline_version;
m->inline_data = in->inline_data;
flush_tid = 0;
}
- send_cap(in, session, &cap, flags & CHECK_CAPS_SYNCHRONOUS, cap_used, wanted,
- retain, flushing, flush_tid);
+ int msg_flags = (flags & CHECK_CAPS_SYNCHRONOUS) ? MClientCaps::FLAG_SYNC : 0;
+ send_cap(in, session, &cap, msg_flags, cap_used, wanted, retain,
+ flushing, flush_tid);
}
}
Cap *cap = in->auth_cap;
ceph_assert(cap->session == session);
+ ceph_tid_t last_snap_flush = 0;
+ for (auto p = in->flushing_cap_tids.rbegin();
+ p != in->flushing_cap_tids.rend();
+ ++p) {
+ if (!p->second) {
+ last_snap_flush = p->first;
+ break;
+ }
+ }
+
int wanted = in->caps_wanted();
int used = get_caps_used(in) | in->caps_dirty();
auto it = in->cap_snaps.begin();
for (auto& p : in->flushing_cap_tids) {
if (p.second) {
- send_cap(in, session, cap, false,
- used, wanted, (cap->issued | cap->implemented),
+ int msg_flags = p.first < last_snap_flush ? MClientCaps::FLAG_PENDING_CAPSNAP : 0;
+ send_cap(in, session, cap, msg_flags, used, wanted, (cap->issued | cap->implemented),
p.second, p.first);
} else {
ceph_assert(it != in->cap_snaps.end());
void handle_cap_grant(MetaSession *session, Inode *in, Cap *cap, const MConstRef<MClientCaps>& m);
void cap_delay_requeue(Inode *in);
- void send_cap(Inode *in, MetaSession *session, Cap *cap, bool sync,
+ void send_cap(Inode *in, MetaSession *session, Cap *cap, int flags,
int used, int want, int retain, int flush,
ceph_tid_t flush_tid);