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