Hi
  I'm sorry for subject with Re. I will send it  again.

On 2020/8/18 21:11, 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
> 
> If checking is_deamon is deleted, there are many other things need be done 
> like in
> https://www.redhat.com/archives/dm-devel/2020-July/msg00245.html. And this
> branch develops from 0.8.3 but upstream_queue is mainline which develops from
> 0.8.4.
> Here, we skip alloc_path if pp isn't find in pathvec and process is daemon.  
> In
> daemon, we should not store path with incomplete information to pathvec.  The
> pathvec stores all paths in daemon, so it is reasonable keep same with 
> pathvec.
> 
> Reported-by: Tianxiong Li <[email protected]>
> Signed-off-by: Lixiaokeng <[email protected]>
> Signed-off-by: Zhiqiang Liu <[email protected]>
> ---
>  libmultipath/dmparser.c | 14 ++++++++++++--
>  1 file changed, 12 insertions(+), 2 deletions(-)
> 
> diff --git a/libmultipath/dmparser.c b/libmultipath/dmparser.c
> index f02c551..0f370e9 100644
> --- a/libmultipath/dmparser.c
> +++ b/libmultipath/dmparser.c
> @@ -314,6 +314,16 @@ int disassemble_map(vector pathvec, char *params, struct 
> multipath *mpp,
>                       }
> 
>                       if (!pp) {
> +                             /* daemon should keep same with pathvec */
> +                             /* pp is not find in pathvec, skip it */
> +                             if (is_daemon) {
> +                                     FREE(word);
> +                                     for (k = 0; k < num_paths_args; k++) {
> +                                             p += get_word(p, NULL);
> +                                     }
> +                                     continue;
> +                             }
> +
>                               pp_unfound = 1;
>                               pp = alloc_path();
> 
> @@ -326,8 +336,8 @@ int disassemble_map(vector pathvec, char *params, struct 
> multipath *mpp,
>                                       strncpy(pp->wwid, mpp->wwid,
>                                               WWID_SIZE - 1);
>                               }
> -                             /* Only call this in multipath client mode */
> -                             if (!is_daemon && store_path(pathvec, pp)) {
> +
> +                             if (store_path(pathvec, pp)) {
>                                       free_path(pp);
>                                       goto out1;
>                               }
> --
> 

--
dm-devel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/dm-devel

Reply via email to