diff options
| -rw-r--r-- | configure.ac | 18 | ||||
| -rw-r--r-- | tests/env.rc.in | 5 | ||||
| -rwxr-xr-x | tests/features/glupy.t | 1 | ||||
| -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 | 
6 files changed, 45 insertions, 26 deletions
diff --git a/configure.ac b/configure.ac index 5f844892bbf..90102e26973 100644 --- a/configure.ac +++ b/configure.ac @@ -218,6 +218,7 @@ AC_CANONICAL_HOST  AC_PROG_CC  AC_DISABLE_STATIC  AC_PROG_LIBTOOL +AC_SUBST([shrext_cmds])  AC_CHECK_PROG([RPCGEN], [rpcgen], [yes], [no]) @@ -968,18 +969,9 @@ saved_CFLAGS=$CFLAGS  saved_CPPFLAGS=$CPPFLAGS  saved_LDFLAGS=$LDFLAGS -case $host_os in -     linux*) -       CFLAGS="`${PYTHON}-config --cflags`" -       CPPFLAGS=$CFLAGS -       LDFLAGS="-L`${PYTHON}-config --prefix`/lib `${PYTHON}-config --ldflags`" -       ;; -     darwin*) -       CFLAGS="`${PYTHON}-config --cflags`" -       CPPFLAGS=$CFLAGS -       LDFLAGS="-L`${PYTHON}-config --prefix`/lib `${PYTHON}-config --ldflags`" -       ;; -esac +CFLAGS="`${PYTHON}-config --cflags`" +CPPFLAGS=$CFLAGS +LDFLAGS="-L`${PYTHON}-config --prefix`/lib `${PYTHON}-config --ldflags`"  AC_CHECK_HEADERS([python$PYTHON_VERSION/Python.h],[have_Python_h=yes],[])  AC_ARG_ENABLE([glupy], @@ -1030,12 +1022,14 @@ case $host_os in  esac  if test "x$BUILD_GLUPY" = "xyes"; then +   BUILD_PYTHON_SITE_PACKAGES=`$PYTHON -c 'from distutils.sysconfig import get_python_lib; print(get_python_lib())'`     BUILD_PYTHON_INC=`$PYTHON -c "from distutils import sysconfig; print sysconfig.get_python_inc()"`     BUILD_PYTHON_LIB=python$PYTHON_VERSION     GLUPY_SUBDIR=glupy     GLUPY_SUBDIR_MAKEFILE=xlators/features/glupy/Makefile     GLUPY_SUBDIR_SRC_MAKEFILE=xlators/features/glupy/src/Makefile     echo "building glupy with -isystem $BUILD_PYTHON_INC -l $BUILD_PYTHON_LIB" +   AC_SUBST(BUILD_PYTHON_SITE_PACKAGES)     AC_SUBST(BUILD_PYTHON_INC)     AC_SUBST(BUILD_PYTHON_LIB)     AC_SUBST(GLUPY_SUBDIR) diff --git a/tests/env.rc.in b/tests/env.rc.in index 000a80f18fb..1850b7a36f6 100644 --- a/tests/env.rc.in +++ b/tests/env.rc.in @@ -8,4 +8,7 @@ LD_LIBRARY_PATH=@libdir@:$LD_LIBRARY_PATH  export LD_LIBRARY_PATH  GLUSTERD_WORKDIR=@GLUSTERD_WORKDIR@ -export GLUSTERD_WORKDIR
\ No newline at end of file +export GLUSTERD_WORKDIR + +PYTHONPATH=@BUILD_PYTHON_SITE_PACKAGES@:$PYTHON_PATH +export PYTHONPATH diff --git a/tests/features/glupy.t b/tests/features/glupy.t index a34e48ffec0..8b79a148d4d 100755 --- a/tests/features/glupy.t +++ b/tests/features/glupy.t @@ -3,6 +3,7 @@  . $(dirname $0)/../include.rc  . $(dirname $0)/../volume.rc +echo $PYTHON_PATH >&2  cleanup;  TEST mkdir -p $B0/glupytest 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):  | 
