From: Alexandre Belloni <alexandre.belloni@bootlin.com>
To: li.wang@windriver.com
Cc: openembedded-core@lists.openembedded.org
Subject: Re: [OE-core] [openembedded-core V3][master][PATCH]xinetd: use monotonic time
Date: Sat, 3 Aug 2024 23:14:01 +0200 [thread overview]
Message-ID: <20240803211401f027b38c@mail.local> (raw)
In-Reply-To: <20240731022935.1745228-1-li.wang@windriver.com>
This fails to build:
https://autobuilder.yoctoproject.org/typhoon/#/builders/108/builds/6251/steps/11/logs/stdio
https://autobuilder.yoctoproject.org/typhoon/#/builders/52/builds/9164/steps/11/logs/stdio
https://autobuilder.yoctoproject.org/typhoon/#/builders/45/builds/9344/steps/11/logs/stdio
https://autobuilder.yoctoproject.org/typhoon/#/builders/64/builds/9332/steps/12/logs/stdio
On 31/07/2024 10:29:35+0800, Li Wang via lists.openembedded.org wrote:
> when using xinet.d to limit rsync connections and time is set back,
> the connection limit is reached very quickly and rsync gets deactivated,
> if time is changed again, rsync is never reactivated.
>
> date -s "xxx"
> xinetd[xxx]: Deactivating service rsync due to excessive incoming connections. Restarting in 10 seconds.
>
> the timer of xinet.d is based on time() function, and it is affected by system time.
>
> Signed-off-by: Li Wang <li.wang@windriver.com>
> ---
> .../xinetd/xinetd/use-monotonic-time.patch | 246 ++++++++++++++++++
> .../xinetd/xinetd_2.3.15.4.bb | 1 +
> 2 files changed, 247 insertions(+)
> create mode 100644 meta/recipes-extended/xinetd/xinetd/use-monotonic-time.patch
>
> diff --git a/meta/recipes-extended/xinetd/xinetd/use-monotonic-time.patch b/meta/recipes-extended/xinetd/xinetd/use-monotonic-time.patch
> new file mode 100644
> index 0000000000..2144c3cba2
> --- /dev/null
> +++ b/meta/recipes-extended/xinetd/xinetd/use-monotonic-time.patch
> @@ -0,0 +1,246 @@
> +use monotonic time
> +
> +when using xinet.d to limit rsync connections and time is set back,
> +the connection limit is reached very quickly and rsync gets deactivated,
> +if time is changed again, rsync is never reactivated.
> +
> +date -s "xxx"
> +xinetd[xxx]: Deactivating service rsync due to excessive incoming connections. Restarting in 10 seconds.
> +
> +the timer of xinet.d is based on time() function, and it is affected by system time.
> +
> +Upstream-Status: Submitted [https://github.com/openSUSE/xinetd/pull/45]
> +
> +Signed-off-by: Li Wang <li.wang@windriver.com>
> +---
> + src/access.c | 6 +++---
> + src/builtins.c | 4 ++--
> + src/internals.c | 2 +-
> + src/log.c | 2 +-
> + src/sensor.c | 6 +++---
> + src/server.c | 2 +-
> + src/service.c | 4 ++--
> + src/signals.c | 2 +-
> + src/time.c | 2 +-
> + src/xlog/filelog.c | 2 +-
> + src/xtimer.c | 15 ++++++++++++---
> + src/xtimer.h | 1 +
> + 12 files changed, 29 insertions(+), 19 deletions(-)
> +
> +--- a/src/access.c
> ++++ b/src/access.c
> +@@ -70,7 +70,7 @@ static void cps_service_restart(void)
> + time_t nowtime;
> + const char *func = "cps_service_restart";
> +
> +- nowtime = time(NULL);
> ++ nowtime = _time(NULL);
> + for( i=0; i < pset_count( SERVICES(ps) ); i++ ) {
> + struct service *sp;
> + struct service_config *scp;
> +@@ -104,7 +104,7 @@ void cps_service_stop(struct service *sp
> + msg(LOG_ERR, "service_stop",
> + "Deactivating service %s due to %s. Restarting in %d seconds.",
> + SC_NAME(scp), reason, (int)SC_TIME_WAIT(scp));
> +- nowtime = time(NULL);
> ++ nowtime = _time(NULL);
> + SC_TIME_REENABLE(scp) = nowtime + SC_TIME_WAIT(scp);
> + xtimer_add(cps_service_restart, SC_TIME_WAIT(scp));
> + }
> +@@ -284,7 +284,7 @@ access_e parent_access_control( struct s
> + /* CPS handler */
> + if( SC_TIME_CONN_MAX(scp) != 0 ) {
> + int time_diff;
> +- nowtime = time(NULL);
> ++ nowtime = _time(NULL);
> + time_diff = nowtime - SC_TIME_LIMIT(scp) ;
> +
> + if( SC_TIME_CONN(scp) == 0 ) {
> +--- a/src/builtins.c
> ++++ b/src/builtins.c
> +@@ -237,7 +237,7 @@ static void daytime_protocol( char *buf,
> + int size = *buflen ;
> + int cc ;
> +
> +- (void) time( &now ) ;
> ++ (void) _time( &now ) ;
> + tmp = localtime( &now ) ;
> + cc = strx_nprint( buf, size,
> + "%02d %s %d %02d:%02d:%02d",
> +@@ -308,7 +308,7 @@ static void time_protocol( unsigned char
> + time_t now ;
> + unsigned long base1900;
> +
> +- (void) time( &now ) ;
> ++ (void) _time( &now ) ;
> + base1900 = (unsigned long)now + TIME_OFFSET ;
> + timep[0] = base1900 >> 24;
> + timep[1] = base1900 >> 16;
> +--- a/src/internals.c
> ++++ b/src/internals.c
> +@@ -85,7 +85,7 @@ void dump_internal_state(void)
> + * Print the program name, version, and timestamp.
> + * Note that the program_version variable contains the program name.
> + */
> +- (void) time( ¤t_time ) ;
> ++ (void) _time( ¤t_time ) ;
> + Sprint( dump_fd, "INTERNAL STATE DUMP: %s\n", program_version ) ;
> + Sprint( dump_fd, "Current time: %s\n", ctime( ¤t_time ) ) ;
> +
> +--- a/src/log.c
> ++++ b/src/log.c
> +@@ -202,7 +202,7 @@ void svc_log_exit( struct service *sp, c
> + {
> + time_t current_time ;
> +
> +- (void) time( ¤t_time ) ;
> ++ (void) _time( ¤t_time ) ;
> + cc = strx_nprint( &buf[ len ], bufsize, " duration=%ld(sec)",
> + (long)(current_time - SERVER_STARTTIME( serp )) ) ;
> + len += cc ;
> +--- a/src/sensor.c
> ++++ b/src/sensor.c
> +@@ -68,7 +68,7 @@ void process_sensor( const struct servic
> + time_t nowtime;
> + char time_buf[40], *tmp;
> +
> +- nowtime = time(NULL);
> ++ nowtime = _time(NULL);
> + msg(LOG_CRIT, func,
> + "Adding %s to the global_no_access list for %d minutes",
> + dup_addr, SC_DENY_TIME(SVC_CONF(sp)));
> +@@ -113,7 +113,7 @@ void process_sensor( const struct servic
> + {
> + time_t nowtime, new_time;
> +
> +- nowtime = time(NULL);
> ++ nowtime = _time(NULL);
> + new_time = (time_t)nowtime+(60*SC_DENY_TIME(SVC_CONF(sp))); if (difftime(new_time, (time_t)stored_time) > 0.0)
> + { /* new_time is longer save it */
> + char time_buf[40], *new_exp_time;
> +@@ -163,7 +163,7 @@ static void scrub_global_access_list( vo
> + {
> + int found_one = 0;
> + unsigned u;
> +- time_t nowtime = time(NULL);
> ++ time_t nowtime = _time(NULL);
> +
> + for (u=0; u < count; u++)
> + {
> +--- a/src/server.c
> ++++ b/src/server.c
> +@@ -228,7 +228,7 @@ status_e server_start( struct server *se
> + return( FAILED ) ;
> +
> + default:
> +- (void) time( &SERVER_STARTTIME(serp) ) ;
> ++ (void) _time( &SERVER_STARTTIME(serp) ) ;
> + SVC_INC_RUNNING_SERVERS( sp ) ;
> +
> + /*
> +--- a/src/service.c
> ++++ b/src/service.c
> +@@ -840,7 +840,7 @@ static status_e failed_service(struct se
> + SVC_LAST_DGRAM_ADDR(sp) = (union xsockaddr *)last;
> + }
> +
> +- (void) time( ¤t_time ) ;
> ++ (void) _time( ¤t_time ) ;
> + if ( sinp->sin_addr.s_addr == last->sin_addr.s_addr &&
> + sinp->sin_port == last->sin_port )
> + {
> +@@ -867,7 +867,7 @@ static status_e failed_service(struct se
> + SVC_LAST_DGRAM_ADDR( sp ) = (union xsockaddr *)last;
> + }
> +
> +- (void) time( ¤t_time ) ;
> ++ (void) _time( ¤t_time ) ;
> + if ( IN6_ARE_ADDR_EQUAL(&(sinp->sin6_addr), &(last->sin6_addr)) &&
> + sinp->sin6_port == last->sin6_port )
> + {
> +--- a/src/signals.c
> ++++ b/src/signals.c
> +@@ -301,7 +301,7 @@ static void bad_signal(void)
> + else if ( total_signal_count > MAX_SIGNAL_COUNT )
> + _exit( 1 ) ; /* in case of a problem in exit(3) */
> +
> +- (void) time( ¤t_time ) ;
> ++ (void) _time( ¤t_time ) ;
> +
> + if ( interval_signal_count > 0 &&
> + current_time - interval_start <= SIGNAL_INTERVAL )
> +--- a/src/time.c
> ++++ b/src/time.c
> +@@ -41,7 +41,7 @@ bool_int ti_current_time_check( const ps
> + int16_t min_current ;
> + struct tm *tmp ;
> +
> +- (void) time( ¤t_time ) ;
> ++ (void) _time( ¤t_time ) ;
> + tmp = localtime( ¤t_time ) ;
> + min_current = tmp->tm_hour * 60 + tmp->tm_min ;
> +
> +--- a/src/xlog/filelog.c
> ++++ b/src/xlog/filelog.c
> +@@ -190,7 +190,7 @@ static int filelog_write( xlog_s *xp, co
> + if ( flp->fl_state != FL_OPEN )
> + return( flp->fl_error ) ;
> +
> +- (void) time( ¤t_time ) ;
> ++ (void) _time( ¤t_time ) ;
> + tmp = localtime( ¤t_time ) ;
> + cc = Sprint( flp->fl_fd, "%02d/%d/%d@%02d:%02d:%02d",
> + tmp->tm_year%100, tmp->tm_mon+1, tmp->tm_mday,
> +--- a/src/xtimer.c
> ++++ b/src/xtimer.c
> +@@ -11,6 +11,15 @@
> + #include "pset.h"
> + #include "msg.h"
> +
> ++time_t _time(time_t *t)
> ++{
> ++ struct timespec ts;
> ++ clock_gettime(CLOCK_MONOTONIC, &ts);
> ++ if(t)
> ++ *t = ts.tv_sec;
> ++ return ts.tv_sec;
> ++}
> ++
> + /* A note on the usage of timers in these functions:
> + * The timers are composed of 3 elements, a pointer to a callback function,
> + * the expire time of the timer, and a unique (pseudo-monotomically increasing)
> +@@ -68,7 +77,7 @@ int xtimer_add( void (*func)(void), time
> + return -1;
> + }
> +
> +- tmptime = time(NULL);
> ++ tmptime = _time(NULL);
> + if( tmptime == -1 ) {
> + free( new_xtimer );
> + return -1;
> +@@ -107,7 +116,7 @@ int xtimer_poll(void)
> +
> + for( i = 0; i < pset_count( xtimer_list ); i++ ) {
> + xtime_h *cur_timer = pset_pointer( xtimer_list, i );
> +- time_t cur_time = time(NULL);
> ++ time_t cur_time = _time(NULL);
> +
> + /* The list is sorted, low to high. If there's no
> + * timers left, return.
> +@@ -163,7 +172,7 @@ time_t xtimer_nexttime(void)
> + if( pset_count(xtimer_list) == 0 )
> + return -1;
> +
> +- ret = ((xtime_h *)pset_pointer(xtimer_list, 0))->when - time(NULL) ;
> ++ ret = ((xtime_h *)pset_pointer(xtimer_list, 0))->when - _time(NULL) ;
> + if( ret < 0 )
> + ret = 0;
> + return( ret );
> +--- a/src/xtimer.h
> ++++ b/src/xtimer.h
> +@@ -22,4 +22,5 @@ int xtimer_poll(void);
> + int xtimer_remove(int);
> + time_t xtimer_nexttime(void);
> +
> ++time_t _time(time_t *t);
> + #endif /* _X_TIMER_H */
> diff --git a/meta/recipes-extended/xinetd/xinetd_2.3.15.4.bb b/meta/recipes-extended/xinetd/xinetd_2.3.15.4.bb
> index c6d356d227..94fc28ff6e 100644
> --- a/meta/recipes-extended/xinetd/xinetd_2.3.15.4.bb
> +++ b/meta/recipes-extended/xinetd/xinetd_2.3.15.4.bb
> @@ -13,6 +13,7 @@ SRC_URI = "git://github.com/openSUSE/xinetd.git;protocol=https;branch=master \
> file://xinetd.init \
> file://xinetd.default \
> file://xinetd.service \
> + file://use-monotonic-time.patch \
> "
>
> SRCREV = "6a4af7786630ce48747d9687e2f18f45ea6684c4"
> --
> 2.25.1
>
>
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#202688): https://lists.openembedded.org/g/openembedded-core/message/202688
> Mute This Topic: https://lists.openembedded.org/mt/107640089/3617179
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [alexandre.belloni@bootlin.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
--
Alexandre Belloni, co-owner and COO, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
prev parent reply other threads:[~2024-08-03 21:14 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-31 2:29 [openembedded-core V3][master][PATCH]xinetd: use monotonic time Li Wang
2024-08-03 21:14 ` Alexandre Belloni [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240803211401f027b38c@mail.local \
--to=alexandre.belloni@bootlin.com \
--cc=li.wang@windriver.com \
--cc=openembedded-core@lists.openembedded.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox