#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
int i, rc = 0;
ENTRY;
- /* We require 2 threads min - see note in
- ptlrpc_server_handle_request */
+ /* We require 2 threads min - see note in
+ * ptlrpc_server_handle_request() */
LASSERT(svc->srv_threads_min >= 2);
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(thread, sizeof(*thread));
}
run_test 39 "leak_finder recognizes both LUSTRE and LNET malloc messages"
+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"
+
equals_msg `basename $0`: test complete
[ -f "$TESTSUITELOG" ] && cat $TESTSUITELOG || true