Skip to content

Commit

Permalink
rpmem: remove all remaining parts on remote node
Browse files Browse the repository at this point in the history
Remove all existing part files on remote node even if one of them is
missing.

Ref: pmem/issues#599
  • Loading branch information
plebioda committed Feb 15, 2018
1 parent 91158da commit 0d128ae
Show file tree
Hide file tree
Showing 6 changed files with 116 additions and 60 deletions.
4 changes: 3 additions & 1 deletion src/test/pmempool_rm_remote/TEST1
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/usr/bin/env bash
#
# Copyright 2017, Intel Corporation
# Copyright 2017-2018, Intel Corporation
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
Expand Down Expand Up @@ -84,6 +84,8 @@ check_no_files_on_node 0 test_part_remote2

expect_abnormal_exit run_on_node 1 ../pmempool rm ${NODE_DIR[1]}$TEST_SET_LOCAL 1>> $OUT 2>&1

check_no_files_on_node 0 test_part_remote0 test_part_remote1 test_part_remote2 test_part_remote3

check_local

pass
91 changes: 91 additions & 0 deletions src/test/pmempool_rm_remote/TEST2
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
#!/usr/bin/env bash
#
# Copyright 2017-2018, Intel Corporation
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in
# the documentation and/or other materials provided with the
# distribution.
#
# * Neither the name of the copyright holder nor the names of its
# contributors may be used to endorse or promote products derived
# from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
#
# pmempool_rm_remotie/TEST2 -- test for cli rm command with remote replica
#
export UNITTEST_NAME=pmempool_rm_remote/TEST2
export UNITTEST_NUM=2

. ../unittest/unittest.sh

require_test_type medium

require_fs_type any

setup

require_nodes 2

require_node_libfabric 0 $RPMEM_PROVIDER
require_node_libfabric 1 $RPMEM_PROVIDER

init_rpmem_on_node 1 0

OUT=stdout${UNITTEST_NUM}.log

# define files and directories
TEST_SET_LOCAL="testset_local"
TEST_SET_REMOTE="testset_remote"

# create and upload poolset files
create_poolset $DIR/$TEST_SET_LOCAL 20M:${NODE_DIR[1]}test_part0:x 20M:${NODE_DIR[1]}test_part1:x \
20M:${NODE_DIR[1]}test_part2:x 20M:${NODE_DIR[1]}test_part3:x \
m ${NODE_ADDR[0]}:$TEST_SET_REMOTE
create_poolset $DIR/$TEST_SET_REMOTE 20M:${NODE_DIR[0]}/test_part_remote0:x 20M:${NODE_DIR[0]}test_part_remote1:x \
20M:${NODE_DIR[0]}test_part_remote2:x 20M:${NODE_DIR[0]}test_part_remote3:x

copy_files_to_node 0 ${NODE_DIR[0]} $DIR/$TEST_SET_REMOTE
copy_files_to_node 1 ${NODE_DIR[1]} $DIR/$TEST_SET_LOCAL

rm_files_from_node 0 ${NODE_DIR[0]}test_part_remote0 ${NODE_DIR[0]}test_part_remote1 \
${NODE_DIR[0]}test_part_remote2 ${NODE_DIR[0]}test_part_remote3
rm_files_from_node 1 ${NODE_DIR[1]}test_part0 ${NODE_DIR[1]}test_part1 \
${NODE_DIR[1]}test_part2 ${NODE_DIR[1]}test_part3

expect_normal_exit run_on_node 1 ../pmempool create obj ${NODE_DIR[1]}$TEST_SET_LOCAL

check_files_on_node 0 $TEST_SET_REMOTE test_part_remote0 \
test_part_remote1 test_part_remote2 test_part_remote3
check_files_on_node 1 $TEST_SET_LOCAL test_part0 test_part1 test_part2 test_part3

# remove one part
rm_files_from_node 0 ${NODE_DIR[0]}test_part_remote2
check_no_files_on_node 0 test_part_remote2

expect_normal_exit run_on_node 1 ../pmempool rm -f ${NODE_DIR[1]}$TEST_SET_LOCAL 1>> $OUT 2>&1

check_no_files_on_node 0 test_part_remote0 test_part_remote1 test_part_remote2 test_part_remote3

check_local

pass
1 change: 0 additions & 1 deletion src/test/rpmemd_db/rpmemd0.log.match

This file was deleted.

