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