Hello community,
here is the log from the commit of package apache2-mod_mono
checked in at Wed Mar 26 00:58:09 CET 2008.
--------
--- apache2-mod_mono/apache2-mod_mono.changes 2008-01-15 06:05:43.000000000 +0100
+++ /mounts/work_src_done/STABLE/apache2-mod_mono/apache2-mod_mono.changes 2008-03-25 22:34:52.000000000 +0100
@@ -1,0 +2,7 @@
+Tue Mar 25 15:16:28 MST 2008 - wberrier@suse.de
+
+- Update to 1.9
+ -New support for controlling the number of requests that are
+ passed to the mod-mono-server process
+
+-------------------------------------------------------------------
Old:
----
mod_mono-1.2.6.tar.bz2
New:
----
mod_mono-1.9.tar.bz2
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ apache2-mod_mono.spec ++++++
--- /var/tmp/diff_new_pack.x27348/_old 2008-03-26 00:57:50.000000000 +0100
+++ /var/tmp/diff_new_pack.x27348/_new 2008-03-26 00:57:50.000000000 +0100
@@ -1,5 +1,5 @@
#
-# spec file for package apache2-mod_mono (Version 1.2.6)
+# spec file for package apache2-mod_mono (Version 1.9)
#
# Copyright (c) 2008 SUSE LINUX Products GmbH, Nuernberg, Germany.
# This file and all modifications and additions to the pristine
@@ -10,7 +10,9 @@
# norootforbuild
+
Name: apache2-mod_mono
+Obsoletes: mod_mono
%define modname mod_mono
%define apxs /usr/sbin/apxs2
%define apache2_sysconfdir %(%{apxs} -q SYSCONFDIR)
@@ -20,13 +22,12 @@
License: The Apache Software License
Group: Productivity/Networking/Web/Servers
AutoReqProv: on
-Version: 1.2.6
+Version: 1.9
Release: 1
Summary: Run ASP.NET Pages on Unix with Apache and Mono
Source: %{modname}-%{version}.tar.bz2
BuildRoot: %{_tmppath}/%{name}-%{version}-build
Provides: mod_mono = %{version}-%{release}
-Obsoletes: mod_mono < %{version}
# This must be manually entered according to xsp's protocol version
Requires: xsp >= %{version}
############### Suse based options
@@ -73,50 +74,54 @@
%{_mandir}/man8/mod_mono.8*
%changelog
-* Mon Jan 14 2008 - wberrier@suse.de
+* Tue Mar 25 2008 wberrier@suse.de
+- Update to 1.9
+ -New support for controlling the number of requests that are
+ passed to the mod-mono-server process
+* Mon Jan 14 2008 wberrier@suse.de
- Update to 1.2.6
-New directives for controlling the life span of mod-mono-server
-Startup of mod_mono backends synchronized across all the child
apache processes (via a shared memory dashboard).
-* Fri Aug 31 2007 - wberrier@suse.de
+* Thu Aug 30 2007 wberrier@suse.de
- mod_mono_1.2.5_p5_final.patch: fix regression: avoid sem leak
-* Fri Aug 17 2007 - wberrier@suse.de
+* Fri Aug 17 2007 wberrier@suse.de
- put mod_mono.conf in /etc/apache2/conf.d instead of /etc/apache2
- mod_mono_1.2.5_p4.patch.bz2: Bugfixes found in 1.2.5
-stabilization and performance fixes that accompany the bugs
found in xsp 1.2.5
-* Fri Aug 03 2007 - wberrier@suse.de
+* Fri Aug 03 2007 wberrier@suse.de
- Update to 1.2.5
-Error logging
-support for ServerAlias directive
-* Tue Jun 05 2007 - wberrier@novell.com
+* Tue Jun 05 2007 wberrier@novell.com
- Update to 1.2.4
-Connection cancellation fixes
-better detection of apu at buildtime
-* Wed Apr 04 2007 - wberrier@novell.com
+* Tue Apr 03 2007 wberrier@novell.com
- Get building in build service for suse and fedora
-mod_mono-check_headers_apuconfig.patch: patch to enable
autodetection of apr-util headers on suse 10.1
-* Tue Jan 23 2007 - ro@suse.de
+* Mon Jan 22 2007 ro@suse.de
- drop requires for gnome-filesystem
-* Sat Dec 02 2006 - wberrier@suse.de
+* Sat Dec 02 2006 wberrier@suse.de
- Update to 1.2.1 (Fate #301111)
-handle the new configurable umask directive
-* Mon Nov 13 2006 - poeml@suse.de
+* Mon Nov 13 2006 poeml@suse.de
- add Provides: mod_mono = %%{version}-%%{release}
-* Mon Nov 13 2006 - poeml@suse.de
+* Mon Nov 13 2006 poeml@suse.de
- fix build with versions < 10.1 of the distro where libapr-util1
did not yet exist as a package (libapr* was in apache2-devel)
-* Mon Nov 13 2006 - poeml@suse.de
+* Mon Nov 13 2006 poeml@suse.de
- rename to apache2-mod_mono
-* Sat Oct 21 2006 - wberrier@suse.de
+* Fri Oct 20 2006 wberrier@suse.de
- Update 1.1.18
-fix for autohosting and virtual hosts
-* Wed Aug 30 2006 - wberrier@suse.de
+* Wed Aug 30 2006 wberrier@suse.de
- Update to 1.1.17
- Remove upstream patches
- Added support for X.509 client certificates
-* Tue Aug 01 2006 - wberrier@suse.de
+* Mon Jul 31 2006 wberrier@suse.de
- Added some patches to build against apache 2.2.2
- Removed xsp from build deps
- Update to 1.1.16.1
@@ -127,26 +132,26 @@
- src/mod_mono.c: allow setting MonoDebug when using automatic
applications. Before this fix, no mod-mono-server would be started.
Fixes bug #78672.
-* Fri Apr 07 2006 - wberrier@novell.com
+* Fri Apr 07 2006 wberrier@novell.com
- Update to 1.1.13.5, minor bug fix release
-Fix DoS (Critical fix for iFolder)
-* Wed Jan 25 2006 - mls@suse.de
+* Wed Jan 25 2006 mls@suse.de
- converted neededforbuild to BuildRequires
-* Sat Jan 07 2006 - wberrier@suse.de
+* Sat Jan 07 2006 wberrier@suse.de
- Get building with apache 2.2
- use apr 1.1.x instead of apr provided with httpd
- needed CPPFLAGS to find apr dev files
- autoreconf fixes configure in order to find apache/apr headers
- Cleaned up deps (no gtk/x/gnome needed)
-* Sat Nov 12 2005 - wberrier@suse.de
+* Fri Nov 11 2005 wberrier@suse.de
- 1.1.10 tarball was updated
-* Fri Nov 11 2005 - wberrier@suse.de
+* Thu Nov 10 2005 wberrier@suse.de
- Update to 1.1.10, remove icu deps
-* Fri Oct 07 2005 - wberrier@suse.de
+* Fri Oct 07 2005 wberrier@suse.de
- Updated to 1.1.9.2
-* Tue Aug 09 2005 - gekker@suse.de
+* Tue Aug 09 2005 gekker@suse.de
- Update to version 1.0.9
-* Mon Feb 21 2005 - clahey@suse.de
+* Mon Feb 21 2005 clahey@suse.de
- Update to 1.0.6.
-* Tue Dec 14 2004 - clahey@suse.de
+* Tue Dec 14 2004 clahey@suse.de
- New package.
++++++ mod_mono-1.2.6.tar.bz2 -> mod_mono-1.9.tar.bz2 ++++++
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/mod_mono-1.2.6/ChangeLog new/mod_mono-1.9/ChangeLog
--- old/mod_mono-1.2.6/ChangeLog 2007-11-09 00:18:37.000000000 +0100
+++ new/mod_mono-1.9/ChangeLog 2008-01-29 23:54:57.000000000 +0100
@@ -1,3 +1,35 @@
+2008-01-28 Wade Berrier
+
+ * configure.in: Version bump -> 1.9
+
+2008-01-21 Joshua Tauberer
+
+ * src/mod_mono.c: Implemented configurable rate limiting
+ with MonoMaxActiveRequests and MonoMaxWaitingRequests.
+
+2008-01-20 Joshua Tauberer
+
+ * src/mod_mono.c:
+ ensure_dashboard_initialized:
+ - Try to delete an existing lockfile before creating a mutex
+ (relevant if the lock type uses files).
+ - Don't always try to remove the shm file (as root). This
+ means we could never attach to an existing shm. The file
+ ought to always be created as the apache user anyway.
+ Instead, only delete after a failed attach.
+ - Don't always call apr_shm_baseaddr_get in every call to this.
+ - Code cleanup and fixes (a return should have been a goto).
+ mono_execute_request:
+ - Check that dashboard was actually created before accessing it.
+ start_xsp:
+ - Don't use the xsp->status flag in Apache 2+ since this is
+ handled by the new cross-process locking mechanism.
+ terminate_xsp2:
+ - No need to check if xsp->dashboard_shm was changed while
+ waiting for a lock: that's impossible. (It's not multi-threaded.)
+ - Don't call apr_shm_detach before apr_shm_destroy. That's not
+ the right use of the API.
+
2007-11-08 Wade Berrier
* configure.in: Version bump -> 1.2.6
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/mod_mono-1.2.6/configure new/mod_mono-1.9/configure
--- old/mod_mono-1.2.6/configure 2007-11-09 00:18:43.000000000 +0100
+++ new/mod_mono-1.9/configure 2008-01-29 23:55:03.000000000 +0100
@@ -2287,7 +2287,7 @@
# Define the identity of the package.
PACKAGE=mod_mono
- VERSION=1.2.6
+ VERSION=1.9
cat >>confdefs.h <<_ACEOF
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/mod_mono-1.2.6/configure.in new/mod_mono-1.9/configure.in
--- old/mod_mono-1.2.6/configure.in 2007-11-09 00:18:37.000000000 +0100
+++ new/mod_mono-1.9/configure.in 2008-01-29 23:54:57.000000000 +0100
@@ -1,5 +1,5 @@
AC_INIT(src/mod_mono.c)
-AM_INIT_AUTOMAKE(mod_mono, 1.2.6)
+AM_INIT_AUTOMAKE(mod_mono, 1.9)
AM_CONFIG_HEADER(include/mod_mono_config.h:config.in)
AC_PROG_CC
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/mod_mono-1.2.6/man/mod_mono.8.in new/mod_mono-1.9/man/mod_mono.8.in
--- old/mod_mono-1.2.6/man/mod_mono.8.in 2007-11-09 00:18:37.000000000 +0100
+++ new/mod_mono-1.9/man/mod_mono.8.in 2008-01-29 23:54:57.000000000 +0100
@@ -155,6 +155,17 @@
.I "MonoSetEnv"
Takes a string of 'name=value' pairs separated by semicolons. For each
pair, it calls setenv (name, value) before running mod-mono-server.
+.TP
+.I "MonoMaxActiveRequests"
+The maximum number of concurrent requests mod_mono will pass off to
+the ASP.NET backend. Set to zero to turn off the limit. Default value:
+20.
+.TP
+.I "MonoMaxWaitingRequests"
+The maximum number of concurrent requests mod_mono will hold while
+the ASP.NET backend is busy with the maximum number of requests
+specified by MonoMaxActiveRequests. Requests that can't be processed
+or held are dropped with Service Unavailable. Default value: 20.
.SH SAMPLE CONFIGURATION
This one using <Directory>:
.nf
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/mod_mono-1.2.6/src/mod_mono.c new/mod_mono-1.9/src/mod_mono.c
--- old/mod_mono-1.2.6/src/mod_mono.c 2007-11-09 00:18:37.000000000 +0100
+++ new/mod_mono-1.9/src/mod_mono.c 2008-01-29 23:54:57.000000000 +0100
@@ -63,6 +63,8 @@
uint32_t handled_requests;
time_t start_time;
char restart_issued;
+ int active_requests;
+ int waiting_requests;
} dashboard_data;
typedef struct xsp_data {
@@ -90,7 +92,9 @@
char is_virtual; /* is the server virtual? */
char *start_attempts;
char *start_wait_time;
-
+ char *max_active_requests;
+ char *max_waiting_requests;
+
/* auto-restart stuff */
auto_restart_mode restart_mode;
uint32_t restart_requests;
@@ -367,16 +371,6 @@
}
#endif
- if (!xsp->dashboard_shm) {
- DEBUG_PRINT (1, "removing dashboard file '%s' as root", xsp->dashboard_file);
- if (unlink (xsp->dashboard_file) == -1 && errno != ENOENT) {
- ap_log_error (APLOG_MARK, APLOG_CRIT, STATUS_AND_SERVER,
- "Failed to remove dashboard file '%s', further actions impossible. %s",
- xsp->dashboard_file, strerror (errno));
- return;
- }
- }
-
#if defined (APR_HAS_USER)
if (apr_uid_current (&cur_uid, &cur_gid, p) == APR_SUCCESS && cur_uid == 0) {
DEBUG_PRINT (2, "Temporarily switching to target uid/gid");
@@ -395,6 +389,12 @@
if (!xsp->dashboard_mutex) {
DEBUG_PRINT (1, "creating dashboard mutex = %s", xsp->dashboard_lock_file);
+
+ if (unlink (xsp->dashboard_lock_file) == -1 && errno != ENOENT) {
+ ap_log_error (APLOG_MARK, APLOG_CRIT, STATUS_AND_SERVER,
+ "Failed to remove dashboard mutex file '%s'; will attempt to continue. %s",
+ xsp->dashboard_lock_file, strerror (errno));
+ }
rv = apr_global_mutex_create (&xsp->dashboard_mutex, xsp->dashboard_lock_file,
get_apr_locking_mechanism (), p);
if (rv != APR_SUCCESS) {
@@ -417,7 +417,17 @@
if (!xsp->dashboard_shm) {
rv = apr_shm_attach (&xsp->dashboard_shm, xsp->dashboard_file, p);
- if (rv != APR_SUCCESS) {
+ if (rv == APR_SUCCESS) {
+ xsp->dashboard = apr_shm_baseaddr_get (xsp->dashboard_shm);
+ } else {
+ DEBUG_PRINT (1, "removing dashboard file '%s'", xsp->dashboard_file);
+ if (unlink (xsp->dashboard_file) == -1 && errno != ENOENT) {
+ ap_log_error (APLOG_MARK, APLOG_CRIT, STATCODE_AND_SERVER (rv),
+ "Failed to attach to existing dashboard, and removing dashboard file '%s' failed (%s). Further action impossible.",
+ xsp->dashboard_file, strerror (errno));
+ goto restore_creds;
+ }
+
DEBUG_PRINT (1, "creating dashboard '%s'", xsp->dashboard_file);
old_umask = umask (0077);
@@ -425,29 +435,27 @@
umask (old_umask);
if (rv != APR_SUCCESS) {
ap_log_error (APLOG_MARK, APLOG_CRIT, STATCODE_AND_SERVER (rv),
- "Failed to create shared memory segment for backend '%s'",
- xsp->alias);
- goto restore_creds;
+ "Failed to create shared memory segment for backend '%s' at '%s'.",
+ xsp->alias, xsp->dashboard_file);
} else {
rv = apr_shm_attach (&xsp->dashboard_shm, xsp->dashboard_file, p);
if (rv != APR_SUCCESS) {
ap_log_error (APLOG_MARK, APLOG_CRIT, STATCODE_AND_SERVER (rv),
"Failed to attach to the dashboard '%s'",
xsp->dashboard_file);
- return;
+ goto restore_creds;
}
xsp->dashboard = apr_shm_baseaddr_get (xsp->dashboard_shm);
xsp->dashboard->start_time = time (NULL);
xsp->dashboard->handled_requests = 0;
xsp->dashboard->restart_issued = 0;
- goto restore_creds;
+ xsp->dashboard->active_requests = 0;
+ xsp->dashboard->waiting_requests = 0;
}
}
}
- xsp->dashboard = apr_shm_baseaddr_get (xsp->dashboard_shm);
-
restore_creds:
#if defined (APR_HAS_USER) && !defined (WIN32)
if (switch_back_to_root) {
@@ -508,6 +516,8 @@
server->start_attempts = "3";
server->start_wait_time = "2";
server->no_flush = 1;
+ server->max_active_requests = "20";
+ server->max_waiting_requests = "20";
#ifndef APACHE13
apr_snprintf (num, sizeof (num), "%u", (unsigned)config->nservers + 1);
@@ -1893,6 +1903,118 @@
}
static int
+increment_active_requests (xsp_data *conf)
+{
+ apr_status_t rv;
+
+ int max_active_requests = atoi(conf->max_active_requests);
+ int max_waiting_requests = atoi(conf->max_waiting_requests);
+
+ /* Limit the number of concurrent requests. If no
+ * limiting is in effect (or can't be done because
+ * there is no dashboard), return the OK status.
+ * Same test as in the decrement function. */
+ if (max_active_requests == 0 || !conf->dashboard_mutex || !conf->dashboard)
+ return 1;
+
+ rv = apr_global_mutex_lock (conf->dashboard_mutex);
+ /* Drop the request on failure to lock the dashboard because
+ * we don't want to decrement the counter later since we couldn't
+ * increment it here. */
+ if (rv != APR_SUCCESS)
+ return 0;
+
+ // From here on, rv holds onto whether we still have
+ // the lock acquired, just in case some error ocurrs
+ // acquiring it during the loop.
+ if (conf->dashboard->active_requests >= max_active_requests) {
+ /* We need to wait until the active requests
+ * go below the maximum. */
+
+ /* However, we won't keep more than max_waiting_req requests
+ * waiting, which means the max number of active Apache
+ * connections associated with this mod-mono-server
+ * is max_active_req+max_waiting_req.
+ */
+ if (conf->dashboard->waiting_requests >= max_waiting_requests) {
+ apr_global_mutex_unlock (conf->dashboard_mutex);
+ ap_log_error (APLOG_MARK, APLOG_ERR, STATUS_AND_SERVER,
+ "Maximum number of concurrent mod_mono requests to %s reached (%d active, %d waiting). Request dropped.",
+ conf->dashboard_lock_file, max_active_requests, max_waiting_requests);
+ return 0;
+ }
+
+ ap_log_error (APLOG_MARK, APLOG_INFO, STATUS_AND_SERVER,
+ "Maximum number of concurrent mod_mono requests to %s reached (%d). Will wait and retry.",
+ conf->dashboard_lock_file, max_active_requests);
+
+ conf->dashboard->waiting_requests++;
+
+ int retries = 20;
+ while (retries-- > 0) {
+ // Release the lock, wait some time, and then re-acquire.
+ apr_global_mutex_unlock (conf->dashboard_mutex);
+ apr_sleep (500000); // 0.5 seconds
+ rv = apr_global_mutex_lock (conf->dashboard_mutex);
+ if (rv != APR_SUCCESS) break;
+
+ // If the number of requests is low enough, we
+ // can stop waiting.
+ if (conf->dashboard->active_requests < max_active_requests)
+ break;
+ }
+
+ // Hopefully we haven't lost the lock, but if we have we still
+ // want to at least attempt to decrement the counter.
+ conf->dashboard->waiting_requests--;
+
+ // If we got to the end of the loop and still too
+ // many requests are going, stop processing the
+ // request.
+ if (rv == APR_SUCCESS && conf->dashboard->active_requests >= max_active_requests) {
+ apr_global_mutex_unlock (conf->dashboard_mutex);
+ ap_log_error (APLOG_MARK, APLOG_ERR, STATUS_AND_SERVER,
+ "Maximum number (%d) of concurrent mod_mono requests to %s reached. Droping request.",
+ max_active_requests, conf->dashboard_lock_file);
+ return 0;
+ }
+ }
+
+ /* If we lost the lock during the loop, drop the request
+ * because we don't want to decrement the counter later
+ * since we couldn't increment it here. */
+ if (rv != APR_SUCCESS)
+ return 0;
+
+ conf->dashboard->active_requests++;
+ apr_global_mutex_unlock (conf->dashboard_mutex);
+
+ return 1;
+}
+
+static void
+decrement_active_requests (xsp_data *conf)
+{
+ apr_status_t rv;
+
+ int max_active_requests = atoi(conf->max_active_requests);
+
+ /* Check if limiting is in effect. Same test as in the
+ * increment function. */
+ if (max_active_requests == 0 || !conf->dashboard_mutex || !conf->dashboard)
+ return;
+
+ rv = apr_global_mutex_lock (conf->dashboard_mutex);
+ // Since we incremented the counter, even if we can't
+ // get a lock, we had better attempt to decrement it.
+
+ conf->dashboard->active_requests--;
+
+ if (rv == APR_SUCCESS)
+ apr_global_mutex_unlock (conf->dashboard_mutex);
+}
+
+static int
mono_execute_request (request_rec *r, char auto_app)
{
apr_socket_t *sock;
@@ -1979,13 +2101,18 @@
#endif
rv = -1; /* avoid a warning about uninitialized value */
+ if (!increment_active_requests (conf))
+ return HTTP_SERVICE_UNAVAILABLE;
+
while (connect_attempts--) {
rv = setup_socket (&sock, conf, r->pool);
DEBUG_PRINT (2, "After setup_socket");
// Note that rv's value after the loop ends is important.
if (rv != APR_SUCCESS) {
- if (rv != -1)
+ if (rv != -1) {
+ decrement_active_requests (conf);
return HTTP_SERVICE_UNAVAILABLE;
+ }
DEBUG_PRINT (2, "No backend found, will start a new copy.");
#ifndef APACHE13
@@ -1999,6 +2126,7 @@
ap_log_error (APLOG_MARK, APLOG_CRIT, STATCODE_AND_SERVER (rv2),
"Failed to acquire %s lock, cannot continue starting new process",
conf->dashboard_lock_file);
+ decrement_active_requests (conf);
return HTTP_SERVICE_UNAVAILABLE;
}
#endif
@@ -2029,6 +2157,7 @@
/* Failed to connect to mod-mono-server after several attempts. */
ap_log_error (APLOG_MARK, APLOG_ERR, STATUS_AND_SERVER,
"Failed to connect to mod-mono-server after several attempts to spawn the process.");
+ decrement_active_requests (conf);
return HTTP_SERVICE_UNAVAILABLE;
}
@@ -2037,6 +2166,7 @@
ap_log_error (APLOG_MARK, APLOG_ALERT, STATUS_AND_SERVER,
"Failed to send initial data. %s", strerror (errno));
apr_socket_close (sock);
+ decrement_active_requests (conf);
return HTTP_SERVICE_UNAVAILABLE;
}
@@ -2055,6 +2185,8 @@
"Command stream corrupted, last command was %d", command);
status = HTTP_INTERNAL_SERVER_ERROR;
}
+
+ decrement_active_requests (conf);
#ifndef APACHE13
if (conf->restart_mode > AUTORESTART_MODE_NONE) {
@@ -2063,7 +2195,7 @@
DEBUG_PRINT (2, "Auto-restart enabled for '%s', checking if restart required", conf->alias);
ensure_dashboard_initialized (config, conf, pconf);
- if (!conf->dashboard_mutex)
+ if (!conf->dashboard_mutex || !conf->dashboard)
return status;
rv = apr_global_mutex_lock (conf->dashboard_mutex);
@@ -2223,8 +2355,10 @@
if (xsp->run_xsp && !strcasecmp (xsp->run_xsp, "false"))
continue;
+#ifdef APACHE13
if (xsp->status != FORK_NONE)
continue;
+#endif
/* If alias isn't null, skip XSPs that don't have that alias. */
if (alias != NULL && strcmp (xsp->alias, alias))
@@ -2327,20 +2461,14 @@
release_lock = 1;
}
- if (xsp->dashboard_shm) { // it might've been released while we had been waiting
- // for the lock
- rv = apr_shm_detach (xsp->dashboard_shm);
- if (rv != APR_SUCCESS)
- ap_log_error (APLOG_MARK, APLOG_WARNING, STATCODE_AND_SERVER (rv),
- "Failed to detach from the '%s' shared memory dashboard",
- xsp->dashboard_file);
-
- rv = apr_shm_destroy (xsp->dashboard_shm);
- if (rv != APR_SUCCESS)
- ap_log_error (APLOG_MARK, APLOG_WARNING, STATCODE_AND_SERVER (rv),
- "Failed to destroy the '%s' shared memory dashboard",
- xsp->dashboard_file);
- }
+ // No need to detach before destroying, and in that case we must not.
+ // But should we detach instead of destroy if we weren't the creating
+ // process?
+ rv = apr_shm_destroy (xsp->dashboard_shm);
+ if (rv != APR_SUCCESS)
+ ap_log_error (APLOG_MARK, APLOG_WARNING, STATCODE_AND_SERVER (rv),
+ "Failed to destroy the '%s' shared memory dashboard",
+ xsp->dashboard_file);
if (release_lock) {
rv = apr_global_mutex_unlock (xsp->dashboard_mutex);
@@ -2717,6 +2845,15 @@
MAKE_CMD12 (MonoAutoRestartTime, restart_time,
"Time after which the backend should be auto-restarted. The time format is: "
"DD[:HH[:MM[:SS]]]. Default value: 00:12:00:00"),
+
+ MAKE_CMD12 (MonoMaxActiveRequests, max_active_requests,
+ "The maximum number of concurrent requests mod_mono will pass off to the ASP.NET backend. "
+ "Set to zero to turn off the limit. Default value: 20"),
+ MAKE_CMD12 (MonoMaxWaitingRequests, max_waiting_requests,
+ "The maximum number of concurrent requests mod_mono will hold while the ASP.NET backend is busy "
+ "with the maximum number of requests specified by MonoMaxActiveRequests. "
+ "Requests that can't be processed or held are dropped with Service Unavailable."
+ "Default value: 20"),
{ NULL }
};
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Remember to have fun...
---------------------------------------------------------------------
To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org
For additional commands, e-mail: opensuse-commit+help@opensuse.org