Print this page
NEX-19665 Several door servers don't properly handle exiting threads
Review by: Gordon Ross <gordon.ross@nexenta.com>
Review by: Evan Layton <evan.layton@nexenta.com>
NEX-2225 Unable to join NexentaStor to 2008 AD
NEX-1638 Updated DC Locator
 Includes work by: matt.barden@nexenta.com, kevin.crowe@nexenta.com

*** 18,28 **** * * CDDL HEADER END */ /* * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. ! * Copyright 2014 Nexenta Systems, Inc. All rights reserved. */ /* * main() of idmapd(1M) --- 18,28 ---- * * CDDL HEADER END */ /* * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. ! * Copyright 2018 Nexenta Systems, Inc. All rights reserved. */ /* * main() of idmapd(1M)
*** 82,98 **** /* * Server door thread start routine. * * Set a TSD value to the door thread. This enables the destructor to ! * be called when this thread exits. */ /*ARGSUSED*/ static void * idmapd_door_thread_start(void *arg) { ! static void *value = 0; /* * Disable cancellation to avoid memory leaks from not running * the thread cleanup code. */ --- 82,99 ---- /* * Server door thread start routine. * * Set a TSD value to the door thread. This enables the destructor to ! * be called when this thread exits. Note that we need a non-NULL ! * value for this or the TSD destructor is not called. */ /*ARGSUSED*/ static void * idmapd_door_thread_start(void *arg) { ! static void *value = "NON-NULL TSD"; /* * Disable cancellation to avoid memory leaks from not running * the thread cleanup code. */
*** 134,143 **** --- 135,146 ---- static void idmapd_door_thread_cleanup(void *arg) { int num; + /* set TSD to NULL so we don't loop infinitely */ + (void) pthread_setspecific(create_threads_key, NULL); num = atomic_dec_32_nv(&num_threads); idmapdlog(LOG_DEBUG, "exiting thread ID %d - %d threads currently active", pthread_self(), num); }
*** 377,386 **** --- 380,396 ---- if ((error = init_mapping_system()) < 0) { idmapdlog(LOG_ERR, "unable to initialize mapping system"); exit(error < -2 ? SMF_EXIT_ERR_CONFIG : 1); } + /* + * This means max_threads can't be updated without restarting idmap. + */ + RDLOCK_CONFIG(); + max_threads = _idmapdstate.cfg->pgcfg.max_threads; + UNLOCK_CONFIG(); + (void) door_server_create(idmapd_door_thread_create); if ((error = pthread_key_create(&create_threads_key, idmapd_door_thread_cleanup)) != 0) { idmapdlog(LOG_ERR, "unable to create threads key (%s)", strerror(error));