Yes, please send a proper patch or pull request. On Wednesday, October 11, 2017 at 6:44:17 AM UTC-7, Tangchen (UVP) wrote: > > Hi leeman > > > > I think I have found the problem. > > > > On the client side, iscsiadm checks if an session exists in sysfs and if > session_count >= rec->session.nr_sessions. > > But without any lock protection. > > So when multiple commands run in parallel, multiple same sessions could be > created because we set rec->session.multiple = 1. > > > > iscsi_login_portal() > > |--> rec->session.multiple = 1 > > > > On the server side, iscsid runs __session_login_task() serially. And we > checks if a same session exists in session_is_running(). > > > > __session_login_task() > > |--> session_is_running() > > |--> iscsi_sysfs_for_each_session() > > |--> if (rec->session.multiple) > > log_debug(2, "Adding a copy of an existing > session"); // But we didn’t check if session_count > >= rec->session.nr_sessions here. > > > > I think we should also check if session_count >= rec->session.nr_sessions > on server side. > > > > > > Here is a simple patch. If you think it is OK, I’ll send a new one. > > > > Thanks. > > > > > > diff --git a/usr/initiator.c b/usr/initiator.c > > index 9d02f47..d1ceea3 100644 > > --- a/usr/initiator.c > > +++ b/usr/initiator.c > > @@ -1870,14 +1870,12 @@ static iscsi_session_t* > session_find_by_rec(node_rec_t *rec) > > * a session could be running in the kernel but not in iscsid > > * due to a resync or becuase some other app started the session > > */ > > -static int session_is_running(node_rec_t *rec) > > +static int session_is_running(node_rec_t *rec, int *nr_found) > > { > > - int nr_found = 0; > > - > > if (session_find_by_rec(rec)) > > return 1; > > > > - if (iscsi_sysfs_for_each_session(rec, &nr_found, > iscsi_match_session, > > + if (iscsi_sysfs_for_each_session(rec, nr_found, > iscsi_match_session, > > 0)) > > return 1; > > > > @@ -1889,12 +1887,17 @@ static int __session_login_task(node_rec_t *rec, > queue_task_t *qtask) > > iscsi_session_t *session; > > iscsi_conn_t *conn; > > struct iscsi_transport *t; > > - int rc; > > - > > - if (session_is_running(rec)) { > > - if (rec->session.multiple) > > + int rc, nr_found; > > + > > + if (session_is_running(rec, &nr_found)) { > > + if (rec->session.multiple) { > > + if (nr_found >= rec->session.nr_sessions) { > > + log_debug(2, "Cannot add more copy of > session," > > + " %d found.\n", nr_found); > > + return ISCSI_ERR_SESS_EXISTS; > > + } > > log_debug(2, "Adding a copy of an existing > session"); > > - else > > + } else > > return ISCSI_ERR_SESS_EXISTS; > > } > > > > -- > > 1.8.3.1 > > > > *From:* open-iscsi@googlegroups.com [mailto:open-iscsi@googlegroups.com] *On > Behalf Of *Tangchen (UVP) > *Sent:* Monday, October 09, 2017 9:19 PM > *To:* open-iscsi@googlegroups.com > *Cc:* guijianfeng <guijianf...@huawei.com>; Zhangyanfei (YF) < > yanfei.zh...@huawei.com> > *Subject:* RE: [iscsiadm] iscsiadm creates multiple same sessions when > run with --login option in parallel. > > > > Hi leeman > > > > I think it is because iscsi_login_portal() has no protection to avoid > parallel searching the sysfs for the same session. > > > > Can we use something like sem to serialize the searching from different > processes ? > > Since I don’t see any communication with iscsid in this login operation, > I’m not sure if it is a good idea to do the synchronization in iscsid. > > > > Thanks. > > > > > > *From:* open-iscsi@googlegroups.com [mailto:open-iscsi@googlegroups.com > <open-iscsi@googlegroups.com>] *On Behalf Of *The Lee-Man > *Sent:* Wednesday, October 04, 2017 12:27 AM > *To:* open-iscsi <open-iscsi@googlegroups.com> > *Subject:* Re: [iscsiadm] iscsiadm creates multiple same sessions when > run with --login option in parallel. > > > > Thanks for this report. I'll try to reproduce this myself and see what is > going on. > > It is certainly the case that there is insufficient locking in iscsid with > respect to multiple threads, IMHO, so I am not surprised. > > On Wednesday, September 27, 2017 at 11:43:02 PM UTC-7, Tangchen (UVP) > wrote: > > Hi guys, > > If we run iscsiadm -m node --login command through the same IP address 4 > times, only one session will be created. > But if we run them in parallel, then 4 same sessions could be created. > ( Here, xxx.xxx.xxx.xxx is the IP address to the IPSAN. I'm using the same > IP in these 4 commands. ) > > # iscsiadm -m node -p xxx.xxx.xxx.xxx --login & > # iscsiadm -m node -p xxx.xxx.xxx.xxx --login & > # iscsiadm -m node -p xxx.xxx.xxx.xxx --login & > # iscsiadm -m node -p xxx.xxx.xxx.xxx --login & > > > Logging in to [iface: default, target: iqn. xxx.xxx.xxx.xxx, portal: > xxx.xxx.xxx.xxx] (multiple) > Logging in to [iface: default, target: iqn. xxx.xxx.xxx.xxx, portal: > xxx.xxx.xxx.xxx] (multiple) > Logging in to [iface: default, target: iqn. xxx.xxx.xxx.xxx, portal: > xxx.xxx.xxx.xxx] (multiple) > Logging in to [iface: default, target: iqn. xxx.xxx.xxx.xxx, portal: > xxx.xxx.xxx.xxx] (multiple) > Login to [iface: default, target: xxx.xxx.xxx.xxx, portal: > xxx.xxx.xxx.xxx] successful. > Login to [iface: default, target: xxx.xxx.xxx.xxx, portal: > xxx.xxx.xxx.xxx] successful. > Login to [iface: default, target: xxx.xxx.xxx.xxx, portal: > xxx.xxx.xxx.xxx] successful. > Login to [iface: default, target: xxx.xxx.xxx.xxx, portal: > xxx.xxx.xxx.xxx] successful. > > # iscsiadm -m session > tcp: [1] xxx.xxx.xxx.xxx (non-flash) > tcp: [2] xxx.xxx.xxx.xxx (non-flash) > tcp: [3] xxx.xxx.xxx.xxx (non-flash) > tcp: [4] xxx.xxx.xxx.xxx (non-flash) > > If we check the net connection in /proc/net/nf_conntrack, they are 4 TCP > connections with different src ports. > And if we run logout command only once, all the 4 sessions will be > destroyed. > > Unfortunately, service like multipathd cannot tell the difference between > them. If we have 4 same sessions, > 4 paths will be created connecting to the dm device. But actually they are > the same paths. > > Referring to the code, iscsiadm command does prevent creating same session > by checking /sys/class/iscsi_session/ dir. > But no multi-thread protection in there. > > Any idea how to solve this problem ? > > Thanks. > > -- > You received this message because you are subscribed to the Google Groups > "open-iscsi" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to open-iscsi+unsubscr...@googlegroups.com. > To post to this group, send email to open-iscsi@googlegroups.com. > Visit this group at https://groups.google.com/group/open-iscsi. > For more options, visit https://groups.google.com/d/optout. > > -- > You received this message because you are subscribed to the Google Groups > "open-iscsi" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to open-iscsi+unsubscr...@googlegroups.com. > To post to this group, send email to open-iscsi@googlegroups.com. > Visit this group at https://groups.google.com/group/open-iscsi. > For more options, visit https://groups.google.com/d/optout. >
-- You received this message because you are subscribed to the Google Groups "open-iscsi" group. To unsubscribe from this group and stop receiving emails from it, send an email to open-iscsi+unsubscr...@googlegroups.com. To post to this group, send email to open-iscsi@googlegroups.com. Visit this group at https://groups.google.com/group/open-iscsi. For more options, visit https://groups.google.com/d/optout.