class C_IO_Dir_OMAP_FetchedMore : public CDirIOContext {
MDSContext *fin;
public:
+ const version_t omap_version;
bufferlist hdrbl;
bool more = false;
map<string, bufferlist> omap; ///< carry-over from before
map<string, bufferlist> omap_more; ///< new batch
int ret;
- C_IO_Dir_OMAP_FetchedMore(CDir *d, MDSContext *f) :
- CDirIOContext(d), fin(f), ret(0) { }
+ C_IO_Dir_OMAP_FetchedMore(CDir *d, version_t v, MDSContext *f) :
+ CDirIOContext(d), fin(f), omap_version(v), ret(0) { }
void finish(int r) {
+ if (omap_version < dir->get_committed_version()) {
+ omap.clear();
+ dir->_omap_fetch(fin, {});
+ return;
+ }
+
// merge results
if (omap.empty()) {
omap.swap(omap_more);
omap.insert(omap_more.begin(), omap_more.end());
}
if (more) {
- dir->_omap_fetch_more(hdrbl, omap, fin);
+ dir->_omap_fetch_more(omap_version, hdrbl, omap, fin);
} else {
dir->_omap_fetched(hdrbl, omap, !fin, r);
if (fin)
class C_IO_Dir_OMAP_Fetched : public CDirIOContext {
MDSContext *fin;
public:
+ const version_t omap_version;
bufferlist hdrbl;
bool more = false;
map<string, bufferlist> omap;
int ret1, ret2, ret3;
C_IO_Dir_OMAP_Fetched(CDir *d, MDSContext *f) :
- CDirIOContext(d), fin(f), ret1(0), ret2(0), ret3(0) { }
+ CDirIOContext(d), fin(f),
+ omap_version(d->get_committing_version()),
+ ret1(0), ret2(0), ret3(0) { }
void finish(int r) override {
// check the correctness of backtrace
if (r >= 0 && ret3 != -ECANCELED)
dir->inode->verify_diri_backtrace(btbl, ret3);
if (r >= 0) r = ret1;
if (r >= 0) r = ret2;
+
if (more) {
- dir->_omap_fetch_more(hdrbl, omap, fin);
- } else {
- dir->_omap_fetched(hdrbl, omap, !fin, r);
- if (fin)
- fin->complete(r);
+ if (omap_version < dir->get_committed_version()) {
+ omap.clear();
+ dir->_omap_fetch(fin, {});
+ } else {
+ dir->_omap_fetch_more(omap_version, hdrbl, omap, fin);
+ }
+ return;
}
+
+ dir->_omap_fetched(hdrbl, omap, !fin, r);
+ if (fin)
+ fin->complete(r);
+
}
void print(ostream& out) const override {
out << "dirfrag_fetch(" << dir->dirfrag() << ")";
new C_OnFinisher(fin, cache->mds->finisher));
}
-void CDir::_omap_fetch_more(
- bufferlist& hdrbl,
- map<string, bufferlist>& omap,
- MDSContext *c)
+void CDir::_omap_fetch_more(version_t omap_version, bufferlist& hdrbl,
+ map<string, bufferlist>& omap, MDSContext *c)
{
// we have more omap keys to fetch!
object_t oid = get_ondisk_object();
object_locator_t oloc(cache->mds->mdsmap->get_metadata_pool());
- C_IO_Dir_OMAP_FetchedMore *fin = new C_IO_Dir_OMAP_FetchedMore(this, c);
+ auto fin = new C_IO_Dir_OMAP_FetchedMore(this, omap_version, c);
fin->hdrbl.claim(hdrbl);
fin->omap.swap(omap);
ObjectOperation rd;