Applied, with a small cleanup (wip-mds-old-inodes).. I'll merge it in 
tomorrow after a bit of testing.

On Tue, 21 Feb 2012, Alexandre Oliva wrote:
> This was supposed to fix bug 1946, and likely bug 1849 too, but it looks
> like something's still missing for a complete fix.  fuse-unmounting
> between touching a dir and creating a snapshot seems to help get correct
> snapshot timestamp,

Hmm, that sounds like ceph-fuse isn't sending the write flushsnap cap 
message.  I forget.. have you tried the same with the kernel client?

> but touching the dir after remounting and restarting
> the mds shortly afterwards very often results in the wrong timestamp for
> the snapshot.

Do you 'sync' after the touch, by any chance?  It may be lost between the 
client and mds, not in the MDS journal.  A full mds log of this should 
have the answer.

Thanks for digging into this!
sage



> 
> 8<-----
> 
> Add information about old inodes to the mds journal.
> 
> Signed-off-by: Alexandre Oliva <[email protected]>
> ---
>  src/mds/events/EMetaBlob.h |   32 +++++++++++++++++++++++++-------
>  src/mds/journal.cc         |    2 ++
>  2 files changed, 27 insertions(+), 7 deletions(-)
> 
> diff --git a/src/mds/events/EMetaBlob.h b/src/mds/events/EMetaBlob.h
> index e03f147..747bff3 100644
> --- a/src/mds/events/EMetaBlob.h
> +++ b/src/mds/events/EMetaBlob.h
> @@ -68,6 +68,8 @@ public:
>      bufferlist snapbl;
>      bool dirty;
>      struct default_file_layout *dir_layout;
> +    typedef map<snapid_t, old_inode_t> old_inodes_t;
> +    old_inodes_t *old_inodes;
>  
>      bufferlist _enc;
>  
> @@ -77,10 +79,11 @@ public:
>      fullbit(const string& d, snapid_t df, snapid_t dl, 
>           version_t v, inode_t& i, fragtree_t &dft, 
>           map<string,bufferptr> &xa, const string& sym,
> -         bufferlist &sbl, bool dr, default_file_layout *defl = NULL) :
> +         bufferlist &sbl, bool dr, default_file_layout *defl = NULL,
> +         old_inodes_t *oi = NULL) :
>        //dn(d), dnfirst(df), dnlast(dl), dnv(v), 
>        //inode(i), dirfragtree(dft), xattrs(xa), symlink(sym), snapbl(sbl), 
> dirty(dr) 
> -      dir_layout(NULL), _enc(1024)
> +      dir_layout(NULL), old_inodes(NULL), _enc(1024)
>      {
>        ::encode(d, _enc);
>        ::encode(df, _enc);
> @@ -98,15 +101,21 @@ public:
>         ::encode(*defl, _enc);
>        }
>        ::encode(dr, _enc);      
> +      ::encode(oi ? true : false, _enc);
> +      if (oi)
> +     ::encode(*oi, _enc);
>      }
> -    fullbit(bufferlist::iterator &p) : dir_layout(NULL) { decode(p); }
> -    fullbit() : dir_layout(NULL) {}
> +    fullbit(bufferlist::iterator &p) : dir_layout(NULL), old_inodes(NULL) {
> +      decode(p);
> +    }
> +    fullbit() : dir_layout(NULL), old_inodes(NULL) {}
>      ~fullbit() {
> +      delete old_inodes;
>        delete dir_layout;
>      }
>  
>      void encode(bufferlist& bl) const {
> -      __u8 struct_v = 2;
> +      __u8 struct_v = 3;
>        ::encode(struct_v, bl);
>        assert(_enc.length());
>        bl.append(_enc); 
> @@ -135,6 +144,14 @@ public:
>       }
>        }
>        ::decode(dirty, bl);
> +      if (struct_v >= 3) {
> +     bool old_inodes_present;
> +     ::decode(old_inodes_present, bl);
> +     if (old_inodes_present) {
> +       old_inodes = new old_inodes_t;
> +       ::decode(*old_inodes, bl);
> +     }
> +      }
>      }
>  
>      void update_inode(MDS *mds, CInode *in);
> @@ -562,7 +579,8 @@ private:
>                                                                        *pi, 
> in->dirfragtree,
>                                                                        
> *in->get_projected_xattrs(),
>                                                                        
> in->symlink, snapbl,
> -                                                                      dirty, 
> default_layout)));
> +                                                                      dirty, 
> default_layout,
> +                                                                      
> &in->old_inodes)));
>      if (pi)
>        lump.get_dfull().back()->inode = *pi;
>      return &lump.get_dfull().back()->inode;
> @@ -614,7 +632,7 @@ private:
>                      0,
>                      *pi, *pdft, *px,
>                      in->symlink, snapbl,
> -                    dirty, default_layout);
> +                    dirty, default_layout, &in->old_inodes);
>      return &root->inode;
>    }
>    
> diff --git a/src/mds/journal.cc b/src/mds/journal.cc
> index 5f74bbb..fd45213 100644
> --- a/src/mds/journal.cc
> +++ b/src/mds/journal.cc
> @@ -416,6 +416,8 @@ void EMetaBlob::fullbit::update_inode(MDS *mds, CInode 
> *in)
>    } else if (in->inode.is_symlink()) {
>      in->symlink = symlink;
>    }
> +  if (old_inodes)
> +    in->old_inodes = *old_inodes;
>  }
>  
>  void EMetaBlob::replay(MDS *mds, LogSegment *logseg)
> -- 
> 1.7.7.6
> 
> -- 
> Alexandre Oliva, freedom fighter    http://FSFLA.org/~lxoliva/
> You must be the change you wish to see in the world. -- Gandhi
> Be Free! -- http://FSFLA.org/   FSF Latin America board member
> Free Software Evangelist      Red Hat Brazil Compiler Engineer
> --
> To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
> the body of a message to [email protected]
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
> 
--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to