You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl-cvs@perl.apache.org by jk...@apache.org on 2015/05/29 07:41:19 UTC

svn commit: r1682369 - in /perl/modperl/trunk: ./ src/modules/perl/ t/response/TestDirective/ t/response/TestModperl/ t/response/TestPerl/

Author: jkaluza
Date: Fri May 29 05:41:18 2015
New Revision: 1682369

URL: http://svn.apache.org/r1682369
Log:
Remove PerlInterpScope directive as discussed on mailing list. PerlInterpScope
did not work correctly with httpd-2.4.x threaded MPMs. For example when using
'PerlInterpScope connection' and multiple requests are handled using the single
connection, every request tries to fetch new interpreter. This leads to
deadlock soon, because we can always have more requests than interpreters.

There are more situations like the one described above and the fix is quite
hard with the way how the usage of PerlInterpeters is designed currently.

Modified:
    perl/modperl/trunk/Changes
    perl/modperl/trunk/src/modules/perl/mod_perl.c
    perl/modperl/trunk/src/modules/perl/modperl_bucket.c
    perl/modperl/trunk/src/modules/perl/modperl_cmd.c
    perl/modperl/trunk/src/modules/perl/modperl_cmd.h
    perl/modperl/trunk/src/modules/perl/modperl_config.c
    perl/modperl/trunk/src/modules/perl/modperl_interp.c
    perl/modperl/trunk/src/modules/perl/modperl_interp.h
    perl/modperl/trunk/src/modules/perl/modperl_types.h
    perl/modperl/trunk/t/response/TestDirective/perlcleanuphandler.pm
    perl/modperl/trunk/t/response/TestModperl/setupenv.pm
    perl/modperl/trunk/t/response/TestPerl/ithreads3.pm

Modified: perl/modperl/trunk/Changes
URL: http://svn.apache.org/viewvc/perl/modperl/trunk/Changes?rev=1682369&r1=1682368&r2=1682369&view=diff
==============================================================================
--- perl/modperl/trunk/Changes (original)
+++ perl/modperl/trunk/Changes Fri May 29 05:41:18 2015
@@ -10,6 +10,9 @@ Also refer to the Apache::Test changes l
 
 =over 3
 
