Skip to content

Commit

Permalink
Parse mclass_policies section first.
Browse files Browse the repository at this point in the history
  • Loading branch information
Neelima Premsankar committed Jul 6, 2020
1 parent 8e334c5 commit 1b9bcff
Show file tree
Hide file tree
Showing 4 changed files with 95 additions and 33 deletions.
33 changes: 20 additions & 13 deletions src/kvdb/kvdb_rparams.c
Original file line number Diff line number Diff line change
Expand Up @@ -340,20 +340,20 @@ struct kvdb_rparams kvdb_rp_dt_defaults;
merr_t
kvdb_rparams_add_to_dt(const char *mp_name, struct kvdb_rparams *p)
{
int i;
int num_elems = NELEM(kvdb_rp_table);
size_t param_sz;
int i;
int num_elems = NELEM(kvdb_rp_table);

if (!mp_name || !p)
return merr(ev(EINVAL));

kvdb_rp_dt_defaults = kvdb_rparams_defaults();

for (i = 0; i < num_elems - 1; i++) {
bool writable = false;
size_t offset = kvdb_rp_table[i].pi_value - (void *)&kvdb_rp_ref;
char param_name[DT_PATH_ELEMENT_LEN];
int wx;
bool writable = false;
size_t offset = kvdb_rp_table[i].pi_value - (void *)&kvdb_rp_ref;
char param_name[DT_PATH_ELEMENT_LEN];
param_show_t *param_showp;
int wx;

get_param_name(i, param_name, sizeof(param_name));

Expand All @@ -365,9 +365,9 @@ kvdb_rparams_add_to_dt(const char *mp_name, struct kvdb_rparams *p)
}
}

param_sz = kvdb_rp_table[i].pi_type.param_size;
param_showp = kvdb_rp_table[i].pi_type.param_val_to_str;

if (param_sz == sizeof(u32)) {
if (param_showp == show_u32) {
CFG_U32(
mp_name,
param_name,
Expand All @@ -376,7 +376,7 @@ kvdb_rparams_add_to_dt(const char *mp_name, struct kvdb_rparams *p)
NULL,
p,
writable);
} else if (param_sz == sizeof(u64)) {
} else if (param_showp == show_u64) {
CFG_U64(
mp_name,
param_name,
Expand All @@ -385,10 +385,17 @@ kvdb_rparams_add_to_dt(const char *mp_name, struct kvdb_rparams *p)
NULL,
p,
writable);
} else if (param_showp == show_string) {
CFG_STR(
mp_name,
param_name,
(void *)p + offset,
kvdb_rp_table[i].pi_type.param_size,
(void *)&kvdb_rp_dt_defaults + offset,
NULL,
p,
writable);
} else {
/* All kvdb rparams are u32/u64 right now.
* Change as necessary if you add a new type.
*/
return merr(ev(EINVAL));
}
}
Expand Down
21 changes: 21 additions & 0 deletions src/kvdb/test/wp_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -398,6 +398,7 @@ MTF_DEFINE_UTEST(wp, parser_kvs_section)
ASSERT_EQ(result, NULL);
hse_params_destroy(params);

/* simple mclass_policy is defined at the beginning before it used in kvs section */
rc = snprintf(
profile,
sizeof(profile),
Expand All @@ -416,6 +417,26 @@ MTF_DEFINE_UTEST(wp, parser_kvs_section)
ASSERT_NE(result, NULL);
ASSERT_EQ(strcmp(result, "simple"), 0);
hse_params_destroy(params);

/* simple mclass_policy is defined at the end after it is used in kvs section */
rc = snprintf(
profile,
sizeof(profile),
"%s%s",
"kvs.kvs_test:\n"
" mclass_policy: simple\n",
policy);
ASSERT_LT(rc, sizeof(profile));
write_to_file(profile);

hse_params_create(&params);
err = wp_parse(path, params, WP_FILE);
ASSERT_EQ(err, NULL);

result = hse_params_get(params, "kvs.kvs_test.mclass_policy", buf, sizeof(buf), 0);
ASSERT_NE(result, NULL);
ASSERT_EQ(strcmp(result, "simple"), 0);
hse_params_destroy(params);
}

MTF_DEFINE_UTEST(wp, parser_mclass_policies_section)
Expand Down
48 changes: 40 additions & 8 deletions src/kvdb/wp.c
Original file line number Diff line number Diff line change
Expand Up @@ -81,12 +81,11 @@ char last_map[128];

/* Parser Helper Functions */

