1c310e56c4fc805b259d41151a309caa277174973subrata_modak/* *************************************************
237550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman * *********** README ******************************
337550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman * *************************************************
437550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman *
537550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman * COMPILE : make
6c310e56c4fc805b259d41151a309caa277174973subrata_modak * RUN : ./locktests -n <number of concurent process> -f <test file> [-P]
737550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman *
8c310e56c4fc805b259d41151a309caa277174973subrata_modak * GOAL : This test tries to stress the fcntl locking functions.  A
9c310e56c4fc805b259d41151a309caa277174973subrata_modak * master process sets a lock on a file region (this is called "byte
10c310e56c4fc805b259d41151a309caa277174973subrata_modak * range locking").  Some slave processes try to perform operations on
11c310e56c4fc805b259d41151a309caa277174973subrata_modak * this region, such as read, write, set a new lock ... The expected
12c310e56c4fc805b259d41151a309caa277174973subrata_modak * results of these operations are known.  If the operation's result is
13c310e56c4fc805b259d41151a309caa277174973subrata_modak * the same as the expected one, the test suceeds, else it fails.
14c310e56c4fc805b259d41151a309caa277174973subrata_modak *
15c310e56c4fc805b259d41151a309caa277174973subrata_modak * Slaves are either concurent processes or threads.
16c310e56c4fc805b259d41151a309caa277174973subrata_modak * -n <num>  : Number of threads to use (mandatory).
17c310e56c4fc805b259d41151a309caa277174973subrata_modak * -f <file> : Run the test on a test file defined by the -f option (mandatory).
18c310e56c4fc805b259d41151a309caa277174973subrata_modak * -T        : Use threads instead of processes (optional).
19c310e56c4fc805b259d41151a309caa277174973subrata_modak *
20c310e56c4fc805b259d41151a309caa277174973subrata_modak * HISTORY : This program has been written to stress NFSv4 locks. -P
21c310e56c4fc805b259d41151a309caa277174973subrata_modak * option was created to verify NFSv4 locking was thread-aware, and so,
22c310e56c4fc805b259d41151a309caa277174973subrata_modak * locking behaviour over NFSv4 was POSIX correct both using threads and
23c310e56c4fc805b259d41151a309caa277174973subrata_modak * process. This option may not be usefull to stress.
24c310e56c4fc805b259d41151a309caa277174973subrata_modak *
25c310e56c4fc805b259d41151a309caa277174973subrata_modak * EXAMPLE : ./locktests -n 50 -f /file/system/to/test
2637550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman *
2737550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman *
28c310e56c4fc805b259d41151a309caa277174973subrata_modak * Vincent ROQUETA 2005 - vincent.roqueta@ext.bull.net
2937550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman * BULL S.A.
30c310e56c4fc805b259d41151a309caa277174973subrata_modak */
31c310e56c4fc805b259d41151a309caa277174973subrata_modak
32c310e56c4fc805b259d41151a309caa277174973subrata_modak
33c310e56c4fc805b259d41151a309caa277174973subrata_modak#include <stdio.h>
34c310e56c4fc805b259d41151a309caa277174973subrata_modak#include <stdlib.h>
35c310e56c4fc805b259d41151a309caa277174973subrata_modak#include <stdlib.h>
36c310e56c4fc805b259d41151a309caa277174973subrata_modak#include <signal.h>
37c310e56c4fc805b259d41151a309caa277174973subrata_modak#include <string.h>
38c310e56c4fc805b259d41151a309caa277174973subrata_modak#include <unistd.h>
39c310e56c4fc805b259d41151a309caa277174973subrata_modak#include <fcntl.h>
40c310e56c4fc805b259d41151a309caa277174973subrata_modak#include <errno.h>
41c310e56c4fc805b259d41151a309caa277174973subrata_modak#include <math.h>
42c310e56c4fc805b259d41151a309caa277174973subrata_modak#ifdef STDARG
43c310e56c4fc805b259d41151a309caa277174973subrata_modak#include <stdarg.h>
44c310e56c4fc805b259d41151a309caa277174973subrata_modak#endif
45c310e56c4fc805b259d41151a309caa277174973subrata_modak#include <sys/types.h>
46c310e56c4fc805b259d41151a309caa277174973subrata_modak#include <sys/wait.h>
47c310e56c4fc805b259d41151a309caa277174973subrata_modak#include <sys/param.h>
48c310e56c4fc805b259d41151a309caa277174973subrata_modak#include <sys/times.h>
49c310e56c4fc805b259d41151a309caa277174973subrata_modak#ifdef MMAP
50c310e56c4fc805b259d41151a309caa277174973subrata_modak#include <sys/mman.h>
51c310e56c4fc805b259d41151a309caa277174973subrata_modak#endif
52c310e56c4fc805b259d41151a309caa277174973subrata_modak#include <inttypes.h>
53c310e56c4fc805b259d41151a309caa277174973subrata_modak#include <pthread.h>
54c310e56c4fc805b259d41151a309caa277174973subrata_modak#include <sys/socket.h>
55c310e56c4fc805b259d41151a309caa277174973subrata_modak#include <netinet/in.h>
56c310e56c4fc805b259d41151a309caa277174973subrata_modak#include <sys/select.h>
57c310e56c4fc805b259d41151a309caa277174973subrata_modak
58c310e56c4fc805b259d41151a309caa277174973subrata_modak#ifdef O_SYNC
59c310e56c4fc805b259d41151a309caa277174973subrata_modak#define OPENFLAGS       (O_CREAT | O_RDWR | O_SYNC )
60c310e56c4fc805b259d41151a309caa277174973subrata_modak#else
61c310e56c4fc805b259d41151a309caa277174973subrata_modak#define OPENFLAGS       (O_CREAT | O_RDWR )
62c310e56c4fc805b259d41151a309caa277174973subrata_modak#endif
63c310e56c4fc805b259d41151a309caa277174973subrata_modak#define OPENMODES       (0600)
64c310e56c4fc805b259d41151a309caa277174973subrata_modak#define MANDMODES       (0600)
65c310e56c4fc805b259d41151a309caa277174973subrata_modak/*(02666)*/
66c310e56c4fc805b259d41151a309caa277174973subrata_modak
67c310e56c4fc805b259d41151a309caa277174973subrata_modak#define SUCCES 1
68c310e56c4fc805b259d41151a309caa277174973subrata_modak#define ECHEC  0
69c310e56c4fc805b259d41151a309caa277174973subrata_modak
70c310e56c4fc805b259d41151a309caa277174973subrata_modak#define TRUE 1
71c310e56c4fc805b259d41151a309caa277174973subrata_modak#define FALSE 0
72c310e56c4fc805b259d41151a309caa277174973subrata_modak
73c310e56c4fc805b259d41151a309caa277174973subrata_modak#define PROCESS 0
74c310e56c4fc805b259d41151a309caa277174973subrata_modak#define THREAD 1
75c310e56c4fc805b259d41151a309caa277174973subrata_modak
76c310e56c4fc805b259d41151a309caa277174973subrata_modak
77c310e56c4fc805b259d41151a309caa277174973subrata_modak//#define DEBUG
78c310e56c4fc805b259d41151a309caa277174973subrata_modak#ifdef DEBUG
79c310e56c4fc805b259d41151a309caa277174973subrata_modak        #define E(a)  perror(a)
80c310e56c4fc805b259d41151a309caa277174973subrata_modak        #define P(a,b) printf(a,b)
81c310e56c4fc805b259d41151a309caa277174973subrata_modak#else
82c310e56c4fc805b259d41151a309caa277174973subrata_modak        #define E(a)
83c310e56c4fc805b259d41151a309caa277174973subrata_modak        #define P(a,b)
84c310e56c4fc805b259d41151a309caa277174973subrata_modak#endif
85c310e56c4fc805b259d41151a309caa277174973subrata_modak
86c310e56c4fc805b259d41151a309caa277174973subrata_modak
87c310e56c4fc805b259d41151a309caa277174973subrata_modak
88c310e56c4fc805b259d41151a309caa277174973subrata_modak#ifndef LOCKTESTS_H
89c310e56c4fc805b259d41151a309caa277174973subrata_modak#define LOCKTESTS_H
90c310e56c4fc805b259d41151a309caa277174973subrata_modak
91c310e56c4fc805b259d41151a309caa277174973subrata_modak#define M_SIZE 512
92c310e56c4fc805b259d41151a309caa277174973subrata_modak
93c310e56c4fc805b259d41151a309caa277174973subrata_modakint writeToAllClients(char *foo);//#define DEBUG
94c310e56c4fc805b259d41151a309caa277174973subrata_modak
95c310e56c4fc805b259d41151a309caa277174973subrata_modakint serverReceiveNet();
96c310e56c4fc805b259d41151a309caa277174973subrata_modakint clientReceiveNet();
97c310e56c4fc805b259d41151a309caa277174973subrata_modakint serverReceiveClient(int n);
98c310e56c4fc805b259d41151a309caa277174973subrata_modakint setupClients(int type, char *fname, int nThread);
99c310e56c4fc805b259d41151a309caa277174973subrata_modakint serverCloseConnection();
100c310e56c4fc805b259d41151a309caa277174973subrata_modakint getConfiguration(int *type, char *fname, int *nThread);
101c310e56c4fc805b259d41151a309caa277174973subrata_modakint readFromServer(char *message);
102c310e56c4fc805b259d41151a309caa277174973subrata_modakint serverSendClient(int n);
103c310e56c4fc805b259d41151a309caa277174973subrata_modak
104c310e56c4fc805b259d41151a309caa277174973subrata_modak
105c310e56c4fc805b259d41151a309caa277174973subrata_modakenum etat_t     {
106c310e56c4fc805b259d41151a309caa277174973subrata_modak                CLEAN,
107c310e56c4fc805b259d41151a309caa277174973subrata_modak                RDONLY,
108c310e56c4fc805b259d41151a309caa277174973subrata_modak                RESULTAT,
109c310e56c4fc805b259d41151a309caa277174973subrata_modak                WRONLY,
110c310e56c4fc805b259d41151a309caa277174973subrata_modak                SELECT,
111c310e56c4fc805b259d41151a309caa277174973subrata_modak                LOCK,
112c310e56c4fc805b259d41151a309caa277174973subrata_modak                SYNC,
113c310e56c4fc805b259d41151a309caa277174973subrata_modak                FIN,
114c310e56c4fc805b259d41151a309caa277174973subrata_modak                READLOCK,
115c310e56c4fc805b259d41151a309caa277174973subrata_modak                WRITELOCK,
116c310e56c4fc805b259d41151a309caa277174973subrata_modak                BYTELOCK,
117c310e56c4fc805b259d41151a309caa277174973subrata_modak                BYTELOCK_READ,
118c310e56c4fc805b259d41151a309caa277174973subrata_modak                BYTELOCK_WRITE
119c310e56c4fc805b259d41151a309caa277174973subrata_modak};
120c310e56c4fc805b259d41151a309caa277174973subrata_modak
121c310e56c4fc805b259d41151a309caa277174973subrata_modak/* Donnees communes aà tous les processu */
122c310e56c4fc805b259d41151a309caa277174973subrata_modak/* Public data */
123c310e56c4fc805b259d41151a309caa277174973subrata_modakstruct donneesPub {
124c310e56c4fc805b259d41151a309caa277174973subrata_modak    /* Nombre de clients */
12537550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman    /* Number of clients */
126c310e56c4fc805b259d41151a309caa277174973subrata_modak    int nclnt;
127c310e56c4fc805b259d41151a309caa277174973subrata_modak    /* Liste des clients (liste des tubes)*/
128c310e56c4fc805b259d41151a309caa277174973subrata_modak    /* List of master to slave pipes */
129c310e56c4fc805b259d41151a309caa277174973subrata_modak    int **lclnt;
130c310e56c4fc805b259d41151a309caa277174973subrata_modak    /* Tube de communication avec le maitre */
131c310e56c4fc805b259d41151a309caa277174973subrata_modak    /* Slave to master pipe */
132c310e56c4fc805b259d41151a309caa277174973subrata_modak    int maitre[2];
133c310e56c4fc805b259d41151a309caa277174973subrata_modak    /* Liste des threads */
134c310e56c4fc805b259d41151a309caa277174973subrata_modak    /* Thread list */
135c310e56c4fc805b259d41151a309caa277174973subrata_modak    pthread_t *lthreads;
136c310e56c4fc805b259d41151a309caa277174973subrata_modak    /* nom du fichier test */
137c310e56c4fc805b259d41151a309caa277174973subrata_modak    /* test file name */
138c310e56c4fc805b259d41151a309caa277174973subrata_modak    char *fname;
139c310e56c4fc805b259d41151a309caa277174973subrata_modak    /* descripteur du fichier test */
140c310e56c4fc805b259d41151a309caa277174973subrata_modak    /* test file file-descriptor */
141c310e56c4fc805b259d41151a309caa277174973subrata_modak    int fd;
142c310e56c4fc805b259d41151a309caa277174973subrata_modak    /* Affichage des messages d'erreur */
143c310e56c4fc805b259d41151a309caa277174973subrata_modak    /* Detailed error messages */
144c310e56c4fc805b259d41151a309caa277174973subrata_modak    int verbose;
145c310e56c4fc805b259d41151a309caa277174973subrata_modak};
14637550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman
147c310e56c4fc805b259d41151a309caa277174973subrata_modak/* Donnees privees aux processus */
148c310e56c4fc805b259d41151a309caa277174973subrata_modak/* private data */
149c310e56c4fc805b259d41151a309caa277174973subrata_modakstruct donneesPriv {
150c310e56c4fc805b259d41151a309caa277174973subrata_modak    /* Numero de thread. */
151c310e56c4fc805b259d41151a309caa277174973subrata_modak    /* thread number */
152c310e56c4fc805b259d41151a309caa277174973subrata_modak    int whoami;
153c310e56c4fc805b259d41151a309caa277174973subrata_modak};
154c310e56c4fc805b259d41151a309caa277174973subrata_modak
155c310e56c4fc805b259d41151a309caa277174973subrata_modakstruct donneesFils{
156c310e56c4fc805b259d41151a309caa277174973subrata_modak    struct donneesPub *dp;
157c310e56c4fc805b259d41151a309caa277174973subrata_modak    struct donneesPriv *dpr;
158c310e56c4fc805b259d41151a309caa277174973subrata_modak};
159c310e56c4fc805b259d41151a309caa277174973subrata_modak
160c310e56c4fc805b259d41151a309caa277174973subrata_modak
161c310e56c4fc805b259d41151a309caa277174973subrata_modakstruct s_test {
162c310e56c4fc805b259d41151a309caa277174973subrata_modak    int test;
163c310e56c4fc805b259d41151a309caa277174973subrata_modak    int type;
164c310e56c4fc805b259d41151a309caa277174973subrata_modak    char *nom;
165c310e56c4fc805b259d41151a309caa277174973subrata_modak    int resAtt;
16637550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman
167c310e56c4fc805b259d41151a309caa277174973subrata_modak};
168c310e56c4fc805b259d41151a309caa277174973subrata_modak
169c310e56c4fc805b259d41151a309caa277174973subrata_modak
17037550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman
17137550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman
17237550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearmanint configureServeur(int  max);
173c310e56c4fc805b259d41151a309caa277174973subrata_modakint configureClient(char *s);
174c310e56c4fc805b259d41151a309caa277174973subrata_modak
175c310e56c4fc805b259d41151a309caa277174973subrata_modak#endif
176