Re: [PATCH 21/39] mds: encode dirfrag base in cache rejoin ack

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 03/21/2013 07:33 AM, Gregory Farnum wrote:
> This needs to handle versioning the encoding based on peer feature bits too.
> 
> On Sun, Mar 17, 2013 at 7:51 AM, Yan, Zheng <zheng.z.yan@xxxxxxxxx> wrote:
>> From: "Yan, Zheng" <zheng.z.yan@xxxxxxxxx>
>>
>> Cache rejoin ack message already encodes inode base, make it also encode
>> dirfrag base. This allowes the message to replicate stray dentries like
>> MDentryUnlink message. The function will be used by later patch.
>>
>> Signed-off-by: Yan, Zheng <zheng.z.yan@xxxxxxxxx>
>> ---
>>  src/mds/CDir.h                 | 20 +++++++++++++-------
>>  src/mds/MDCache.cc             | 20 ++++++++++++++++++--
>>  src/messages/MMDSCacheRejoin.h | 12 +++++++++++-
>>  3 files changed, 42 insertions(+), 10 deletions(-)
>>
>> diff --git a/src/mds/CDir.h b/src/mds/CDir.h
>> index 79946f1..f4a3a3d 100644
>> --- a/src/mds/CDir.h
>> +++ b/src/mds/CDir.h
>> @@ -437,23 +437,29 @@ private:
>>      ::encode(dist, bl);
>>    }
>>
>> -  void encode_replica(int who, bufferlist& bl) {
>> -    __u32 nonce = add_replica(who);
>> -    ::encode(nonce, bl);
>> +  void _encode_base(bufferlist& bl) {
>>      ::encode(first, bl);
>>      ::encode(fnode, bl);
>>      ::encode(dir_rep, bl);
>>      ::encode(dir_rep_by, bl);
>>    }
>> -  void decode_replica(bufferlist::iterator& p) {
>> -    __u32 nonce;
>> -    ::decode(nonce, p);
>> -    replica_nonce = nonce;
>> +  void _decode_base(bufferlist::iterator& p) {
>>      ::decode(first, p);
>>      ::decode(fnode, p);
>>      ::decode(dir_rep, p);
>>      ::decode(dir_rep_by, p);
>>    }
>> +  void encode_replica(int who, bufferlist& bl) {
>> +    __u32 nonce = add_replica(who);
>> +    ::encode(nonce, bl);
>> +    _encode_base(bl);
>> +  }
>> +  void decode_replica(bufferlist::iterator& p) {
>> +    __u32 nonce;
>> +    ::decode(nonce, p);
>> +    replica_nonce = nonce;
>> +    _decode_base(p);
>> +  }
>>
>>
>>
>> diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc
>> index 8ba676e..344777e 100644
>> --- a/src/mds/MDCache.cc
>> +++ b/src/mds/MDCache.cc
>> @@ -4510,8 +4510,22 @@ void MDCache::handle_cache_rejoin_ack(MMDSCacheRejoin *ack)
>>      }
>>    }
>>
>> +  // full dirfrags
>> +  bufferlist::iterator p = ack->dirfrag_base.begin();
>> +  while (!p.end()) {
>> +    dirfrag_t df;
>> +    bufferlist basebl;
>> +    ::decode(df, p);
>> +    ::decode(basebl, p);
>> +    CDir *dir = get_dirfrag(df);
>> +    assert(dir);
>> +    bufferlist::iterator q = basebl.begin();
>> +    dir->_decode_base(q);
>> +    dout(10) << " got dir replica " << *dir << dendl;
>> +  }
>> +
>>    // full inodes
>> -  bufferlist::iterator p = ack->inode_base.begin();
>> +  p = ack->inode_base.begin();
>>    while (!p.end()) {
>>      inodeno_t ino;
>>      snapid_t last;
>> @@ -5178,8 +5192,10 @@ void MDCache::rejoin_send_acks()
>>        // dir
>>        for (map<int,int>::iterator r = dir->replicas_begin();
>>            r != dir->replicas_end();
>> -          ++r)
>> +          ++r) {
>>         ack[r->first]->add_strong_dirfrag(dir->dirfrag(), ++r->second, dir->dir_rep);
>> +       ack[r->first]->add_dirfrag_base(dir);
>> +      }
>>
>>        for (CDir::map_t::iterator q = dir->items.begin();
>>            q != dir->items.end();
>> diff --git a/src/messages/MMDSCacheRejoin.h b/src/messages/MMDSCacheRejoin.h
>> index b88f551..7c37ab4 100644
>> --- a/src/messages/MMDSCacheRejoin.h
>> +++ b/src/messages/MMDSCacheRejoin.h
>> @@ -20,6 +20,7 @@
>>  #include "include/types.h"
>>
>>  #include "mds/CInode.h"
>> +#include "mds/CDir.h"
>>
>>  // sent from replica to auth
>>
>> @@ -169,6 +170,7 @@ class MMDSCacheRejoin : public Message {
>>    // full
>>    bufferlist inode_base;
>>    bufferlist inode_locks;
>> +  bufferlist dirfrag_base;
>>
>>    // authpins, xlocks
>>    struct slave_reqid {
>> @@ -258,7 +260,13 @@ public:
>>    void add_strong_dirfrag(dirfrag_t df, int n, int dr) {
>>      strong_dirfrags[df] = dirfrag_strong(n, dr);
>>    }
>> -
>> +  void add_dirfrag_base(CDir *dir) {
>> +    ::encode(dir->dirfrag(), dirfrag_base);
>> +    bufferlist bl;
>> +    dir->_encode_base(bl);
>> +    ::encode(bl, dirfrag_base);
>> +  }
> 
> We are guilty of doing this in other places, but we should avoid
> implicit encodings like this one, especially when the decode happens
> somewhere else like it does here. We can make a vector dirfrag_bases
> and add to that, and then encode and decode it along with the rest of
> the message — would that work for your purposes?
> -Greg
> 

update this patch or send a new patch that updates both {inode,dirfrag}_base?

Thanks
Yan, Zheng

>> +
>>    // dentries
>>    void add_weak_dirfrag(dirfrag_t df) {
>>      weak_dirfrags.insert(df);
>> @@ -294,6 +302,7 @@ public:
>>      ::encode(wrlocked_inodes, payload);
>>      ::encode(cap_export_bl, payload);
>>      ::encode(strong_dirfrags, payload);
>> +    ::encode(dirfrag_base, payload);
>>      ::encode(weak, payload);
>>      ::encode(weak_dirfrags, payload);
>>      ::encode(weak_inodes, payload);
>> @@ -319,6 +328,7 @@ public:
>>        ::decode(cap_export_paths, q);
>>      }
>>      ::decode(strong_dirfrags, p);
>> +    ::decode(dirfrag_base, p);
>>      ::decode(weak, p);
>>      ::decode(weak_dirfrags, p);
>>      ::decode(weak_inodes, p);
>> --
>> 1.7.11.7
>>

--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [CEPH Users]     [Ceph Large]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux