mirror of
https://git.openafs.org/openafs.git
synced 2025-01-18 23:10:58 +00:00
264d6b786c
The auth/superuser-t test runs an Rx server and client in two child processes. If the client process tries to contact the server before the server has started listening on its port, some tests involving RPCs can fail (notably test 39, "Can run a simple RPC"). Normally if we try to contact a server that's not there, Rx will try resending its packets a few times, but on Linux with AFS_RXERRQ_ENV, if the port isn't open at all, we can get an ICMP_PORT_UNREACH error, which causes the relevant Rx call to die immediately with RX_CALL_DEAD. This means that if the auth/superuser-t client is only just a bit faster than the server starting up, tests can fail, since the server's port is not open yet. To avoid this, we can wait until the server's port is open before starting the client process. To do this, have the server process send a SIGUSR1 to the parent after rx_Init() is called, and have the parent process wait for the SIGUSR1 (waiting for a max of 5 seconds before failing). This should guarantee that the server's port will be open by the time the client starts running. Note that before commit086d1858
(LINUX: Include linux/time.h for linux/errqueue.h), AFS_RXERRQ_ENV was mistakenly disabled on Linux 3.17+, so this issue was probably not possible on recent Linux before that commit. Reviewed-on: https://gerrit.openafs.org/14109 Tested-by: BuildBot <buildbot@rampaginggeek.com> Reviewed-by: Benjamin Kaduk <kaduk@mit.edu> Reviewed-by: Cheyenne Wills <cwills@sinenomine.net> (cherry picked from commit66d0f91791
) Change-Id: Ia6c06ca9a05e33b3bc35238d9c0d18e7ff339438 Reviewed-on: https://gerrit.openafs.org/14290 Reviewed-by: Cheyenne Wills <cwills@sinenomine.net> Tested-by: BuildBot <buildbot@rampaginggeek.com> Reviewed-by: Stephan Wiesand <stephan.wiesand@desy.de>
61 lines
2.4 KiB
C
61 lines
2.4 KiB
C
/*
|
|
* Copyright (c) 2010 Your File System Inc. All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR `AS IS'' AND ANY EXPRESS OR
|
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
/* config.c */
|
|
extern char *afstest_BuildTestConfig(void);
|
|
extern void afstest_UnlinkTestConfig(char *);
|
|
|
|
struct afsconf_dir;
|
|
extern int afstest_AddDESKeyFile(struct afsconf_dir *dir);
|
|
|
|
/* rxkad.c */
|
|
|
|
extern struct rx_securityClass
|
|
*afstest_FakeRxkadClass(struct afsconf_dir *dir,
|
|
char *name, char *instance, char *realm,
|
|
afs_uint32 startTime, afs_uint32 endTime);
|
|
/* servers.c */
|
|
|
|
struct rx_call;
|
|
extern int afstest_StartVLServer(char *dirname, pid_t *serverPid);
|
|
extern int afstest_StopServer(pid_t serverPid);
|
|
extern int afstest_StartTestRPCService(const char *, pid_t, u_short, u_short,
|
|
afs_int32 (*proc)(struct rx_call *));
|
|
|
|
/* ubik.c */
|
|
struct ubik_client;
|
|
extern int afstest_GetUbikClient(struct afsconf_dir *dir, char *service,
|
|
int serviceId,
|
|
struct rx_securityClass *secClass,
|
|
int secIndex,
|
|
struct ubik_client **ubikClient);
|
|
|
|
/* network.c */
|
|
extern int afstest_IsLoopbackNetworkDefault(void);
|
|
extern int afstest_SkipTestsIfLoopbackNetIsDefault(void);
|
|
extern void afstest_SkipTestsIfBadHostname(void);
|
|
|
|
/* misc.c */
|
|
extern char *afstest_GetProgname(char **argv);
|