|
Graham Dumpleton
grahamd at dscpl.com.au
Sun Apr 9 20:28:53 EDT 2006
Graham Dumpleton wrote ..
> As a start for some internal self debugging by mod_python, how about
> we make the following change:
>
> Index: src/mod_python.c
> ===================================================================
> --- src/mod_python.c (revision 392846)
> +++ src/mod_python.c (working copy)
> @@ -575,6 +575,9 @@
> const char *userdata_key = "python_init";
> apr_status_t rc;
>
> + const char *py_compile_version = PY_VERSION;
> + const char *py_dynamic_version = 0;
> +
> /* The "initialized" flag is a fudge for Mac OS X. It
> * addresses two issues. The first is that when an Apache
> * "restart" is performed, Apache will unload the mod_python
> @@ -599,9 +602,17 @@
>
> /* mod_python version */
> ap_add_version_component(p, VERSION_COMPONENT);
> -
> +
> + py_dynamic_version = strtok((char *)Py_GetVersion(), " ");
> +
> + if (strcmp(py_compile_version, py_dynamic_version) != 0) {
> + ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, s,
> + "python_init: Version mismatch, expected %s, found
> %s.",
> + py_compile_version, py_dynamic_version);
> + }
> +
> /* Python version */
> - sprintf(buff, "Python/%.200s", strtok((char *)Py_GetVersion(), " "));
> + sprintf(buff, "Python/%.200s", py_dynamic_version);
> ap_add_version_component(p, buff);
>
> /* cache main server */
>
> Will this work, reliably across Python on different platforms? I think
> it should as long as PyGetVersion() implementation hasn't changed
> at some point.
>
> There are some other points in code where other checks or debug
> could be output. For example, if mod_python Python modules can't
> be found, then dumpy out sys.path.
>
> Even for the above, would be nice to dump out where Python thinks
> it lives when such a mismatch occurs, as would highlight where
> wrong version is coming from. Just need to work out a good way
> of determining this, may need to wait until after Python has been
> initialised though.
Here is a better version. If it fails on version match, will dump out:
[Mon Apr 10 10:24:02 2006] [error] python_init: Version mismatch, expected 2.3.5, found 2.3.
[Mon Apr 10 10:24:02 2006] [error] python_init: Executable '/usr/bin/python'.
[Mon Apr 10 10:24:02 2006] [error] python_init: Using Path '/Users/grahamd/lib/python:/System/Library/Frameworks/Python.framework/Versions/2.3/lib/python23.zip:/System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/:/System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/plat-darwin:/System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/plat-mac:/System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/plat-mac/lib-scriptpackages:/System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/lib-tk:/System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/lib-dynload'.
Patch is as follows. The question is, should mod_python output both
these values all the time?
Index: src/mod_python.c
===================================================================
--- src/mod_python.c (revision 392846)
+++ src/mod_python.c (working copy)
@@ -575,6 +575,9 @@
const char *userdata_key = "python_init";
apr_status_t rc;
+ const char *py_compile_version = PY_VERSION;
+ const char *py_dynamic_version = 0;
+
/* The "initialized" flag is a fudge for Mac OS X. It
* addresses two issues. The first is that when an Apache
* "restart" is performed, Apache will unload the mod_python
@@ -599,9 +602,23 @@
/* mod_python version */
ap_add_version_component(p, VERSION_COMPONENT);
-
+
+ py_dynamic_version = strtok((char *)Py_GetVersion(), " ");
+
+ if (strcmp(py_compile_version, py_dynamic_version) != 0) {
+ ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, s,
+ "python_init: Version mismatch, expected %s, found %s.",
+ py_compile_version, py_dynamic_version);
+ ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, s,
+ "python_init: Executable '%s'.",
+ Py_GetProgramFullPath());
+ ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, s,
+ "python_init: Using Path '%s'.",
+ Py_GetPath());
+ }
+
/* Python version */
- sprintf(buff, "Python/%.200s", strtok((char *)Py_GetVersion(), " "));
+ sprintf(buff, "Python/%.200s", py_dynamic_version);
ap_add_version_component(p, buff);
/* cache main server */
Graham
|