diff options
| -rw-r--r-- | booster/src/booster.c | 322 | 
1 files changed, 86 insertions, 236 deletions
diff --git a/booster/src/booster.c b/booster/src/booster.c index cb35be519d3..5137e8e2ffb 100644 --- a/booster/src/booster.c +++ b/booster/src/booster.c @@ -74,6 +74,11 @@ extern int pipe (int filedes[2]);  #define UNIX_PATH_MAX 108  #endif +typedef enum { +        BOOSTER_OPEN, +        BOOSTER_CREAT +} booster_op_t; +  struct _inode;  struct _dict;  struct _fd { @@ -213,15 +218,7 @@ struct booster_mount {  };  typedef struct booster_mount booster_mount_t; -struct booster_mount_table { -        pthread_mutex_t lock; -        struct list_head *mounts; -        int32_t hash_size; -}; -typedef struct booster_mount_table booster_mount_table_t; -  static fdtable_t *booster_glfs_fdtable = NULL; -static booster_mount_table_t *booster_mount_table = NULL;  extern int booster_configure (char *confpath);  /* This is dup'ed every time VMP open/creat wants a new fd. @@ -250,55 +247,6 @@ booster_get_process_fd ()  #define BOOSTER_LOG_ENV_VAR     "GLUSTERFS_BOOSTER_LOG" -static int32_t -__booster_put_handle (booster_mount_table_t *table, dev_t st_dev, -                      glusterfs_handle_t handle) -{ -        int32_t hash = 0; -        booster_mount_t *mount = NULL, *tmp = NULL; -	int32_t ret = 0; - -        mount = calloc (1, sizeof (*mount)); -	if (!mount) { -		return -1; -	} - -        // ERR_ABORT (mount); -        INIT_LIST_HEAD (&mount->device_list); -        mount->st_dev = st_dev; -        mount->handle = handle; - -        hash = st_dev % table->hash_size; -        list_for_each_entry (tmp, &table->mounts[hash], device_list) { -                if (tmp->st_dev == st_dev) { -                        ret = -1; -                        errno = EEXIST; -                        goto out; -                } -        } - -        list_add (&mount->device_list, &table->mounts[hash]); -out: -        if (ret == -1) -                free (mount); -        return ret; -} - -static int32_t -booster_put_handle (booster_mount_table_t *table,dev_t st_dev, -                    glusterfs_handle_t handle) -{ -	int32_t ret = 0; -        pthread_mutex_lock (&table->lock); -        { -                ret = __booster_put_handle (table, st_dev, handle); -        } -        pthread_mutex_unlock (&table->lock); - -        return ret; -} - -  static inline glusterfs_file_t  booster_get_glfs_fd (fdtable_t *fdtable, int fd)  { @@ -331,65 +279,28 @@ booster_put_fd (fdtable_t *fdtable, int fd)          gf_fd_put (fdtable, fd);  } - -static glusterfs_handle_t -__booster_get_handle (booster_mount_table_t *table, dev_t st_dev) -{ -        int32_t hash = 0; -        booster_mount_t *mount = NULL; -        glusterfs_handle_t handle = NULL; - -        hash = st_dev % table->hash_size;  -        list_for_each_entry (mount, &table->mounts[hash], device_list) { -                if (mount->st_dev == st_dev) { -                        handle = mount->handle; -                        break; -                } -        } - -        return handle; -} - -static glusterfs_handle_t -booster_get_handle (booster_mount_table_t *table, dev_t st_dev) -{ -        glusterfs_handle_t handle = NULL; - -        pthread_mutex_lock (&table->lock); -        { -                handle = __booster_get_handle (table, st_dev); -        } -        pthread_mutex_unlock (&table->lock); -   -        return handle; -} - - -/* MBP - Mount Point Bypass, - * the approach used to bypass the already mounted glusterfs and instead - * use libglusterfsclient. - */ -glusterfs_handle_t -mbp_open (int fd, dev_t file_devno) +void +do_open (int fd, const char *pathname, int flags, mode_t mode, booster_op_t op)  { -        char *specfile = NULL; -        FILE *specfp = NULL; -        int32_t file_size = -1; -        int ret = -1; -        char *logfile = NULL; -        glusterfs_handle_t handle = NULL; - -        glusterfs_init_params_t ctx = { -                .loglevel = "critical", +        char                   *specfile = NULL; +        char                   *mount_point = NULL;  +        int32_t                 size = 0; +        int32_t                 ret = -1; +        FILE                   *specfp = NULL; +        glusterfs_file_t        fh = NULL; +        char                   *logfile = NULL; +        glusterfs_init_params_t iparams = { +                .loglevel = "error",                  .lookup_timeout = 600,                  .stat_timeout = 600,          }; - -        file_size = fgetxattr (fd, "user.glusterfs-booster-volfile", NULL, 0); -        if (file_size == -1) -                return NULL; - -        specfile = calloc (1, file_size); +       +        size = fgetxattr (fd, "user.glusterfs-booster-volfile", NULL, 0); +        if (size == -1) { +                goto out; +        } +		 +        specfile = calloc (1, size);          if (!specfile) {                  fprintf (stderr, "cannot allocate memory: %s\n",                           strerror (errno)); @@ -397,108 +308,90 @@ mbp_open (int fd, dev_t file_devno)          }          ret = fgetxattr (fd, "user.glusterfs-booster-volfile", specfile, -                        file_size); -        if (ret == -1) +                         size); +        if (ret == -1) {                  goto out; - +        } +              specfp = tmpfile (); -        if (!specfp) +        if (!specfp) {                  goto out; +        } -        ret = fwrite (specfile, file_size, 1, specfp); -        if (ret != 1) +        ret = fwrite (specfile, size, 1, specfp); +        if (ret != 1) {                  goto out; - +        } +		          fseek (specfp, 0L, SEEK_SET); + +        size = fgetxattr (fd, "user.glusterfs-booster-mount", NULL, 0); +        if (size == -1) { +                goto out; +        } +         +        mount_point = calloc (size, sizeof (char)); +        if (!mount_point) { +                goto out; +        } +	 +        ret = fgetxattr (fd, "user.glusterfs-booster-mount", mount_point, size); +        if (ret == -1) { +                goto out; +        } +          logfile = getenv (BOOSTER_LOG_ENV_VAR);          if (logfile) {                  if (strlen (logfile) > 0) -                        ctx.logfile = strdup (logfile); +                        iparams.logfile = strdup (logfile);                  else -                        ctx.logfile = strdup (BOOSTER_DEFAULT_LOG); -        } else -                ctx.logfile = strdup (BOOSTER_DEFAULT_LOG); +                        iparams.logfile = strdup (BOOSTER_DEFAULT_LOG); +        } else { +                iparams.logfile = strdup (BOOSTER_DEFAULT_LOG); +        } -        ctx.specfp = specfp; -        handle = glusterfs_init (&ctx); -        if (!handle) -                goto out; +        iparams.specfp = specfp; -        ret = __booster_put_handle (booster_mount_table, file_devno, handle); -        if (ret == -1) { -                glusterfs_fini (handle); +        ret = glusterfs_mount (mount_point, &iparams); +        if ((ret == -1) && (errno != EEXIST)) {                  goto out;          } -out: -        if (specfile) -                free (specfile); - -        if (specfp) -                fclose (specfp); - -        if (ctx.logfile) -                free (ctx.logfile); +        switch (op) { +        case BOOSTER_OPEN: +                fh = glusterfs_open (pathname, flags, mode); +                break; -        return handle; -} +        case BOOSTER_CREAT: +                fh = glusterfs_creat (pathname, mode); +                break; +        } -void -do_open (int fd, int flags, mode_t mode) -{ -        glusterfs_handle_t handle; -        struct stat st = {0,}; -        int32_t ret = -1; +        if (!fh) { +                goto out; +        } -        ret = fstat (fd, &st); -        if (ret == -1) { -                return; +        if (booster_get_unused_fd (booster_glfs_fdtable, fh, fd) == -1) { +                goto out;          } +        fh = NULL; -        if (!booster_mount_table) { -                return; +out: +        if (specfile) { +                free (specfile);          } +        if (specfp) { +                fclose (specfp); +        } -        /* We need to have this big lock to prevent multiple threads -         * trying to create glusterfs contexts in parallel. The vol file -         * parser uses global variables which end up in inconsistent -         * state when modified by different threads without a sync mech -         * among them. -         * -         * We could reduce the lock granularity by locking only when the -         * glusterfs_init is called inside mbp_open but that requires a -         * new global lock, that I am not comfortable with. We're better off -         * using the mount table lock that fits in with the purpose of -         * maintaining multiple glusterfs contexts in a single process. -         */ -        pthread_mutex_lock (&booster_mount_table->lock); -        { -                handle = __booster_get_handle (booster_mount_table, st.st_dev); -                if (!handle) -                        handle = mbp_open (fd, st.st_dev); -        } -        pthread_mutex_unlock (&booster_mount_table->lock); - -        if (handle) { -                glusterfs_file_t glfs_fd; -                char path [UNIX_PATH_MAX]; -                ret = fgetxattr (fd, "user.glusterfs-booster-path", path, -                                 UNIX_PATH_MAX); -                if (ret == -1) { -                        return; -                } +        if (mount_point) { +                free (mount_point); +        } -                glfs_fd = glusterfs_glh_open (handle, path, flags, mode); -                if (glfs_fd) { -                        ret = booster_get_unused_fd (booster_glfs_fdtable, -                                                     glfs_fd, fd); -                        if (ret == -1) { -                                glusterfs_close (glfs_fd); -                                return; -                        }  -                } -        }  +        if (fh) { +                glusterfs_close (fh); +        }          return;  } @@ -610,8 +503,7 @@ booster_open (const char *pathname, int use64, int flags, ...)                  ret = my_open (pathname, flags);          if (ret != -1) { -                flags &= ~ GF_O_CREAT; -                do_open (ret, flags, mode); +                do_open (ret, pathname, flags, mode, BOOSTER_OPEN);          }  out: @@ -714,7 +606,8 @@ creat (const char *pathname, mode_t mode)          ret = real_creat (pathname, mode);          if (ret != -1) { -                do_open (ret, GF_O_WRONLY | GF_O_TRUNC, mode); +                do_open (ret, pathname, GF_O_WRONLY | GF_O_TRUNC, mode, +                         BOOSTER_CREAT);          }  out: @@ -1138,7 +1031,6 @@ fchown (int fd, uid_t owner, gid_t group)  static int   booster_init (void)  { -        int     i = 0;          char    *booster_conf_path = NULL;          int     ret = -1;          int     pipefd[2]; @@ -1150,28 +1042,6 @@ booster_init (void)  		goto err;          } -        booster_mount_table = calloc (1, sizeof (*booster_mount_table)); -        if (!booster_mount_table) { -                fprintf (stderr, "cannot allocate memory: %s\n", -                         strerror (errno)); -		goto err; -        } - -        pthread_mutex_init (&booster_mount_table->lock, NULL); -        booster_mount_table->hash_size = MOUNT_TABLE_HASH_SIZE; -        booster_mount_table->mounts = calloc (booster_mount_table->hash_size, -                                              sizeof (*booster_mount_table->mounts)); -        if (!booster_mount_table->mounts) { -                fprintf (stderr, "cannot allocate memory: %s\n", -                         strerror (errno)); -		goto err; -        } -  -        for (i = 0; i < booster_mount_table->hash_size; i++)  -        { -                INIT_LIST_HEAD (&booster_mount_table->mounts[i]); -        } -          if (pipe (pipefd) == -1)                  goto err; @@ -1207,9 +1077,6 @@ err:  static void  booster_cleanup (void)  { -	int i; -	booster_mount_t *mount = NULL, *tmp = NULL; -	  	/* gf_fd_fdtable_destroy (booster_glfs_fdtable);*/  	/*for (i=0; i < booster_glfs_fdtable->max_fds; i++) {  		if (booster_glfs_fdtable->fds[i]) { @@ -1221,24 +1088,7 @@ booster_cleanup (void)  	free (booster_glfs_fdtable);  	booster_glfs_fdtable = NULL; -        pthread_mutex_lock (&booster_mount_table->lock); -        { -		for (i = 0; i < booster_mount_table->hash_size; i++)  -		{ -			list_for_each_entry_safe (mount, tmp,  -						  &booster_mount_table->mounts[i], device_list) { -				list_del (&mount->device_list); -				glusterfs_fini (mount->handle); -				free (mount); -			} -                } -		free (booster_mount_table->mounts); -        } -        pthread_mutex_unlock (&booster_mount_table->lock); -  	glusterfs_reset (); -	free (booster_mount_table); -	booster_mount_table = NULL;  }  int  | 