+Remove PerlInterpScope. This has not been working properly with threaded
+MPMs with httpd-2.4.x and the use-case of this directive was questionable.
+
 =item 2.0.9-rc1
 
 Add support for Apache httpd-2.4.x. [Torsten Foertsch, Jan Kaluza,

Modified: perl/modperl/trunk/src/modules/perl/mod_perl.c
URL: http://svn.apache.org/viewvc/perl/modperl/trunk/src/modules/perl/mod_perl.c?rev=1682369&r1=1682368&r2=1682369&view=diff
==============================================================================
--- perl/modperl/trunk/src/modules/perl/mod_perl.c (original)
+++ perl/modperl/trunk/src/modules/perl/mod_perl.c Fri May 29 05:41:18 2015
@@ -503,9 +503,6 @@ static void modperl_init_clones(server_r
         MP_dSCFG(s);
 #ifdef MP_TRACE
         char *name = modperl_server_desc(s, p);
-
-        MP_TRACE_i(MP_FUNC, "PerlInterpScope set to %s for %s",
-                   modperl_interp_scope_desc(scfg->interp_scope), name);
 #else
         char *name = NULL;
 #endif /* MP_TRACE */
@@ -973,8 +970,6 @@ static const command_rec modperl_cmds[]
                      "Min number of spare Perl interpreters"),
     MP_CMD_SRV_TAKE1("PerlInterpMaxRequests", interp_max_requests,
                      "Max number of requests per Perl interpreters"),
-    MP_CMD_DIR_TAKE1("PerlInterpScope", interp_scope,
-                     "Scope of a Perl interpreter"),
 #endif
 #ifdef MP_COMPAT_1X
     MP_CMD_DIR_FLAG("PerlSendHeader", send_header,

Modified: perl/modperl/trunk/src/modules/perl/modperl_bucket.c
URL: http://svn.apache.org/viewvc/perl/modperl/trunk/src/modules/perl/modperl_bucket.c?rev=1682369&r1=1682368&r2=1682369&view=diff
==============================================================================
--- perl/modperl/trunk/src/modules/perl/modperl_bucket.c (original)
+++ perl/modperl/trunk/src/modules/perl/modperl_bucket.c Fri May 29 05:41:18 2015
@@ -121,7 +121,6 @@ static apr_bucket *modperl_bucket_sv_mak
         return NULL;
     }
 
-    /* XXX: need to deal with PerlInterpScope */
 #ifdef USE_ITHREADS
     svbucket->perl = aTHX;
 #endif

Modified: perl/modperl/trunk/src/modules/perl/modperl_cmd.c
URL: http://svn.apache.org/viewvc/perl/modperl/trunk/src/modules/perl/modperl_cmd.c?rev=1682369&r1=1682368&r2=1682369&view=diff
==============================================================================
--- perl/modperl/trunk/src/modules/perl/modperl_cmd.c (original)
+++ perl/modperl/trunk/src/modules/perl/modperl_cmd.c Fri May 29 05:41:18 2015
@@ -795,58 +795,6 @@ MP_CMD_SRV_DECLARE_FLAG(setup_env)
 
 #ifdef USE_ITHREADS
 
-#define MP_INTERP_SCOPE_USAGE "PerlInterpScope must be one of "
-
-#define MP_INTERP_SCOPE_DIR_OPTS \
-    "handler, subrequest or request"
-
-#define MP_INTERP_SCOPE_DIR_USAGE \
-    MP_INTERP_SCOPE_USAGE MP_INTERP_SCOPE_DIR_OPTS
-
-#define MP_INTERP_SCOPE_SRV_OPTS \
-    "connection, " MP_INTERP_SCOPE_DIR_OPTS
-
-#define MP_INTERP_SCOPE_SRV_USAGE \
-    MP_INTERP_SCOPE_USAGE MP_INTERP_SCOPE_SRV_OPTS
-
-MP_CMD_SRV_DECLARE(interp_scope)
-{
-    modperl_interp_scope_e *scope;
-    modperl_config_dir_t *dcfg = (modperl_config_dir_t *)mconfig;
-    MP_dSCFG(parms->server);
-    int is_per_dir = parms->path ? 1 : 0;
-
-    scope = is_per_dir ? &dcfg->interp_scope : &scfg->interp_scope;
-
-    switch (toLOWER(*arg)) {
-      case 'h':
-        if (strcaseEQ(arg, "handler")) {
-            *scope = MP_INTERP_SCOPE_HANDLER;
-            break;
-        }
-      case 's':
-        if (strcaseEQ(arg, "subrequest")) {
-            *scope = MP_INTERP_SCOPE_SUBREQUEST;
-            break;
-        }
-      case 'r':
-        if (strcaseEQ(arg, "request")) {
-            *scope = MP_INTERP_SCOPE_REQUEST;
-            break;
-        }
-      case 'c':
-        if (!is_per_dir && strcaseEQ(arg, "connection")) {
-            *scope = MP_INTERP_SCOPE_CONNECTION;
-            break;
-        }
-      default:
-        return is_per_dir ?
-             MP_INTERP_SCOPE_DIR_USAGE : MP_INTERP_SCOPE_SRV_USAGE;
-    };
-
-    return NULL;
-}
-
 #define MP_CMD_INTERP_POOL_IMP(xitem) \
 const char *modperl_cmd_interp_##xitem(cmd_parms *parms, \
                                       void *mconfig, const char *arg) \

Modified: perl/modperl/trunk/src/modules/perl/modperl_cmd.h
URL: http://svn.apache.org/viewvc/perl/modperl/trunk/src/modules/perl/modperl_cmd.h?rev=1682369&r1=1682368&r2=1682369&view=diff
==============================================================================
--- perl/modperl/trunk/src/modules/perl/modperl_cmd.h (original)
+++ perl/modperl/trunk/src/modules/perl/modperl_cmd.h Fri May 29 05:41:18 2015
@@ -77,22 +77,6 @@ MP_CMD_SRV_DECLARE(interp_max);
 MP_CMD_SRV_DECLARE(interp_max_spare);
 MP_CMD_SRV_DECLARE(interp_min_spare);
 MP_CMD_SRV_DECLARE(interp_max_requests);
