diff mbox

Add old_inodes to emetablob

Message ID orehmss3ro.fsf@livre.localdomain (mailing list archive)
State New, archived
Headers show

Commit Message

Alexandre Oliva Aug. 27, 2012, 4:23 p.m. UTC
On Aug 19, 2012, Sage Weil <sage@inktank.com> wrote:

> This might do the trick?

> diff --git a/src/mds/CDir.cc b/src/mds/CDir.cc

>           in->old_inodes.swap(old_inodes);
> +         if (!in->old_inodes.empty())
> +           in->first = in->old_inodes.rbegin()->first + 1;
>           if (snaps)

At first, it didn't.  I had to install/keep a few additional patches to
avoid “corruption” of old snapshots.  Later on, I guess all “first”
fields in the journal were corrected, and then I didn't get the warnings
added by my patches any more.  So it may be that your patch is enough,
after all, but this is the patchset I've used over the past week, with a
very little bit of snapshot creation.

Unfortunately, modifying snapshotted directories, particularly mass
removal of subtrees, is still triggering some serious issues in the mds
(crashes, infinite loops, unrecoverable clusters, all sorts of fun
stuff :-), but I'm yet to look into that.


mds: update cached first along with old_inodes

When fetching a directory, make sure first is greater than the fetched
old_inodes.

Signed-off-by: Alexandre Oliva <oliva@lsd.ic.unicamp.br>
Suggested-by: Sage Weil <sage@inktank.com>
---
 src/mds/CDir.cc |    5 +++++
 1 files changed, 5 insertions(+), 0 deletions(-)

Comments

