#define OBD_FAIL_TGT_DELAY_CONNECT 0x703
#define OBD_FAIL_TGT_DELAY_RECONNECT 0x704
#define OBD_FAIL_TGT_DELAY_PRECREATE 0x705
+#define OBD_FAIL_TGT_TOOMANY_THREADS 0x706
#define OBD_FAIL_MDC_REVALIDATE_PAUSE 0x800
#define OBD_FAIL_MDC_ENQUEUE_PAUSE 0x801
LASSERT(svc->srv_threads_min > 0);
for (i = 0; i < svc->srv_threads_min; i++) {
rc = ptlrpc_start_thread(dev, svc);
+ /* We have enough threads, don't start more. b=15759 */
+ if (rc == -EMFILE)
+ break;
if (rc) {
CERROR("cannot start %s thread #%d: rc %d\n",
svc->srv_thread_name, i, rc);
CDEBUG(D_RPCTRACE, "%s started %d min %d max %d running %d\n",
svc->srv_name, svc->srv_threads_started, svc->srv_threads_min,
svc->srv_threads_max, svc->srv_threads_running);
- if (svc->srv_threads_started >= svc->srv_threads_max)
+ if (unlikely(svc->srv_threads_started >= svc->srv_threads_max) ||
+ (OBD_FAIL_CHECK(OBD_FAIL_TGT_TOOMANY_THREADS) &&
+ svc->srv_threads_started == svc->srv_threads_min - 1))
RETURN(-EMFILE);
OBD_ALLOC_PTR(thread);
}
run_test 39 "leak_finder recognizes both LUSTRE and LNET malloc messages"
-test_40() { #bug 14134
+test_40() { # bug 15759
+ start_ost
+ #define OBD_FAIL_TGT_TOOMANY_THREADS 0x706
+ do_facet mds "sysctl -w lustre.fail_loc=0x80000706"
+ start_mds
+ cleanup
+}
+run_test 40 "race during service thread startup"
+
+test_41() { #bug 14134
local rc
start mds $MDSDEV $MDS_MOUNT_OPTS -o nosvc
start ost `ostdevname 1` $OST_MOUNT_OPTS
unload_modules || return 204
return $rc
}
-run_test 40 "mount mds with --nosvc and --nomgs"
+run_test 41 "mount mds with --nosvc and --nomgs"
umount_client $MOUNT
cleanup_nocli