-MP_CMD_SRV_DECLARE(interp_scope);
-
-#define modperl_interp_scope_undef(dcfg) \
-(dcfg->interp_scope == MP_INTERP_SCOPE_UNDEF)
-
-#define modperl_interp_scope_handler(dcfg) \
-(dcfg->interp_scope == MP_INTERP_SCOPE_HANDLER)
-
-#define modperl_interp_scope_subrequest(dcfg) \
-(dcfg->interp_scope == MP_INTERP_SCOPE_SUBREQUEST)
-
-#define modperl_interp_scope_request(scfg) \
-(scfg->interp_scope == MP_INTERP_SCOPE_REQUEST)
-
-#define modperl_interp_scope_connection(scfg) \
-(scfg->interp_scope == MP_INTERP_SCOPE_CONNECTION)
 
 #endif /* USE_ITHREADS */
 

Modified: perl/modperl/trunk/src/modules/perl/modperl_config.c
URL: http://svn.apache.org/viewvc/perl/modperl/trunk/src/modules/perl/modperl_config.c?rev=1682369&r1=1682368&r2=1682369&view=diff
==============================================================================
--- perl/modperl/trunk/src/modules/perl/modperl_config.c (original)
+++ perl/modperl/trunk/src/modules/perl/modperl_config.c Fri May 29 05:41:18 2015
@@ -24,11 +24,6 @@ void *modperl_config_dir_create(apr_pool
 
     MP_TRACE_d(MP_FUNC, "dir %s", dir);
 
-#ifdef USE_ITHREADS
-    /* defaults to per-server scope */
-    dcfg->interp_scope = MP_INTERP_SCOPE_UNDEF;
-#endif
-
     return dcfg;
 }
 
@@ -114,10 +109,6 @@ void *modperl_config_dir_merge(apr_pool_
                (unsigned long)basev, (unsigned long)addv,
                (unsigned long)mrg);
 
-#ifdef USE_ITHREADS
-    merge_item(interp_scope);
-#endif
-
     mrg->flags = modperl_options_merge(p, base->flags, add->flags);
 
     merge_item(location);
