From 0225d7bc712609232d592d48116ec771cd97c2cf Mon Sep 17 00:00:00 2001 From: Venky Shankar Date: Wed, 15 Jan 2014 22:26:27 +0530 Subject: 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 --- xlators/features/changelog/src/changelog-helpers.h | 4 +++- xlators/features/changelog/src/changelog-rt.c | 16 ++++++++++++++-- xlators/features/changelog/src/changelog-rt.h | 8 +++++++- xlators/features/changelog/src/changelog.c | 9 +++++---- .../changelog/src/policy/changelog-policy-default.c | 1 + .../changelog/src/policy/changelog-policy-replication.c | 6 ++++-- 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)); -- cgit