Skip to content

Commit 56345fe

Browse files
authored
main FEATURE do not free sessions while in-use (#903)
1 parent 0bde10b commit 56345fe

File tree

5 files changed

+35
-1
lines changed

5 files changed

+35
-1
lines changed

src/common.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ np_get_user_sess(sr_session_ctx_t *ev_sess)
7979
nc_sid = sr_session_get_event_nc_id(ev_sess);
8080
for (i = 0; (nc_sess = nc_ps_get_session(np2srv.nc_ps, i)); ++i) {
8181
if (nc_session_get_id(nc_sess) == nc_sid) {
82+
nc_session_reference(nc_sess);
8283
break;
8384
}
8485
}
@@ -89,6 +90,21 @@ np_get_user_sess(sr_session_ctx_t *ev_sess)
8990
return nc_session_get_data(nc_sess);
9091
}
9192

93+
void
94+
np_unref_user_sess(sr_session_ctx_t *ev_sess)
95+
{
96+
struct nc_session *nc_sess = NULL;
97+
uint32_t nc_sid, i;
98+
99+
nc_sid = sr_session_get_event_nc_id(ev_sess);
100+
for (i = 0; (nc_sess = nc_ps_get_session(np2srv.nc_ps, i)); ++i) {
101+
if (nc_session_get_id(nc_sess) == nc_sid) {
102+
nc_session_dereference(nc_sess);
103+
break;
104+
}
105+
}
106+
}
107+
92108
void
93109
np2srv_ntf_new_cb(sr_session_ctx_t *UNUSED(session), const sr_ev_notif_type_t notif_type, const struct lyd_node *notif,
94110
time_t timestamp, void *private_data)

src/common.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ const char *np_get_nc_sess_user(sr_session_ctx_t *session);
5353

5454
sr_session_ctx_t *np_get_user_sess(sr_session_ctx_t *ev_sess);
5555

56+
void np_unref_user_sess(sr_session_ctx_t *ev_sess);
57+
5658
void np2srv_ntf_new_cb(sr_session_ctx_t *session, const sr_ev_notif_type_t notif_type, const struct lyd_node *notif,
5759
time_t timestamp, void *private_data);
5860

src/main.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1008,7 +1008,13 @@ worker_thread(void *arg)
10081008
ncm_session_rpc_reply_error(ncs);
10091009
VRB("Session %d: thread %d event reply error.", nc_session_get_id(ncs), idx);
10101010
}
1011-
if (rc & NC_PSPOLL_SESSION_TERM) {
1011+
wait_for_unref:
1012+
if (rc & NC_PSPOLL_SESSION_TERM) {
1013+
if (nc_session_get_refcnt(ncs)) {
1014+
VRB("Session %d: thread %d event session still referenced.", nc_session_get_id(ncs), idx);
1015+
np_sleep(5000);
1016+
goto wait_for_unref;
1017+
}
10121018
VRB("Session %d: thread %d event session terminated.", nc_session_get_id(ncs), idx);
10131019
np2srv_del_session_cb(ncs);
10141020
}

src/netconf.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,7 @@ np2srv_rpc_get_cb(sr_session_ctx_t *session, const char *op_path, const struct l
294294
/* success */
295295

296296
cleanup:
297+
np_unref_user_sess(session);
297298
op_filter_erase(&filter);
298299
lyd_free_withsiblings(data_get);
299300
free(username);
@@ -418,6 +419,7 @@ np2srv_rpc_editconfig_cb(sr_session_ctx_t *session, const char *UNUSED(op_path),
418419
if (user_sess) {
419420
/* discard any changes that possibly failed to be applied */
420421
sr_discard_changes(user_sess);
422+
np_unref_user_sess(session);
421423
}
422424
lyd_free_withsiblings(config);
423425
return rc;
@@ -601,6 +603,7 @@ np2srv_rpc_copyconfig_cb(sr_session_ctx_t *session, const char *UNUSED(op_path),
601603
/* success */
602604

603605
cleanup:
606+
np_unref_user_sess(session);
604607
lyd_free_withsiblings(config);
605608
free(username);
606609
return rc;
@@ -681,6 +684,7 @@ np2srv_rpc_deleteconfig_cb(sr_session_ctx_t *session, const char *UNUSED(op_path
681684
/* success */
682685

683686
cleanup:
687+
np_unref_user_sess(session);
684688
return rc;
685689
}
686690

@@ -737,6 +741,7 @@ np2srv_rpc_un_lock_cb(sr_session_ctx_t *session, const char *UNUSED(op_path), co
737741
/* success */
738742

739743
cleanup:
744+
np_unref_user_sess(session);
740745
return rc;
741746
}
742747

@@ -821,6 +826,7 @@ np2srv_rpc_commit_cb(sr_session_ctx_t *session, const char *UNUSED(op_path), con
821826
/* success */
822827

823828
cleanup:
829+
np_unref_user_sess(session);
824830
return rc;
825831
}
826832

@@ -859,6 +865,7 @@ np2srv_rpc_discard_cb(sr_session_ctx_t *session, const char *UNUSED(op_path), co
859865
/* success */
860866

861867
cleanup:
868+
np_unref_user_sess(session);
862869
return rc;
863870
}
864871

@@ -937,6 +944,7 @@ np2srv_rpc_validate_cb(sr_session_ctx_t *session, const char *UNUSED(op_path), c
937944
/* success */
938945

939946
cleanup:
947+
np_unref_user_sess(session);
940948
lyd_free_withsiblings(config);
941949
return rc;
942950
}

src/netconf_nmda.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,7 @@ np2srv_rpc_getdata_cb(sr_session_ctx_t *session, const char *UNUSED(op_path), co
258258
/* success */
259259

260260
cleanup:
261+
np_unref_user_sess(session);
261262
op_filter_erase(&filter);
262263
lyd_free_withsiblings(select_data);
263264
lyd_free_withsiblings(data);
@@ -355,6 +356,7 @@ np2srv_rpc_editdata_cb(sr_session_ctx_t *session, const char *UNUSED(op_path), c
355356
/* success */
356357

357358
cleanup:
359+
np_unref_user_sess(session);
358360
lyd_free_withsiblings(config);
359361
return rc;
360362
}

0 commit comments

Comments
 (0)