summaryrefslogtreecommitdiffstats
path: root/booster/src/booster.c
diff options
context:
space:
mode:
Diffstat (limited to 'booster/src/booster.c')
-rw-r--r--booster/src/booster.c322
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