static yaml_node_t *
static yaml_node_pair_t *
wp_parser_find_field(yaml_document_t *doc, yaml_node_t *node, char *field)
{
int match;
yaml_node_t * key;
yaml_node_t * value;
yaml_node_pair_t *start;
yaml_node_pair_t *top;

Expand All @@ -98,13 +97,12 @@ wp_parser_find_field(yaml_document_t *doc, yaml_node_t *node, char *field)

for (; start < top; start++) {
key = yaml_document_get_node(doc, start->key);
value = yaml_document_get_node(doc, start->value);
if (!key || !value)
if (!key)
continue;

match = !strcmp(field, (const char *)key->data.scalar.value);
if (match)
return value;
return start;
}

return NULL;
Expand All @@ -113,7 +111,8 @@ wp_parser_find_field(yaml_document_t *doc, yaml_node_t *node, char *field)
static int
wp_parser_get_api_version(struct hse_params *params, yaml_document_t *doc, yaml_node_t *root)
{
yaml_node_t *node;
yaml_node_pair_t *node;
yaml_node_t * value;

node = wp_parser_find_field(doc, root, "api_version");
if (!node) {
Expand All @@ -122,7 +121,11 @@ wp_parser_get_api_version(struct hse_params *params, yaml_document_t *doc, yaml_
return -1;
}

return atoi((const char *)node->data.scalar.value);
value = yaml_document_get_node(doc, node->value);
if (!value)
return -1;

return atoi((const char *)value->data.scalar.value);
}

static merr_t
Expand Down Expand Up @@ -493,18 +496,42 @@ wp_parser_validate_mclass(
return err;
}

static merr_t
wp_parser_parse_mclass(struct hse_params *params, yaml_document_t *doc, yaml_node_t *root)
{
yaml_node_pair_t *node;
merr_t err;

struct wp_validation valid_fields[] = {
WP_VALIDATE_GENERIC("mclass_policies", wp_parser_validate_mclass, true),
};

node = wp_parser_find_field(doc, root, "mclass_policies");
if (!node)
return 0;

err = wp_parser_check_pair(params, doc, node, valid_fields, 1);
if (ev(err))
return err;

return 0;
}

static merr_t
wp_parser_validate_root(struct hse_params *params, yaml_document_t *doc, yaml_node_t *node)
{
int entries;
merr_t err;

/*
* mclass_policies and api_version sections have already been validated.
*/
struct wp_validation valid_fields[] = {
WP_VALIDATE_NONE("api_version", true),
WP_VALIDATE_NONE("apiVersion", true),
WP_VALIDATE_GENERIC("kvdb", wp_parser_validate_params, true),
WP_VALIDATE_GENERIC("kvs", wp_parser_validate_params, false),
WP_VALIDATE_GENERIC("mclass_policies", wp_parser_validate_mclass, true),
WP_VALIDATE_NONE("mclass_policies", true),
};

if (ev(node->type != YAML_MAPPING_NODE))
Expand Down Expand Up @@ -573,6 +600,11 @@ wp_parser_exec(const char *profile, size_t size, struct hse_params *params, int
apiVersion = wp_parser_get_api_version(params, &doc, root);
switch (apiVersion) {
case 1:
err = wp_parser_parse_mclass(params, &doc, root);
if (ev(err)) {
hse_log(HSE_ERR "wp_parser: failed to parse mclass_policies");
goto err1;
}
err = wp_parser_validate_root(params, &doc, root);
if (ev(err)) {
hse_log(HSE_ERR "wp_parser: failed to parse");
Expand Down
26 changes: 14 additions & 12 deletions src/kvs/kvs_rparams.c
Original file line number Diff line number Diff line change
Expand Up @@ -408,10 +408,9 @@ kvs_rparams_remove_from_dt(const char *mpool, const char *kvs)
merr_t
kvs_rparams_add_to_dt(const char *mpool, const char *kvs, struct kvs_rparams *p)
{
int i;
int num_elems = NELEM(kvs_rp_table);
char path[3 * (DT_PATH_ELEMENT_LEN + 1)];
size_t param_sz = 0;
int i;
int num_elems = NELEM(kvs_rp_table);
char path[3 * (DT_PATH_ELEMENT_LEN + 1)];

if (!mpool || !kvs || !p)
return merr_errno(merr(ev(EINVAL)));
Expand All @@ -421,10 +420,11 @@ kvs_rparams_add_to_dt(const char *mpool, const char *kvs, struct kvs_rparams *p)
snprintf(path, sizeof(path), "%s/%s", mpool, kvs);

for (i = 0; i < num_elems - 1; i++) {
bool writable = false;
size_t offset = kvs_rp_table[i].pi_value - (void *)&kvs_rp_ref;
char param_name[DT_PATH_ELEMENT_LEN];
int wx;
bool writable = false;
size_t offset = kvs_rp_table[i].pi_value - (void *)&kvs_rp_ref;
char param_name[DT_PATH_ELEMENT_LEN];
param_show_t *param_showp;
int wx;

get_param_name(i, param_name, sizeof(param_name));

Expand All @@ -436,9 +436,9 @@ kvs_rparams_add_to_dt(const char *mpool, const char *kvs, struct kvs_rparams *p)
}
}

param_sz = kvs_rp_table[i].pi_type.param_size;
param_showp = kvs_rp_table[i].pi_type.param_val_to_str;

if (param_sz == sizeof(u32)) {
if (param_showp == show_u32) {
CFG_U32(
path,
param_name,
Expand All @@ -447,7 +447,7 @@ kvs_rparams_add_to_dt(const char *mpool, const char *kvs, struct kvs_rparams *p)
NULL,
p,
writable);
} else if (param_sz == sizeof(u64)) {
} else if (param_showp == show_u64) {
CFG_U64(
path,
param_name,
Expand All @@ -456,7 +456,7 @@ kvs_rparams_add_to_dt(const char *mpool, const char *kvs, struct kvs_rparams *p)
NULL,
p,
writable);
} else {
} else if (param_showp == show_string) {
CFG_STR(
path,
param_name,
Expand All @@ -466,6 +466,8 @@ kvs_rparams_add_to_dt(const char *mpool, const char *kvs, struct kvs_rparams *p)
NULL,
p,
writable);
} else {
return merr(ev(EINVAL));
}
}

Expand Down

0 comments on commit 1b9bcff

Please sign in to comment.