diff options
author | Emmanuel Dreyfus <manu@netbsd.org> | 2014-10-29 20:35:10 +0100 |
---|---|---|
committer | Vijay Bellur <vbellur@redhat.com> | 2014-11-05 22:28:09 -0800 |
commit | 1a735e300a0ecd35d41f68f3c776350bb18f763a (patch) | |
tree | 11c07e53bf07e89f3bc557a9831ea003c25480c9 /xlators/features/glupy | |
parent | 1c6ab3420b3b04eaf095098b614720b4e12ff498 (diff) |
glupy: portability fixes
Fixes portability problems so that NetBSD passes tests/features/glupy.t
- Use python-config to detect python build environment on all systems,
not just Linux and Darwin.
- Get the site-package directory from python and make sure we install
glupy.py there, Previously we installed within glusterfs prefix,
which caused a problem if it was different that python's prefix.
- Set PYTHONPATH for tests so that the detected site-packages is used
in python's search path. This should be useless, but let us have it
just in case.
- Pass glupy.so path from glusterfsd to glupy.py through an
environment variable and use it in CDLL instead of "", as the
later seems not portable (at least it fails on NetBSD).
- Use gil_init_key pthread_getspecific to avoid deadlocks (that
code was #ifdef out, perhaps because it was not needed on Linux,
but it seems to be required for NetBSD.
- Recover the error message from Python and send it to the logs
to help debugging problems.
BUG: 1129939
Change-Id: Icc71e77d6940f0759cc14c5c5cf7ca6fa431e0d2
Signed-off-by: Emmanuel Dreyfus <manu@netbsd.org>
Reviewed-on: http://review.gluster.org/8978
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Jeff Darcy <jdarcy@redhat.com>
Diffstat (limited to 'xlators/features/glupy')
-rw-r--r-- | xlators/features/glupy/src/Makefile.am | 4 | ||||
-rw-r--r-- | xlators/features/glupy/src/glupy.c | 40 | ||||
-rw-r--r-- | xlators/features/glupy/src/glupy.py | 3 |
3 files changed, 34 insertions, 13 deletions
diff --git a/xlators/features/glupy/src/Makefile.am b/xlators/features/glupy/src/Makefile.am index d9361a5ef49..de8b0de9eeb 100644 --- a/xlators/features/glupy/src/Makefile.am +++ b/xlators/features/glupy/src/Makefile.am @@ -4,7 +4,7 @@ xlator_LTLIBRARIES = glupy.la xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/features glupydir = $(xlatordir)/glupy AM_CPPFLAGS = $(PYTHONDEV_CPPFLAGS) $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src -isystem $(BUILD_PYTHON_INC) -AM_CFLAGS = $(PYTHONDEV_CFLAGS) -Wall -fno-strict-aliasing -DGLUSTER_PYTHON_PATH=\"$(glupydir)\" $(GF_CFLAGS) +AM_CFLAGS = $(PYTHONDEV_CFLAGS) -Wall -fno-strict-aliasing -DGLUSTER_PYTHON_PATH=\"$(glupydir)\" -DPATH_GLUSTERFS_GLUPY_MODULE=\"${xlatordir}/glupy${shrext_cmds}\" $(GF_CFLAGS) # Flags to build glupy.so with glupy_la_LDFLAGS = $(PYTHONDEV_LDFLAGS) -module -avoid-version -shared -nostartfiles @@ -15,7 +15,7 @@ glupy_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la \ noinst_HEADERS = glupy.h # Install glupy.py into the Python site-packages area -pyglupydir = $(pythondir)/gluster +pyglupydir = @BUILD_PYTHON_SITE_PACKAGES@/gluster pyglupy_PYTHON = glupy.py __init__.py CLEANFILES = 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; } diff --git a/xlators/features/glupy/src/glupy.py b/xlators/features/glupy/src/glupy.py index eda8aebb0bb..b9fc3700fa6 100644 --- a/xlators/features/glupy/src/glupy.py +++ b/xlators/features/glupy/src/glupy.py @@ -9,9 +9,10 @@ ## import sys +import os from ctypes import * -dl = CDLL("",RTLD_GLOBAL) +dl = CDLL(os.getenv("PATH_GLUSTERFS_GLUPY_MODULE", ""),RTLD_GLOBAL) class call_frame_t (Structure): |