summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVenky Shankar <vshankar@redhat.com>2014-01-15 22:26:27 +0530
committerJeff Darcy <jdarcy@redhat.com>2014-01-16 21:21:48 +0000
commit0225d7bc712609232d592d48116ec771cd97c2cf (patch)
treec1b54e95144fd3cedd602be6eabc2a994eb3fb35
parentf94191b3ff1382b04591ce767abd437040d395b8 (diff)
features/changelog: couple of performance improvements
Changes being: * Changes journal preallocation size to 512 MB * Lock-less updation of journal Change-Id: I7c2b7ee224b3d338e4fdd35cc078ea2a13251292 Signed-off-by: Venky Shankar <vshankar@redhat.com>
-rw-r--r--xlators/features/changelog/src/changelog-helpers.h4
-rw-r--r--xlators/features/changelog/src/changelog-rt.c16
-rw-r--r--xlators/features/changelog/src/changelog-rt.h8
-rw-r--r--xlators/features/changelog/src/changelog.c9
-rw-r--r--xlators/features/changelog/src/policy/changelog-policy-default.c1
-rw-r--r--xlators/features/changelog/src/policy/changelog-policy-replication.c6
6 files changed, 34 insertions, 10 deletions
diff --git a/xlators/features/changelog/src/changelog-helpers.h b/xlators/features/changelog/src/changelog-helpers.h
index 656fb7ffa..2412d810e 100644
--- a/xlators/features/changelog/src/changelog-helpers.h
+++ b/xlators/features/changelog/src/changelog-helpers.h
@@ -122,7 +122,7 @@ typedef struct changelog_dispatcher {
struct changelog_bootstrap {
changelog_mode_t mode;
- int (*ctor) (xlator_t *, changelog_dispatcher_t *);
+ int (*ctor) (xlator_t *, changelog_dispatcher_t *, gf_boolean_t);
int (*dtor) (xlator_t *, changelog_dispatcher_t *);
};
@@ -268,6 +268,8 @@ struct changelog_priv {
*/
gf_boolean_t no_gfid_hdr;
+ gf_boolean_t lockless_update;
+
/* to generate unique socket file per brick */
char *changelog_brick;
diff --git a/xlators/features/changelog/src/changelog-rt.c b/xlators/features/changelog/src/changelog-rt.c
index 4e801ae85..91d47e059 100644
--- a/xlators/features/changelog/src/changelog-rt.c
+++ b/xlators/features/changelog/src/changelog-rt.c
@@ -21,7 +21,8 @@
#include "changelog-mem-types.h"
int
-changelog_rt_init (xlator_t *this, changelog_dispatcher_t *cd)
+changelog_rt_init (xlator_t *this,
+ changelog_dispatcher_t *cd, gf_boolean_t lockless_update)
{
changelog_rt_t *crt = NULL;
@@ -30,10 +31,12 @@ changelog_rt_init (xlator_t *this, changelog_dispatcher_t *cd)
if (!crt)
return -1;
+ /* TBD: don't init (and destroy) if lock-less update */
LOCK_INIT (&crt->lock);
cd->cd_data = crt;
- cd->dispatchfn = &changelog_rt_enqueue;
+ cd->dispatchfn = lockless_update ?
+ &changelog_rt_enqueue_lockless : &changelog_rt_enqueue;
return 0;
}
@@ -69,3 +72,12 @@ changelog_rt_enqueue (xlator_t *this,
return ret;
}
+
+int
+changelog_rt_enqueue_lockless (xlator_t *this,
+ changelog_priv_t *priv, void *cbatch,
+ changelog_local_t *local,
+ changelog_log_data_t *cld_0)
+{
+ return changelog_handle_change (this, priv, local, cld_0);
+}
diff --git a/xlators/features/changelog/src/changelog-rt.h b/xlators/features/changelog/src/changelog-rt.h
index 09398041d..634b7473b 100644
--- a/xlators/features/changelog/src/changelog-rt.h
+++ b/xlators/features/changelog/src/changelog-rt.h
@@ -23,12 +23,18 @@ typedef struct changelog_rt {
} changelog_rt_t;
int
-changelog_rt_init (xlator_t *this, changelog_dispatcher_t *cd);
+changelog_rt_init (xlator_t *this,
+ changelog_dispatcher_t *cd, gf_boolean_t lockless_update);
int
changelog_rt_fini (xlator_t *this, changelog_dispatcher_t *cd);
int
changelog_rt_enqueue (xlator_t *this,
changelog_priv_t *priv, void *cbatch,
changelog_local_t *local, changelog_log_data_t *cld_0);
+int
+changelog_rt_enqueue_lockless (xlator_t *this,
+ changelog_priv_t *priv, void *cbatch,
+ changelog_local_t *local,
+ changelog_log_data_t *cld_0);
#endif /* _CHANGELOG_RT_H */
diff --git a/xlators/features/changelog/src/changelog.c b/xlators/features/changelog/src/changelog.c
index 2e01161a9..f152439ab 100644
--- a/xlators/features/changelog/src/changelog.c
+++ b/xlators/features/changelog/src/changelog.c
@@ -1247,16 +1247,17 @@ init (xlator_t *this)
GF_ASSERT (cb_policy[priv->policy].policy == priv->policy);
priv->cp = &cb_policy[priv->policy];
- /* ... now bootstrap the logger */
- ret = priv->cb->ctor (this, &priv->cd);
- if (ret)
- goto out;
/* ... init logging policy */
ret = priv->cp->init_policy (this, priv, priv->cp);
if (ret)
goto out;
+ /* ... now bootstrap the logger */
+ ret = priv->cb->ctor (this, &priv->cd, priv->lockless_update);
+ if (ret)
+ goto out;
+
/* override the value if set */
if (dict_get (this->options, "rollover-time")) {
ret = dict_get_int32 (this->options,
diff --git a/xlators/features/changelog/src/policy/changelog-policy-default.c b/xlators/features/changelog/src/policy/changelog-policy-default.c
index 089bc10e4..eaa3d107f 100644
--- a/xlators/features/changelog/src/policy/changelog-policy-default.c
+++ b/xlators/features/changelog/src/policy/changelog-policy-default.c
@@ -19,6 +19,7 @@ changelog_default_policy_init (xlator_t *this,
priv->rollover_time = 15;
priv->no_gfid_hdr = _gf_false;
+ priv->lockless_update = _gf_false;
cp->cpriv = GF_CALLOC (1, sizeof (off_t),
gf_changelog_mt_fop_policy_t);
diff --git a/xlators/features/changelog/src/policy/changelog-policy-replication.c b/xlators/features/changelog/src/policy/changelog-policy-replication.c
index 536339939..2c54d2cff 100644
--- a/xlators/features/changelog/src/policy/changelog-policy-replication.c
+++ b/xlators/features/changelog/src/policy/changelog-policy-replication.c
@@ -157,7 +157,7 @@ changelog_fix_term(xlator_t *this,
LOCK (&priv->lock);
priv->term = recon_term;
(void) snprintf (crd.crd_changelog_name, PATH_MAX, "%s.%d", JOURNAL_NAME, priv->term);
- crd.crd_prealloc_size = 0;
+ crd.crd_prealloc_size = 1<<29;
if (changelog_open(this, priv, local, &crd) != 0)
return _gf_false;
UNLOCK (&priv->lock);
@@ -1054,7 +1054,7 @@ changelog_replication_cops_open (xlator_t *this,
crd->crd_finale = last;
crd->crd_use_suffix = _gf_false;
- crd->crd_prealloc_size = 1<<10; /* preallocate 1 MB */
+ crd->crd_prealloc_size = 1<<29; /* preallocate 512 MB */
(void) strcpy (crd->crd_changelog_name, name);
@@ -1131,6 +1131,8 @@ changelog_replication_policy_init (xlator_t *this,
/* no record header: extra data (via iobufs) are always persisted */
priv->no_gfid_hdr = _gf_true;
+ priv->lockless_update = _gf_true;
+
memcpy (r_fops, &changelog_default_fops, sizeof (struct xlator_fops));
memcpy (r_cops, &changelog_default_cops, sizeof (struct changelog_ops));