@@ -262,8 +253,6 @@ void *modperl_config_srv_create(apr_pool
         (modperl_tipool_config_t *)
         apr_pcalloc(p, sizeof(*scfg->interp_pool_cfg));
 
-    scfg->interp_scope = MP_INTERP_SCOPE_REQUEST;
-
     /* XXX: determine reasonable defaults */
     scfg->interp_pool_cfg->start = 3;
     scfg->interp_pool_cfg->max_spare = 3;
@@ -308,7 +297,6 @@ void *modperl_config_srv_merge(apr_pool_
 
 #ifdef USE_ITHREADS
     merge_item(interp_pool_cfg);
-    merge_item(interp_scope);
 #else
     merge_item(perl);
 #endif

Modified: perl/modperl/trunk/src/modules/perl/modperl_interp.c
URL: http://svn.apache.org/viewvc/perl/modperl/trunk/src/modules/perl/modperl_interp.c?rev=1682369&r1=1682368&r2=1682369&view=diff
==============================================================================
--- perl/modperl/trunk/src/modules/perl/modperl_interp.c (original)
+++ perl/modperl/trunk/src/modules/perl/modperl_interp.c Fri May 29 05:41:18 2015
@@ -23,15 +23,6 @@
 
 #ifdef USE_ITHREADS
 
-static const char *MP_interp_scope_desc[] = {
-    "undef", "handler", "subrequest", "request", "connection",
-};
-
-const char *modperl_interp_scope_desc(modperl_interp_scope_e scope)
-{
-    return MP_interp_scope_desc[scope];
-}
-
 void modperl_interp_clone_init(modperl_interp_t *interp)
 {
     dTHXa(interp->perl);
@@ -258,16 +249,6 @@ void modperl_interp_init(server_rec *s,
     scfg->mip = mip;
 }
 
-#ifdef MP_TRACE
-static apr_status_t modperl_interp_pool_cleanup(void *data)
-{
-    MP_TRACE_i(MP_FUNC, "unselecting: (0x%lx)->refcnt=%ld",
-               data, ((modperl_interp_t*)data)->refcnt);
-
-    return modperl_interp_unselect(data);
-}
-#endif
-
 apr_status_t modperl_interp_unselect(void *data)
 {
     modperl_interp_t *interp = (modperl_interp_t *)data;
@@ -413,7 +394,6 @@ modperl_interp_t *modperl_interp_select(
     const char *desc = NULL;
     modperl_interp_t *interp = NULL;
     apr_pool_t *p = NULL;
-    modperl_interp_scope_e scope;
 
     /* What does the following condition mean?
      * (r || c): if true we are at runtime. There is some kind of request
@@ -476,63 +456,6 @@ modperl_interp_t *modperl_interp_select(
                "pulled interp %pp (perl=%pp) from mip, num_requests is %d",
                interp, interp->perl, interp->num_requests);
 
-    /*
-     * if a per-dir PerlInterpScope is specified, use it.
-     * else if r != NULL use per-server PerlInterpScope
-     * else scope must be per-connection
-     */
-
-    scope = (dcfg && !modperl_interp_scope_undef(dcfg)) ?
-        dcfg->interp_scope :
-        (r ? scfg->interp_scope : MP_INTERP_SCOPE_CONNECTION);
-
-    MP_TRACE_i(MP_FUNC, "scope is per-%s",
-               modperl_interp_scope_desc(scope));
-
-    if (scope != MP_INTERP_SCOPE_HANDLER) {
-        desc = NULL;
-        if (c && (scope == MP_INTERP_SCOPE_CONNECTION || !r)) {
-            p = c->pool;
-            desc = "connection";
-        }
-        else if (r) {
-            request_rec *main_r = r->main;
-
-            if (main_r && (scope == MP_INTERP_SCOPE_REQUEST)) {
-                /* share 1 interpreter across sub-requests */
-                for(; main_r; main_r = main_r->main) {
-                    p = main_r->pool;
-                }
-                desc = "main request";
-            }
-            else {
-                p = r->pool;
-                desc = scope == MP_INTERP_SCOPE_REQUEST
-                       ? "main request"
-                       : "sub request";
-            }
-	}
-
-        MP_ASSERT(p);
-
-#ifdef MP_TRACE
-        apr_pool_cleanup_register(p, (void *)interp,
-                                  modperl_interp_pool_cleanup,
-                                  modperl_interp_pool_cleanup);
-#else
-        apr_pool_cleanup_register(p, (void *)interp,
-                                  modperl_interp_unselect,
-                                  modperl_interp_unselect);
-#endif
-
-        /* add a reference for the registered cleanup */
-        interp->refcnt++;
-
-        MP_TRACE_i(MP_FUNC,
-                   "registered unselect cleanup for interp 0x%lx in %s",
-                   (unsigned long)interp, desc);
-    }
-
     return interp;
 }
 

Modified: perl/modperl/trunk/src/modules/perl/modperl_interp.h
URL: http://svn.apache.org/viewvc/perl/modperl/trunk/src/modules/perl/modperl_interp.h?rev=1682369&r1=1682368&r2=1682369&view=diff
==============================================================================
--- perl/modperl/trunk/src/modules/perl/modperl_interp.h (original)
+++ perl/modperl/trunk/src/modules/perl/modperl_interp.h Fri May 29 05:41:18 2015
@@ -27,8 +27,6 @@ apr_status_t modperl_interp_cleanup(void
 modperl_interp_t *modperl_thx_interp_get(PerlInterpreter *thx);
 void modperl_thx_interp_set(PerlInterpreter *thx, modperl_interp_t *interp);
 
-const char *modperl_interp_scope_desc(modperl_interp_scope_e scope);
-
 void modperl_interp_clone_init(modperl_interp_t *interp);
 
 modperl_interp_t *modperl_interp_new(modperl_interp_pool_t *mip,

Modified: perl/modperl/trunk/src/modules/perl/modperl_types.h
URL: http://svn.apache.org/viewvc/perl/modperl/trunk/src/modules/perl/modperl_types.h?rev=1682369&r1=1682368&r2=1682369&view=diff
==============================================================================
--- perl/modperl/trunk/src/modules/perl/modperl_types.h (original)
+++ perl/modperl/trunk/src/modules/perl/modperl_types.h Fri May 29 05:41:18 2015
@@ -120,14 +120,6 @@ typedef struct {
     int unset;
 } modperl_options_t;
 
-typedef enum {
-    MP_INTERP_SCOPE_UNDEF,
-    MP_INTERP_SCOPE_HANDLER,
-    MP_INTERP_SCOPE_SUBREQUEST,
-    MP_INTERP_SCOPE_REQUEST,
-    MP_INTERP_SCOPE_CONNECTION
-} modperl_interp_scope_e;
-
 typedef struct {
     MpHV *setvars;
     MpHV *configvars;
@@ -142,7 +134,6 @@ typedef struct {
 #ifdef USE_ITHREADS
     modperl_interp_pool_t *mip;
     modperl_tipool_config_t *interp_pool_cfg;
-    modperl_interp_scope_e interp_scope;
 #else
     PerlInterpreter *perl;
 #endif
@@ -163,9 +154,6 @@ typedef struct {
     MpHV *setvars;
     MpHV *configvars;
     modperl_options_t *flags;
-#ifdef USE_ITHREADS
-    modperl_interp_scope_e interp_scope;
-#endif
 } modperl_config_dir_t;
 
 typedef struct {

Modified: perl/modperl/trunk/t/response/TestDirective/perlcleanuphandler.pm
URL: http://svn.apache.org/viewvc/perl/modperl/trunk/t/response/TestDirective/perlcleanuphandler.pm?rev=1682369&r1=1682368&r2=1682369&view=diff
==============================================================================
--- perl/modperl/trunk/t/response/TestDirective/perlcleanuphandler.pm (original)
+++ perl/modperl/trunk/t/response/TestDirective/perlcleanuphandler.pm Fri May 29 05:41:18 2015
@@ -44,7 +44,7 @@ __END__
         PerlInterpMax           1
         PerlInterpMinSpare      0
         PerlInterpMaxSpare      1
-        PerlInterpScope         connection
+        # PerlInterpScope         connection
     </IfDefine>
 
     KeepAlive On

Modified: perl/modperl/trunk/t/response/TestModperl/setupenv.pm
URL: http://svn.apache.org/viewvc/perl/modperl/trunk/t/response/TestModperl/setupenv.pm?rev=1682369&r1=1682368&r2=1682369&view=diff
==============================================================================
--- perl/modperl/trunk/t/response/TestModperl/setupenv.pm (original)
+++ perl/modperl/trunk/t/response/TestModperl/setupenv.pm Fri May 29 05:41:18 2015
@@ -182,9 +182,9 @@ __DATA__
 
     KeepAlive On
 
-    <IfDefine PERL_USEITHREADS>
-        PerlInterpScope connection
-    </Ifdefine>
+#    <IfDefine PERL_USEITHREADS>
+#        PerlInterpScope connection
+#    </Ifdefine>
 
     PerlModule TestModperl::setupenv
 

Modified: perl/modperl/trunk/t/response/TestPerl/ithreads3.pm
URL: http://svn.apache.org/viewvc/perl/modperl/trunk/t/response/TestPerl/ithreads3.pm?rev=1682369&r1=1682368&r2=1682369&view=diff
==============================================================================
--- perl/modperl/trunk/t/response/TestPerl/ithreads3.pm (original)
+++ perl/modperl/trunk/t/response/TestPerl/ithreads3.pm Fri May 29 05:41:18 2015
@@ -86,7 +86,7 @@ __END__
         PerlInterpMax           3
         PerlInterpMinSpare      1
         PerlInterpMaxSpare      3
-        PerlInterpScope         handler
+        # PerlInterpScope         handler
     </IfDefine>
 
     # use test system's @INC