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));