1 change: 0 additions & 1 deletion src/test/rpmemd_db/rpmemd1.log.match
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,3 @@ duplicate found in pool set file -- $(nW)/pool$(N).set: File exists
cannot create pool set -- '$(nW)pool1.set': Resource temporarily unavailable
cannot create pool set -- '$(nW)pool1.set': File exists
cannot create pool set -- '$(nW)pool1.set': File exists
removing '$(nW)pool0.set' failed: Invalid argument
23 changes: 0 additions & 23 deletions src/test/rpmemd_db/rpmemd_db_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -607,29 +607,6 @@ test_remove(const char *root_dir, const char *pool_desc)
ret = util_poolset_foreach_part(path, noexists_cb, NULL);
UT_ASSERTeq(ret, 0);

prp = rpmemd_db_pool_create(db, pool_desc, 0, &attr);
UT_ASSERTne(prp, NULL);

struct pool_hdr *pool_hdr = prp->pool_addr;
const char *uuid = (char *)pool_hdr->poolset_uuid;
const size_t uuid_size = sizeof(pool_hdr->poolset_uuid);
strncpy((char *)uuid, "ERROR", uuid_size);
util_persist_auto(prp->set->replica[0]->part[0].is_dev_dax, uuid,
uuid_size);
rpmemd_db_pool_close(db, prp);

ret = rpmemd_db_pool_remove(db, pool_desc, 0, 0);
UT_ASSERTne(ret, 0);

ret = util_poolset_foreach_part(path, exists_cb, NULL);
UT_ASSERTeq(ret, 0);

ret = rpmemd_db_pool_remove(db, pool_desc, 1, 0);
UT_ASSERTeq(ret, 0);

ret = util_poolset_foreach_part(path, noexists_cb, NULL);
UT_ASSERTeq(ret, 0);

prp = rpmemd_db_pool_create(db, pool_desc, 0, &attr);
UT_ASSERTne(prp, NULL);
rpmemd_db_pool_close(db, prp);
Expand Down
56 changes: 22 additions & 34 deletions src/tools/rpmemd/rpmemd_db.c
Original file line number Diff line number Diff line change
Expand Up @@ -366,18 +366,29 @@ rpmemd_db_pool_set_attr(struct rpmemd_db_pool *prp,
return util_replica_set_attr(prp->set->replica[0], rattr);
}

struct rm_cb_args {
int force;
int ret;
};

/*
* rm_poolset_cb -- (internal) callback for removing part files
*/
static int
rm_poolset_cb(struct part_file *pf, void *arg)
{
struct rm_cb_args *args = (struct rm_cb_args *)arg;
if (pf->is_remote) {
RPMEMD_LOG(ERR, "removing remote replica not supported");
return -1;
}

util_unlink(pf->path);
int ret = util_unlink(pf->path);
if (!args->force && ret) {
RPMEMD_LOG(ERR, "!unlink -- '%s'", pf->path);
args->ret = ret;
}

return 0;
}

Expand All @@ -393,45 +404,22 @@ rpmemd_db_pool_remove(struct rpmemd_db *db, const char *pool_desc,

util_mutex_lock(&db->lock);

struct pool_set *set;
struct rm_cb_args args;
args.force = force;
args.ret = 0;
char *path;
int ret = 0;

path = rpmemd_db_get_path(db, pool_desc);
if (!path) {
ret = -1;
args.ret = -1;
goto err_unlock;
}

if (force) {
ret = util_poolset_foreach_part(path, rm_poolset_cb, NULL);
if (ret) {
RPMEMD_LOG(ERR, "!removing '%s' failed", path);
goto err_free_path;
}
} else {
struct rpmem_pool_attr rattr;
ret = util_pool_open_remote(&set, path, 0, RPMEM_MIN_PART,
&rattr);
if (ret) {
RPMEMD_LOG(ERR, "!removing '%s' failed", path);
goto err_free_path;
}

for (unsigned r = 0; r < set->nreplicas; r++) {
for (unsigned p = 0; p < set->replica[r]->nparts; p++) {
const char *part_file =
set->replica[r]->part[p].path;
ret = util_unlink(part_file);
if (ret) {
RPMEMD_LOG(ERR, "!unlink -- '%s'",
part_file);
}
}
}

util_poolset_close(set, DO_NOT_DELETE_PARTS);

int ret = util_poolset_foreach_part(path, rm_poolset_cb, &args);
if (!force && ret) {
RPMEMD_LOG(ERR, "!removing '%s' failed", path);
args.ret = ret;
goto err_free_path;
}

if (pool_set)
Expand All @@ -441,7 +429,7 @@ rpmemd_db_pool_remove(struct rpmemd_db *db, const char *pool_desc,
free(path);
err_unlock:
util_mutex_unlock(&db->lock);
return ret;
return args.ret;
}

/*
Expand Down

0 comments on commit 0d128ae

Please sign in to comment.