glusterfsd: dump the in-memory graph rather than volfile
Currently we have been printing in the logfile, the volfile verbatim as received from the server. However we perform pre-processing on the graph we receive from the server, like adding ACL translator, applying --xlator-option cli params, etc. So print the serialized in-memory graph as the "volfile" in the log. This can be very handy to double check if certain --xlator-option param actually got applied or not, and in general is showing a "truer" representation of the real graph actually used. Change-Id: I0221dc56e21111b48a1ee3e5fe17a5ef820dc0c6 BUG: 924504 Signed-off-by: Anand Avati <avati@redhat.com> Reviewed-on: http://review.gluster.org/4708 Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Amar Tumballi <amarts@redhat.com>
This commit is contained in:
parent
71cb0ad45b
commit
e701fb2713
@ -1765,7 +1765,7 @@ glusterfs_process_volfp (glusterfs_ctx_t *ctx, FILE *fp)
|
||||
goto out;
|
||||
}
|
||||
|
||||
gf_log_volume_file (fp);
|
||||
gf_log_dump_graph (fp, graph);
|
||||
|
||||
ret = 0;
|
||||
out:
|
||||
|
@ -268,30 +268,101 @@ err:
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
gf_log_volume_file (FILE *specfp)
|
||||
struct xldump {
|
||||
int lineno;
|
||||
FILE *logfp;
|
||||
};
|
||||
|
||||
|
||||
static int
|
||||
nprintf (struct xldump *dump, const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
int ret = 0;
|
||||
|
||||
|
||||
ret += fprintf (dump->logfp, "%3d: ", ++dump->lineno);
|
||||
|
||||
va_start (ap, fmt);
|
||||
ret += vfprintf (dump->logfp, fmt, ap);
|
||||
va_end (ap);
|
||||
|
||||
ret += fprintf (dump->logfp, "\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
xldump_options (dict_t *this, char *key, data_t *value, void *d)
|
||||
{
|
||||
nprintf (d, " option %s %s", key, value->data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
xldump_subvolumes (xlator_t *this, void *d)
|
||||
{
|
||||
xlator_list_t *subv = NULL;
|
||||
int len = 0;
|
||||
char *subvstr = NULL;
|
||||
|
||||
subv = this->children;
|
||||
if (!this->children)
|
||||
return;
|
||||
|
||||
for (subv = this->children; subv; subv = subv->next)
|
||||
len += (strlen (subv->xlator->name) + 1);
|
||||
|
||||
subvstr = GF_CALLOC (1, len, gf_common_mt_strdup);
|
||||
|
||||
len = 0;
|
||||
for (subv = this->children; subv; subv= subv->next)
|
||||
len += sprintf (subvstr + len, "%s%s", subv->xlator->name,
|
||||
subv->next ? " " : "");
|
||||
|
||||
nprintf (d, " subvolumes %s", subvstr);
|
||||
|
||||
GF_FREE (subvstr);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
xldump (xlator_t *each, void *d)
|
||||
{
|
||||
nprintf (d, "volume %s", each->name);
|
||||
nprintf (d, " type %s", each->type);
|
||||
dict_foreach (each->options, xldump_options, d);
|
||||
|
||||
xldump_subvolumes (each, d);
|
||||
|
||||
nprintf (d, "end-volume");
|
||||
nprintf (d, "");
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
gf_log_dump_graph (FILE *specfp, glusterfs_graph_t *graph)
|
||||
{
|
||||
int lcount = 0;
|
||||
char data[GF_UNIT_KB];
|
||||
glusterfs_ctx_t *ctx;
|
||||
struct xldump xld = {0, };
|
||||
|
||||
|
||||
ctx = THIS->ctx;
|
||||
xld.logfp = ctx->log.gf_log_logfile;
|
||||
|
||||
fseek (specfp, 0L, SEEK_SET);
|
||||
|
||||
fprintf (ctx->log.gf_log_logfile, "Given volfile:\n");
|
||||
fprintf (ctx->log.gf_log_logfile, "Final graph:\n");
|
||||
fprintf (ctx->log.gf_log_logfile,
|
||||
"+---------------------------------------"
|
||||
"---------------------------------------+\n");
|
||||
while (fgets (data, GF_UNIT_KB, specfp) != NULL){
|
||||
lcount++;
|
||||
fprintf (ctx->log.gf_log_logfile, "%3d: %s", lcount, data);
|
||||
}
|
||||
|
||||
xlator_foreach_depth_first (graph->top, xldump, &xld);
|
||||
|
||||
fprintf (ctx->log.gf_log_logfile,
|
||||
"\n+---------------------------------------"
|
||||
"+---------------------------------------"
|
||||
"---------------------------------------+\n");
|
||||
fflush (ctx->log.gf_log_logfile);
|
||||
fseek (specfp, 0L, SEEK_SET);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -107,7 +107,7 @@ void gf_global_variable_init(void);
|
||||
|
||||
in_addr_t gf_resolve_ip (const char *hostname, void **dnscache);
|
||||
|
||||
void gf_log_volume_file (FILE *specfp);
|
||||
void gf_log_dump_graph (FILE *specfp, glusterfs_graph_t *graph);
|
||||
void gf_print_trace (int32_t signal, glusterfs_ctx_t *ctx);
|
||||
|
||||
#define VECTORSIZE(count) (count * (sizeof (struct iovec)))
|
||||
|
@ -322,6 +322,24 @@ out:
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
xlator_foreach_depth_first (xlator_t *this,
|
||||
void (*fn)(xlator_t *each, void *data),
|
||||
void *data)
|
||||
{
|
||||
xlator_list_t *subv = NULL;
|
||||
|
||||
subv = this->children;
|
||||
|
||||
while (subv) {
|
||||
xlator_foreach_depth_first (subv->xlator, fn, data);
|
||||
subv = subv->next;
|
||||
}
|
||||
|
||||
fn (this, data);
|
||||
}
|
||||
|
||||
|
||||
xlator_t *
|
||||
xlator_search_by_name (xlator_t *any, const char *name)
|
||||
{
|
||||
|
@ -864,6 +864,11 @@ void xlator_foreach (xlator_t *this,
|
||||
void *data),
|
||||
void *data);
|
||||
|
||||
void xlator_foreach_depth_first (xlator_t *this,
|
||||
void (*fn) (xlator_t *each,
|
||||
void *data),
|
||||
void *data);
|
||||
|
||||
xlator_t *xlator_search_by_name (xlator_t *any, const char *name);
|
||||
xlator_t *xlator_search_by_xl_type (xlator_t *any, const char *type);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user