diff options
Diffstat (limited to 'xlators/features/glupy/src/glupy.c')
| -rw-r--r-- | xlators/features/glupy/src/glupy.c | 40 | 
1 files changed, 30 insertions, 10 deletions
diff --git a/xlators/features/glupy/src/glupy.c b/xlators/features/glupy/src/glupy.c index 292f5b7292f..7bb88c0a0ae 100644 --- a/xlators/features/glupy/src/glupy.c +++ b/xlators/features/glupy/src/glupy.c @@ -31,12 +31,10 @@ pthread_key_t gil_init_key;  PyGILState_STATE  glupy_enter (void)  { -#if 0          if (!pthread_getspecific(gil_init_key)) {                  PyEval_ReleaseLock();                  (void)pthread_setspecific(gil_init_key,(void *)1);          } -#endif          return PyGILState_Ensure();  } @@ -2333,6 +2331,9 @@ init (xlator_t *this)          PyObject                *py_args        = NULL;          PyObject                *syspath        = NULL;  	PyObject                *path           = NULL; +	PyObject                *error_type     = NULL; +	PyObject                *error_msg      = NULL; +	PyObject                *error_bt       = NULL;  	static gf_boolean_t      py_inited      = _gf_false;          void *                   err_cleanup    = &&err_return; @@ -2349,12 +2350,20 @@ init (xlator_t *this)          err_cleanup = &&err_free_priv;  	if (!py_inited) { +	        /*  +                 * This must be done before Py_Initialize(), +                 * because it will duplicate the environment, +                 * and fail to see later environment updates. +                 */ +	        setenv("PATH_GLUSTERFS_GLUPY_MODULE", +                       PATH_GLUSTERFS_GLUPY_MODULE, 1); +                  Py_Initialize();                  PyEval_InitThreads(); -#if 0 +                  (void)pthread_key_create(&gil_init_key,NULL);                  (void)pthread_setspecific(gil_init_key,(void *)1); -#endif +                  /* PyEval_InitThreads takes this "for" us.  No thanks. */                  PyEval_ReleaseLock();                  py_inited = _gf_true; @@ -2370,7 +2379,9 @@ init (xlator_t *this)          if (!py_mod_name) {                  gf_log (this->name, GF_LOG_ERROR, "could not create name");                  if (PyErr_Occurred()) { -                        PyErr_Print(); +                        PyErr_Fetch (&error_type, &error_msg, &error_bt); +                        gf_log (this->name, GF_LOG_ERROR, "Python error: %s", +                                PyString_AsString(error_msg));                  }                  goto *err_cleanup;          } @@ -2379,9 +2390,12 @@ init (xlator_t *this)          priv->py_module = PyImport_Import(py_mod_name);          Py_DECREF(py_mod_name);          if (!priv->py_module) { -                gf_log (this->name, GF_LOG_ERROR, "Python import failed"); +                gf_log (this->name, GF_LOG_ERROR, "Python import of %s failed", +                        module_name);                  if (PyErr_Occurred()) { -                        PyErr_Print(); +                        PyErr_Fetch (&error_type, &error_msg, &error_bt); +                        gf_log (this->name, GF_LOG_ERROR, "Python error: %s", +                                PyString_AsString(error_msg));                  }                  goto *err_cleanup;          } @@ -2392,7 +2406,9 @@ init (xlator_t *this)          if (!py_init_func || !PyCallable_Check(py_init_func)) {                  gf_log (this->name, GF_LOG_ERROR, "missing init func");                  if (PyErr_Occurred()) { -                        PyErr_Print(); +                        PyErr_Fetch (&error_type, &error_msg, &error_bt); +                        gf_log (this->name, GF_LOG_ERROR, "Python error: %s", +                                PyString_AsString(error_msg));                  }                  goto *err_cleanup;          } @@ -2402,7 +2418,9 @@ init (xlator_t *this)          if (!py_args) {                  gf_log (this->name, GF_LOG_ERROR, "could not create args");                  if (PyErr_Occurred()) { -                        PyErr_Print(); +                        PyErr_Fetch (&error_type, &error_msg, &error_bt); +                        gf_log (this->name, GF_LOG_ERROR, "Python error: %s", +                                PyString_AsString(error_msg));                  }                  goto *err_cleanup;          } @@ -2414,7 +2432,9 @@ init (xlator_t *this)          if (!priv->py_xlator) {                  gf_log (this->name, GF_LOG_ERROR, "Python init failed");                  if (PyErr_Occurred()) { -                        PyErr_Print(); +                        PyErr_Fetch (&error_type, &error_msg, &error_bt); +                        gf_log (this->name, GF_LOG_ERROR, "Python error: %s", +                                PyString_AsString(error_msg));                  }                  goto *err_cleanup;          }  | 