Sage Weil Aug. 27, 2012, 4:44 p.m. UTC | #1
On Mon, 27 Aug 2012, Alexandre Oliva wrote:
> On Aug 19, 2012, Sage Weil <sage@inktank.com> wrote:
> 
> > This might do the trick?
> 
> > diff --git a/src/mds/CDir.cc b/src/mds/CDir.cc
> 
> >           in->old_inodes.swap(old_inodes);
> > +         if (!in->old_inodes.empty())
> > +           in->first = in->old_inodes.rbegin()->first + 1;
> >           if (snaps)
> 
> At first, it didn't.  I had to install/keep a few additional patches to
> avoid ?corruption? of old snapshots.  Later on, I guess all ?first?
> fields in the journal were corrected, and then I didn't get the warnings
> added by my patches any more.  So it may be that your patch is enough,
> after all, but this is the patchset I've used over the past week, with a
> very little bit of snapshot creation.
> 
> Unfortunately, modifying snapshotted directories, particularly mass
> removal of subtrees, is still triggering some serious issues in the mds
> (crashes, infinite loops, unrecoverable clusters, all sorts of fun
> stuff :-), but I'm yet to look into that.
> 
> 
> mds: update cached first along with old_inodes
> 
> When fetching a directory, make sure first is greater than the fetched
> old_inodes.
> 
> Signed-off-by: Alexandre Oliva <oliva@lsd.ic.unicamp.br>
> Suggested-by: Sage Weil <sage@inktank.com>
> ---
>  src/mds/CDir.cc |    5 +++++
>  1 files changed, 5 insertions(+), 0 deletions(-)
> 
> diff --git a/src/mds/CDir.cc b/src/mds/CDir.cc
> index 6761c6f..71ef03a 100644
> --- a/src/mds/CDir.cc
> +++ b/src/mds/CDir.cc
> @@ -1564,6 +1564,11 @@ void CDir::_fetched(bufferlist &bl, const string& want_dn)
>  	  in->xattrs.swap(xattrs);
>  	  in->decode_snap_blob(snapbl);
>  	  in->old_inodes.swap(old_inodes);
> +	  if (!in->old_inodes.empty()) {
> +	    snapid_t newfirst = in->old_inodes.rbegin()->first + 1;
> +	    if (newfirst > in->first)
> +	      in->first = newfirst;

Hmm, did you observe a case where in->first was already > the newest 
old_inode?

sage


> +	  }
>  	  if (snaps)
>  	    in->purge_stale_snap_data(*snaps);
>  
> -- 
> 1.7.7.6
> 
> 
> mds: Don't modify already-created old_inode
> 
> In cow_old_inode, do not modify an old_inode that was created before.
> 
> Signed-off-by: Alexandre Oliva <oliva@lsd.ic.unicamp.br>
> ---
>  src/mds/CInode.cc |   16 +++++++++++-----
>  1 files changed, 11 insertions(+), 5 deletions(-)
> 
> diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc
> index 53f9e69..d17fd26 100644
> --- a/src/mds/CInode.cc
> +++ b/src/mds/CInode.cc
> @@ -2030,12 +2030,18 @@ old_inode_t& CInode::cow_old_inode(snapid_t follows, bool cow_head)
>    inode_t *pi = cow_head ? get_projected_inode() : get_previous_projected_inode();
>    map<string,bufferptr> *px = cow_head ? get_projected_xattrs() : get_previous_projected_xattrs();
>  
> +  bool found = old_inodes.find(follows) != old_inodes.end();
>    old_inode_t &old = old_inodes[follows];
> -  old.first = first;
> -  old.inode = *pi;
> -  old.xattrs = *px;
> -  
> -  dout(10) << " " << px->size() << " xattrs cowed, " << *px << dendl;
> +
> +  if (!found) {
> +    old.first = first;
> +    old.inode = *pi;
> +    old.xattrs = *px;
> +
> +    dout(10) << " " << px->size() << " xattrs cowed, " << *px << dendl;
> +  } else
> +    dout(0) << "cow_old_inode not modifying existing old_inode " << first
> +	    << " for " << follows << " on " << *this << dendl;
>  
>    old.inode.trim_client_ranges(follows);
>  
> -- 
> 1.7.7.6
> 
> 
> mds: warn when first is lower than latest old_inode
> 
> Warn in cow_old_inode if first is out of date WRT old_inodes.
> 
> Signed-off-by: Alexandre Oliva <oliva@lsd.ic.unicamp.br>
> ---
>  src/mds/CInode.cc |    5 +++++
>  1 files changed, 5 insertions(+), 0 deletions(-)
> 
> diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc
> index d17fd26..f1be8e4 100644
> --- a/src/mds/CInode.cc
> +++ b/src/mds/CInode.cc
> @@ -2027,6 +2027,11 @@ old_inode_t& CInode::cow_old_inode(snapid_t follows, bool cow_head)
>  {
>    assert(follows >= first);
>  
> +  if (!old_inodes.empty() && first <= old_inodes.rbegin()->first) {
> +    dout(0) << "cow_old_inode " << " first " << first << " but already had "
> +	    << old_inodes.rbegin()->first << " on " << *this << dendl;
> +  }
> +
>    inode_t *pi = cow_head ? get_projected_inode() : get_previous_projected_inode();
>    map<string,bufferptr> *px = cow_head ? get_projected_xattrs() : get_previous_projected_xattrs();
>  
> -- 
> 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 majordomo@vger.kernel.org
> 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 majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Alexandre Oliva Aug. 28, 2012, 2:20 a.m. UTC | #2
On Aug 27, 2012, Sage Weil <sage@inktank.com> wrote:

>> +	  if (!in->old_inodes.empty()) {
>> +	    snapid_t newfirst = in->old_inodes.rbegin()->first + 1;
>> +	    if (newfirst > in->first)
>> +	      in->first = newfirst;

> Hmm, did you observe a case where in->first was already > the newest 
> old_inode?

No, that was just me doing defensive programming and forgetting to add a
warning for this case ;-)

IIRC I reasoned I didn't want an already-bugfixed or already-advanced
in->first in the MDS journal to be overwritten with a buggy/outdated
->first from the inode proper.  However, since I didn't put the warning,
I don't know whether it ever hit :-(
diff mbox

Patch

diff --git a/src/mds/CDir.cc b/src/mds/CDir.cc
index 6761c6f..71ef03a 100644
--- a/src/mds/CDir.cc
+++ b/src/mds/CDir.cc
@@ -1564,6 +1564,11 @@  void CDir::_fetched(bufferlist &bl, const string& want_dn)
 	  in->xattrs.swap(xattrs);
 	  in->decode_snap_blob(snapbl);
 	  in->old_inodes.swap(old_inodes);
+	  if (!in->old_inodes.empty()) {
+	    snapid_t newfirst = in->old_inodes.rbegin()->first + 1;
+	    if (newfirst > in->first)
+	      in->first = newfirst;
+	  }
 	  if (snaps)
 	    in->purge_stale_snap_data(*snaps);
 
-- 
1.7.7.6


mds: Don't modify already-created old_inode

In cow_old_inode, do not modify an old_inode that was created before.

Signed-off-by: Alexandre Oliva <oliva@lsd.ic.unicamp.br>
---
 src/mds/CInode.cc |   16 +++++++++++-----
 1 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc
index 53f9e69..d17fd26 100644
--- a/src/mds/CInode.cc
+++ b/src/mds/CInode.cc
@@ -2030,12 +2030,18 @@  old_inode_t& CInode::cow_old_inode(snapid_t follows, bool cow_head)
   inode_t *pi = cow_head ? get_projected_inode() : get_previous_projected_inode();
   map<string,bufferptr> *px = cow_head ? get_projected_xattrs() : get_previous_projected_xattrs();
 
+  bool found = old_inodes.find(follows) != old_inodes.end();
   old_inode_t &old = old_inodes[follows];
-  old.first = first;
-  old.inode = *pi;
-  old.xattrs = *px;
-  
-  dout(10) << " " << px->size() << " xattrs cowed, " << *px << dendl;
+
+  if (!found) {
+    old.first = first;
+    old.inode = *pi;
+    old.xattrs = *px;
+
+    dout(10) << " " << px->size() << " xattrs cowed, " << *px << dendl;
+  } else
+    dout(0) << "cow_old_inode not modifying existing old_inode " << first
+	    << " for " << follows << " on " << *this << dendl;
 
   old.inode.trim_client_ranges(follows);
 
-- 
1.7.7.6


mds: warn when first is lower than latest old_inode

Warn in cow_old_inode if first is out of date WRT old_inodes.

Signed-off-by: Alexandre Oliva <oliva@lsd.ic.unicamp.br>
---
 src/mds/CInode.cc |    5 +++++
 1 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc
index d17fd26..f1be8e4 100644
--- a/src/mds/CInode.cc
+++ b/src/mds/CInode.cc
@@ -2027,6 +2027,11 @@  old_inode_t& CInode::cow_old_inode(snapid_t follows, bool cow_head)
 {
   assert(follows >= first);
 
+  if (!old_inodes.empty() && first <= old_inodes.rbegin()->first) {
+    dout(0) << "cow_old_inode " << " first " << first << " but already had "
+	    << old_inodes.rbegin()->first << " on " << *this << dendl;
+  }
+
   inode_t *pi = cow_head ? get_projected_inode() : get_previous_projected_inode();
   map<string,bufferptr> *px = cow_head ? get_projected_xattrs() : get_previous_projected_xattrs();