Apache::Reload question...

2002-05-03 Thread Rob Mueller (fastmail)



I've got a "reality check" question for 
people to see that I'm not missing something obvious with our Apache::Reload 
mod_perl setup.

We've recently install Apache::Reload at 
our site in production and it's working great. In what isprobably not the 
best 'software engineering' style, we've been known to upload several small 
patches in a single day and used to have to do short restarts to integrate the 
new code. We now use Apache::Reload instead. Rather than putting 'use Apache::Reload' 
in each of our modules, I've created a touch file, which after looking through 
the Apache::Reload code, I noted that you could put a list of modules into it 
which would be reloaded.

On top of this, weuse 
mod_accelas a front end to our mod_perl backend.This combination 
seems to work great as well for anyone curious.

The question I had regards where to put the 
'Apache::Reload' directive. The documentation suggests something 
like:

 PerlInitHandler 
Apache::Reload PerlSetVar ReloadAll Off
 PerlSetVar ReloadTouchFile 
/tmp/reload_modules

The problem I see in a production machine 
is that each child process will see this on the next request, and attempt to 
reload it's modules. At that point, you'll loose the shared memory the modules 
use between child processes.

On top of this, the parent process will 
never get this, so it will never reload modules in the parent.The next 
time a new child is forked, on the first request it receives it will again 
attempt to reload the changed modules. Is this correct? Or am I missing 
something?

The alternative I've used is 
this:

 PerlRestartHandler 
Apache::Reload PerlSetVar ReloadAll Off PerlSetVar 
ReloadTouchFile /tmp/reload_modules

Then when I've uploaded any changes, I 
touch the change file, and do an 'apachectl graceful' to restart the backend. I 
think this works nicely because:

1)The mod_accel front end will buffer 
any long file uploads, and any long file downloads. So the actual length of 
connections from the frontend to the backend is only as long as it takes to 
process the request and tunnel the data betwen the front-back or 
back-front. Thus the 'graceful' restart only ever takes a few seconds, and 
no connections are ever lost, only blocked for a few seconds at the most (the 
length of the longest request to process).
2) Doing it in the restart handler means 
that the parent process reloads the modules, and all the newly forked children 
have shared copies.

Can anyone tell me if I'm missing something 
here?

Rob



Re: Apache::Reload question...

2002-05-03 Thread Geoffrey Young


 The question I had regards where to put the 'Apache::Reload' directive. 
 The documentation suggests something like:
 
  
 
   PerlInitHandler Apache::Reload
   PerlSetVar ReloadAll Off
 
   PerlSetVar ReloadTouchFile /tmp/reload_modules
 
  
 
 The problem I see in a production machine is that each child process 
 will see this on the next request, and attempt to reload it's modules. 
 At that point, you'll loose the shared memory the modules use between 
 child processes.


that sounds right to me


 
  
 
 On top of this, the parent process will never get this, so it will never 
 reload modules in the parent. The next time a new child is forked, on 
 the first request it receives it will again attempt to reload the 
 changed modules. Is this correct? Or am I missing something?


I'm not sure about that.


 
  
 
 The alternative I've used is this:
 
  
 
   PerlRestartHandler Apache::Reload
   PerlSetVar ReloadAll Off
   PerlSetVar ReloadTouchFile /tmp/reload_modules
 
  
 
 Then when I've uploaded any changes, I touch the change file, and do an 
 'apachectl graceful' to restart the backend. I think this works nicely 
 because:


[snip]


 
 2) Doing it in the restart handler means that the parent process reloads 
 the modules, and all the newly forked children have shared copies.
 
  
 
 Can anyone tell me if I'm missing something here?
 

that sounds right to me.  I've not tested it with Apache::Reload specifically, but I 
did 
test using Apache::RegistryLoader with a PerlRestartHandler to reload Registry scripts 
in 
the parent process on restart and it seemed to work as we both suspected (recipe 17.4 
bears the fruit of this labor :)  I suspect that it is the same with Apache::Reload 
unless 
there is something specific to the reloading logic that prevents it.

--Geoff




Apache::Reload question

2002-01-10 Thread Matthew Pressly

Can Apache::Reload be used to reload modules that are use-d by httpd PerlModule, 
PerlRequire, or PerlHandler directives, or do they have to be explicitly use-d in 
code that is inside a handler? I think the answer is yes - these are no different 
than anything else except that memory sharing is lost because reload occurs in the 
children but wanted to check before I go down that path.

Matthew Pressly




One more small Apache::Reload question

2001-08-01 Thread Bryan Coon

First, thanks to all the great suggestions, it looks like it works fine.

However, now my logs are loaded with  a ton of subroutine redefined warnings
(which is normal I suppose?).  I can certainly live with this in a
development environment, but thought I would check to see if it is expected,
and if it can be turned off while still enabling Reload.

Thanks!
Bryan



RE: One more small Apache::Reload question

2001-08-01 Thread Kyle Oppenheim

Those warnings are normal, and you can use the warnings pragma to turn them
off.  (Although, I believe the warnings pragma only exists in Perl 5.6.0+).

use warnings;
no warnings qw(redefine);

- Kyle

-Original Message-
From: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED]]On Behalf Of
Bryan Coon
Sent: Wednesday, August 01, 2001 9:36 AM
To: '[EMAIL PROTECTED]'
Subject: One more small Apache::Reload question


First, thanks to all the great suggestions, it looks like it works fine.

However, now my logs are loaded with  a ton of subroutine redefined warnings
(which is normal I suppose?).  I can certainly live with this in a
development environment, but thought I would check to see if it is expected,
and if it can be turned off while still enabling Reload.

Thanks!
Bryan




RE: One more small Apache::Reload question

2001-08-01 Thread Rob Bloodgood

 However, now my logs are loaded with  a ton of subroutine redefined
warnings
 (which is normal I suppose?).  I can certainly live with this in a
 development environment, but thought I would check to see if it is
expected,
 and if it can be turned off while still enabling Reload.

Well, first of all, you will want to turn off Apache::Reload during
production.  All of those stat()'s will slow down your server speed
significantly, as the disk is kept busy for each request.

Secondly, how is it you view your logs?  I have a window running tail -f
with a grep filter:

tail -f /var/log/httpd/error_log | egrep -v
'redefined.at|Apache::Reload|AuthenCache'

This way, I get the best of both worlds, by ignoring the noise:

# use constant SIGNATURE = 'TSTAT';
Constant subroutine SIGNATURE redefined at
/usr/lib/perl5/5.00503/constant.pm line 175.

# One of my module's subroutines.. there are 15 of these
Subroutine test_handler redefined at /etc/httpd/lib/perl/Stat/Count.pm line
315

I have AuthenCache in my filter because at LogLevel debug,
Apache::AuthenCache is *noisy*!!

HTH!

L8r,
Rob

#!/usr/bin/perl -w
use Disclaimer qw/:standard/;