@@ -152,7 +152,7 @@ static int s_ppid;
152
152
static int s_restored_ppid = 0 ;
153
153
static int s_pid = 0 ;
154
154
static int s_slow_req_msecs = 0 ;
155
- static int s_keepListener = 0 ;
155
+ static int s_keep_listener = 1 ;
156
156
static int s_dump_debug_info = 0 ;
157
157
static int s_pid_dump_debug_info = 0 ;
158
158
static int s_req_processed = 0 ;
@@ -244,8 +244,8 @@ void LSAPI_Log(int flag, const char * fmt, ...)
244
244
{
245
245
char buf [1024 ];
246
246
char * p = buf ;
247
- if ((flag & LSAPI_LOG_TIMESTAMP_BITS ) &&
248
- !(( flag & LSAPI_LOG_TIMESTAMP_STDERR ) && s_stderr_is_pipe ))
247
+ if ((flag & LSAPI_LOG_TIMESTAMP_BITS )
248
+ && !( s_stderr_is_pipe ))
249
249
{
250
250
struct timeval tv ;
251
251
struct tm tm ;
@@ -272,7 +272,7 @@ void LSAPI_Log(int flag, const char * fmt, ...)
272
272
273
273
if (flag & LSAPI_LOG_PID )
274
274
{
275
- p += snprintf (p , 100 , "[%d] " , s_pid );
275
+ p += snprintf (p , 100 , "[UID: %d][%d] " , getuid () , s_pid );
276
276
}
277
277
278
278
if (p > buf )
@@ -294,7 +294,13 @@ void LSAPI_Log(int flag, const char * fmt, ...)
294
294
295
295
#endif
296
296
297
- #define lsapi_log (...) LSAPI_Log(LSAPI_LOG_TIMESTAMP_FULL|LSAPI_LOG_TIMESTAMP_STDERR|LSAPI_LOG_PID, __VA_ARGS__)
297
+ #define lsapi_log (...) LSAPI_Log(LSAPI_LOG_TIMESTAMP_FULL|LSAPI_LOG_PID, __VA_ARGS__)
298
+
299
+
300
+ void lsapi_perror (const char * pMessage , int err_no )
301
+ {
302
+ lsapi_log ("%s, errno: %d (%s)\n" , pMessage , err_no , strerror (err_no ));
303
+ }
298
304
299
305
300
306
static int lsapi_parent_dead ()
@@ -893,7 +899,8 @@ int LSAPI_is_suEXEC_Daemon(void)
893
899
static int LSAPI_perror_r ( LSAPI_Request * pReq , const char * pErr1 , const char * pErr2 )
894
900
{
895
901
char achError [4096 ];
896
- int n = snprintf (achError , sizeof (achError ), "[%d] %s:%s: %s\n" , getpid (),
902
+ int n = snprintf (achError , sizeof (achError ), "[UID:%d][%d] %s:%s: %s\n" ,
903
+ getuid (), getpid (),
897
904
pErr1 , (pErr2 )?pErr2 :"" , strerror (errno ));
898
905
if (n > (int )sizeof (achError ))
899
906
n = sizeof (achError );
@@ -939,7 +946,7 @@ static int lsapi_enterLVE( LSAPI_Request * pReq, uid_t uid )
939
946
ret = (* fp_lve_enter )(s_lve , uid , -1 , -1 , & cookie );
940
947
if ( ret < 0 )
941
948
{
942
- lsapi_log ("enter LVE (%d) : ressult: %d !\n" , uid , ret );
949
+ // lsapi_log("enter LVE (%d) : ressult: %d !\n", uid, ret );
943
950
LSAPI_perror_r (pReq , "LSAPI: lve_enter() failure, reached resource limit." , NULL );
944
951
lsapi_lve_error ( pReq );
945
952
return -1 ;
@@ -2938,14 +2945,14 @@ static void lsapi_sigchild( int signal )
2938
2945
2939
2946
static int lsapi_init_children_status (void )
2940
2947
{
2948
+ char * pBuf ;
2941
2949
int size = 4096 ;
2942
2950
int max_children ;
2943
2951
if (g_prefork_server -> m_pChildrenStatus )
2944
2952
return 0 ;
2945
2953
max_children = g_prefork_server -> m_iMaxChildren
2946
2954
+ g_prefork_server -> m_iExtraChildren ;
2947
2955
2948
- char * pBuf ;
2949
2956
size = max_children * sizeof ( lsapi_child_status ) * 2 + 3 * sizeof (int );
2950
2957
size = (size + 4095 ) / 4096 * 4096 ;
2951
2958
pBuf = ( char * ) mmap ( NULL , size , PROT_READ | PROT_WRITE ,
@@ -2978,9 +2985,9 @@ static void dump_debug_info( lsapi_child_status * pStatus, long tmCur )
2978
2985
return ;
2979
2986
}
2980
2987
2981
- lsapi_log ("Possible runaway process, PPID: %d, PID: %d, "
2988
+ lsapi_log ("Possible runaway process, UID: %d, PPID: %d, PID: %d, "
2982
2989
"reqCount: %d, process time: %ld, checkpoint time: %ld, start "
2983
- "time: %ld\n" , getpid (), pStatus -> m_pid ,
2990
+ "time: %ld\n" , getuid (), getppid (), pStatus -> m_pid ,
2984
2991
pStatus -> m_iReqCounter , tmCur - pStatus -> m_tmReqBegin ,
2985
2992
tmCur - pStatus -> m_tmLastCheckPoint , tmCur - pStatus -> m_tmStart );
2986
2993
@@ -3008,12 +3015,11 @@ static void lsapi_check_child_status( long tmCur )
3008
3015
while ( pStatus < pEnd )
3009
3016
{
3010
3017
tobekilled = 0 ;
3011
- if ( pStatus -> m_pid != 0 )
3018
+ if ( pStatus -> m_pid != 0 && pStatus -> m_pid != -1 )
3012
3019
{
3013
3020
++ count ;
3014
3021
if ( !pStatus -> m_inProcess )
3015
3022
{
3016
-
3017
3023
if (g_prefork_server -> m_iCurChildren - dying
3018
3024
> g_prefork_server -> m_iMaxChildren
3019
3025
|| idle > g_prefork_server -> m_iMaxIdleChildren )
@@ -3030,7 +3036,7 @@ static void lsapi_check_child_status( long tmCur )
3030
3036
//tobekilled = SIGUSR1;
3031
3037
}
3032
3038
}
3033
- if ( ! tobekilled )
3039
+ if (! pStatus -> m_iKillSent )
3034
3040
++ idle ;
3035
3041
}
3036
3042
else
@@ -3184,6 +3190,9 @@ static int lsapi_prefork_server_accept( lsapi_prefork_server * pServer,
3184
3190
3185
3191
#if defined(linux ) || defined(__linux ) || defined(__linux__ ) || defined(__gnu_linux__ )
3186
3192
* s_avail_pages = sysconf (_SC_AVPHYS_PAGES );
3193
+ // lsapi_log("Memory total: %zd, free: %zd, free %%%zd\n",
3194
+ // s_total_pages, *s_avail_pages, *s_avail_pages * 100 / s_total_pages);
3195
+
3187
3196
#endif
3188
3197
FD_ZERO ( & readfds );
3189
3198
FD_SET ( pServer -> m_fd , & readfds );
@@ -3196,7 +3205,8 @@ static int lsapi_prefork_server_accept( lsapi_prefork_server * pServer,
3196
3205
if (s_accepting_workers )
3197
3206
accepting = __sync_add_and_fetch (s_accepting_workers , 0 );
3198
3207
3199
- if (pServer -> m_iCurChildren > 0 && accepting > 0 )
3208
+ if (pServer -> m_iCurChildren > 0
3209
+ && accepting > 0 )
3200
3210
{
3201
3211
usleep (400 );
3202
3212
while (accepting -- > 0 )
@@ -3265,10 +3275,10 @@ static int lsapi_prefork_server_accept( lsapi_prefork_server * pServer,
3265
3275
__sync_add_and_fetch (s_busy_workers , 1 );
3266
3276
lsapi_set_nblock ( pReq -> m_fd , 0 );
3267
3277
//keep it open if busy_count is used.
3268
- if (s_busy_workers
3278
+ if (! s_keep_listener && s_busy_workers
3269
3279
&& * s_busy_workers > (pServer -> m_iMaxChildren >> 1 ))
3270
- s_keepListener = 1 ;
3271
- if ((s_uid == 0 || !s_keepListener || !is_enough_free_mem ())
3280
+ s_keep_listener = 1 ;
3281
+ if ((s_uid == 0 || !s_keep_listener || !is_enough_free_mem ())
3272
3282
&& pReq -> m_fdListen != -1 )
3273
3283
{
3274
3284
close ( pReq -> m_fdListen );
@@ -3289,7 +3299,9 @@ static int lsapi_prefork_server_accept( lsapi_prefork_server * pServer,
3289
3299
}
3290
3300
else if ( pid == -1 )
3291
3301
{
3292
- perror ( "fork() failed, please increase process limit" );
3302
+ lsapi_perror ("fork() failed, please increase process limit" , errno );
3303
+ if (child_status )
3304
+ child_status -> m_pid = 0 ;
3293
3305
}
3294
3306
else
3295
3307
{
@@ -3312,7 +3324,7 @@ static int lsapi_prefork_server_accept( lsapi_prefork_server * pServer,
3312
3324
{
3313
3325
if (( errno == EINTR )|| ( errno == EAGAIN ))
3314
3326
continue ;
3315
- perror ( "accept() failed" );
3327
+ lsapi_perror ( "accept() failed" , errno );
3316
3328
return -1 ;
3317
3329
}
3318
3330
}
@@ -3350,10 +3362,10 @@ int LSAPI_Postfork_Child(LSAPI_Request * pReq)
3350
3362
__sync_add_and_fetch (s_busy_workers , 1 );
3351
3363
lsapi_set_nblock ( pReq -> m_fd , 0 );
3352
3364
//keep it open if busy_count is used.
3353
- if (s_busy_workers
3365
+ if (! s_keep_listener && s_busy_workers
3354
3366
&& * s_busy_workers > (max_children >> 1 ))
3355
- s_keepListener = 1 ;
3356
- if ((s_uid == 0 || !s_keepListener || !is_enough_free_mem ())
3367
+ s_keep_listener = 1 ;
3368
+ if ((s_uid == 0 || !s_keep_listener || !is_enough_free_mem ())
3357
3369
&& pReq -> m_fdListen != -1 )
3358
3370
{
3359
3371
close (pReq -> m_fdListen );
@@ -3512,7 +3524,7 @@ int LSAPI_Accept_Before_Fork(LSAPI_Request * pReq)
3512
3524
{
3513
3525
if ((errno == EINTR ) || (errno == EAGAIN ))
3514
3526
continue ;
3515
- perror ( "accept() failed" );
3527
+ lsapi_perror ( "accept() failed" , errno );
3516
3528
ret = -1 ;
3517
3529
break ;
3518
3530
}
@@ -3528,13 +3540,6 @@ int LSAPI_Accept_Before_Fork(LSAPI_Request * pReq)
3528
3540
}
3529
3541
3530
3542
3531
- void lsapi_perror ( const char * pMessage , int err_no )
3532
- {
3533
- lsapi_log ("%s, errno: %d (%s)\n" , pMessage , err_no ,
3534
- strerror ( err_no ) );
3535
- }
3536
-
3537
-
3538
3543
int LSAPI_Prefork_Accept_r ( LSAPI_Request * pReq )
3539
3544
{
3540
3545
int fd ;
@@ -3620,9 +3625,21 @@ int LSAPI_Prefork_Accept_r( LSAPI_Request * pReq )
3620
3625
if ( s_worker_status )
3621
3626
{
3622
3627
s_worker_status -> m_inProcess = 0 ;
3623
- if (fd == pReq -> m_fdListen
3624
- && (s_keepListener != 2 || !is_enough_free_mem ()))
3625
- return -1 ;
3628
+ if (fd == pReq -> m_fdListen )
3629
+ {
3630
+ if (s_keep_listener == 0 || !is_enough_free_mem ())
3631
+ return -1 ;
3632
+ if (s_keep_listener == 1 )
3633
+ {
3634
+ int wait_time = 10 ;
3635
+ if (s_busy_workers )
3636
+ wait_time += * s_busy_workers * 10 ;
3637
+ if (s_accepting_workers )
3638
+ wait_time >>= (* s_accepting_workers );
3639
+ if (wait_secs >= wait_time )
3640
+ return -1 ;
3641
+ }
3642
+ }
3626
3643
}
3627
3644
++ wait_secs ;
3628
3645
if (( s_max_idle_secs > 0 )&& (wait_secs >= s_max_idle_secs ))
@@ -3657,7 +3674,7 @@ int LSAPI_Prefork_Accept_r( LSAPI_Request * pReq )
3657
3674
3658
3675
lsapi_set_nblock ( fd , 0 );
3659
3676
//init_conn_key( pReq->m_fd );
3660
- if (!s_keepListener )
3677
+ if (!s_keep_listener )
3661
3678
{
3662
3679
close ( pReq -> m_fdListen );
3663
3680
pReq -> m_fdListen = -1 ;
@@ -3949,7 +3966,7 @@ int LSAPI_Init_Env_Parameters( fn_select_t fp )
3949
3966
if ( p )
3950
3967
{
3951
3968
n = atoi ( p );
3952
- s_keepListener = n ;
3969
+ s_keep_listener = n ;
3953
3970
}
3954
3971
3955
3972
p = getenv ( "LSAPI_AVOID_FORK" );
@@ -3958,7 +3975,7 @@ int LSAPI_Init_Env_Parameters( fn_select_t fp )
3958
3975
avoidFork = atoi ( p );
3959
3976
if (avoidFork )
3960
3977
{
3961
- s_keepListener = 2 ;
3978
+ s_keep_listener = 2 ;
3962
3979
ch = * (p + strlen (p ) - 1 );
3963
3980
if ( ch == 'G' || ch == 'g' )
3964
3981
avoidFork *= 1024 * 1024 * 1024 ;
0 commit comments