summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--configure.ac18
-rw-r--r--tests/env.rc.in5
-rwxr-xr-xtests/features/glupy.t1
-rw-r--r--xlators/features/glupy/src/Makefile.am4
-rw-r--r--xlators/features/glupy/src/glupy.c40
-rw-r--r--xlators/features/glupy/src/glupy.py3
6 files changed, 45 insertions, 26 deletions
diff --git a/configure.ac b/configure.ac
index 3757c33df72..4de524f8bda 100644
--- a/configure.ac
+++ b/configure.ac
@@ -219,6 +219,7 @@ AC_CANONICAL_HOST
AC_PROG_CC
AC_DISABLE_STATIC
AC_PROG_LIBTOOL
+AC_SUBST([shrext_cmds])
AC_CHECK_PROG([RPCGEN], [rpcgen], [yes], [no])
@@ -1003,18 +1004,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],
@@ -1065,12 +1057,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):