On Sat, Jul 25, 2020 at 01:47:01PM +0800, lixiaokeng wrote:
> When one iscsi device logs in and logs out with the "multipath -r"
> executed at the same time, memory leak happens in multipathd
> process.
> 
> The reason is following. When "multipath -r" is executed, the path
> will be free in configure function. Before path_discovery executed,
> iscsi device logs out. Then path_discovery will not find any path and
> there is no path in the gvecs->pathvec. When map_discovery function
> is executed, disassemble_map function will be called. Because
> gvecs->pathvec->slot is empty and is_deamon is 1, a path will be
> allocated and is not stored in gvecs->pathvec but store in
> mpp->pg. But when the mpp is removed and freed by remove_map
> function, the path will not be free and can't be find anymore.
> 
> The procedure details given as follows,
> 1."multipath -r" is executed
> main
>       ->child
>               ->reconfigure
>                       ->configure
>                               ->path_discovery //after iscsi logout
>                               ->map_discovery
>                                       ->update_multipath_table
>                                               ->disassemble_map
>                                                       ->alloc_path
> 2.then "multipath -r" is executed again
> main
> main
>       ->child
>               ->reconfigure
>                       ->remove_maps_and_stop_waiters
>                               ->remove_maps
> 
> Here, we delete checking is_deamon. Because whether the process is a
> daemon process or not, we think the path should be add to gvecs->pathvec.

There is more work that needs to be done to besides removing the is_daemon
check.  However, Martin already posted patches that deal with this as
part of the his large patchset.

https://www.redhat.com/archives/dm-devel/2020-July/msg00245.html

You should take a look at those, and at my comments on them, because they
should resolve your issue.

-Ben

> 
> Reported-by: Tianxiong Li <lutianxi...@huawei.com>
> Signed-off-by: Lixiaokeng <lixiaok...@huawei.com>
> Signed-off-by: Zhiqiang Liu <liuzhiqian...@huawei.com>
> 
> ---
>  libmultipath/dmparser.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/libmultipath/dmparser.c b/libmultipath/dmparser.c
> index b856a07f..d556f642 100644
> --- a/libmultipath/dmparser.c
> +++ b/libmultipath/dmparser.c
> @@ -315,7 +315,7 @@ int disassemble_map(vector pathvec, char *params, struct 
> multipath *mpp,
>                                               WWID_SIZE);
>                               }
>                               /* Only call this in multipath client mode */
> -                             if (!is_daemon && store_path(pathvec, pp))
> +                             if (store_path(pathvec, pp))
>                                       goto out1;
>                       } else {
>                               if (!strlen(pp->wwid) &&
> --

--
dm-devel mailing list
dm-devel@redhat.com
https://www.redhat.com/mailman/listinfo/dm-devel

Reply via email to