Hi Malahal, Thanks for your reply.
#1. I'd like to post a patch to delete it, because I have some cleanups for drc. #2/#3. Sorry for my missing of nfs_rpc_free_user_data(). With it, everything is okay. thanks, Kinglong Mee On 10/13/2017 15:52, Malahal Naineni wrote: > #1. Looks like a bug! Lines 629 and 630 should be deleted > #2. See nfs_rpc_free_user_data(). It sets xp_u2 to NULL and drc ref is > decremented there. > #3. Life time of drc should start when it is allocated in > nfs_dupreq_get_drc() using alloc_tcp_drc(). > It can live beyond xprt's xp_u2 setting to NULL. It will live until we > decide to free in drc_free_expired() using free_tcp_drc(). > > Regards, Malahal. > PS: The comment "drc cache maintains a ref count." seems to imply that it > will have a refcount for keeping it in the hash table itself. I may have kept > those two lines because of that but It doesn't make sense as refcnt will > never go to zero this way. > > On Thu, Oct 12, 2017 at 3:48 PM, Kinglong Mee <kinglong...@gmail.com > <mailto:kinglong...@gmail.com>> wrote: > > Describes in src/RPCAL/nfs_dupreq.c, > > * The life of tcp drc: it gets allocated when we process the first > * request on the connection. It is put into rbtree (tcp_drc_recycle_t). > * drc cache maintains a ref count. Every request as well as the xprt > * holds a ref count. Its ref count should go to zero when the > * connection's xprt gets freed (all requests should be completed on the > * xprt by this time). When the ref count goes to zero, it is also put > * into a recycle queue (tcp_drc_recycle_q). When a reconnection > * happens, we hope to find the same drc that was used before, and the > * ref count goes up again. At the same time, the drc will be removed > * from the recycle queue. Only drc's with ref count zero end up in the > * recycle queue. If a reconnection doesn't happen in time, the drc gets > * freed by drc_free_expired() after some period of inactivety. > > Some questions about the life time of tcp drc, > 1. The are two references of drc for xprt in nfs_dupreq_get_drc(). > 629 /* xprt ref */ > 630 drc->refcnt = 1; > ... > 638 (void)nfs_dupreq_ref_drc(drc); /* xprt > ref */ > ... > 653 req->rq_xprt->xp_u2 = (void *)drc; > > I think it's a bug. The first one needs remove. Right? > > 2. The is no place to decrease the reference of drc for xprt. > The xprt argument in nfs_dupreq_put_drc() is unused. > Should it be used to decrease the ref? > I think it's the right place to decrease the ref in > nfs_dupreq_put_drc(). > > 3. My doubts is that, the life time of drc stored in req->rq_xprt->xp_u2 ? > Start at #1, end at #2 (req->rq_xprt->xp_u2 = NULL) ? > If that, the bad case is always lookup drc from tcp_drc_recycle_t. > > Otherwise, don't put the reference at #2, when to put it? > the bad case is the drc ref always be 1 forever, am I right? > > thanks, > Kinglong Mee > > > ------------------------------------------------------------------------------ > Check out the vibrant tech community on one of the world's most > engaging tech sites, Slashdot.org! http://sdm.link/slashdot > _______________________________________________ > Nfs-ganesha-devel mailing list > Nfs-ganesha-devel@lists.sourceforge.net > <mailto:Nfs-ganesha-devel@lists.sourceforge.net> > https://lists.sourceforge.net/lists/listinfo/nfs-ganesha-devel > <https://lists.sourceforge.net/lists/listinfo/nfs-ganesha-devel> > > ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Nfs-ganesha-devel mailing list Nfs-ganesha-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/nfs-ganesha-devel