#!/usr/bin/env bash
# SPDX-License-Identifier: BSD-3-Clause
# Copyright 2018-2019, Intel Corporation
#
#
# pmempool_sync_remote/TEST30 -- pmempool sync with remote replication
#                                and bad block recovery files:
#                                - the pool consists of 3 parts
#                                - bad block in all parts: offset: 0 length: 8*512
#

. ../unittest/unittest.sh

require_test_type medium
require_fs_type any
require_build_type debug nondebug
require_linked_with_ndctl $PMEMPOOL$EXESUFFIX

require_nodes 2

setup

require_node_libfabric 0 $RPMEM_PROVIDER
require_node_libfabric 1 $RPMEM_PROVIDER

init_rpmem_on_node 0 1

require_node_log_files 0 pmemobj$UNITTEST_NUM.log
require_node_log_files 0 pmempool$UNITTEST_NUM.log

LAYOUT="layout"
LOG=out${UNITTEST_NUM}.log
rm -f $LOG && touch $LOG

POOLSET_LOCAL="local_pool.set"
POOLSET_REMOTE="remote_pool.set"
RECOVERY_FILE_P0=$DIR/${POOLSET_LOCAL}_r0_p0_badblocks.txt
RECOVERY_FILE_P1=$DIR/${POOLSET_LOCAL}_r0_p1_badblocks.txt
RECOVERY_FILE_P2=$DIR/${POOLSET_LOCAL}_r0_p2_badblocks.txt

create_poolset $DIR/$POOLSET_LOCAL \
	8M:${NODE_DIR[0]}/pool.local.part.0:x \
	8M:${NODE_DIR[0]}/pool.local.part.1:x \
	8M:${NODE_DIR[0]}/pool.local.part.2:x \
	M \
	${NODE_ADDR[1]}:$POOLSET_REMOTE

create_poolset $DIR/$POOLSET_REMOTE \
	24M:${NODE_DIR[1]}/pool.remote:x

# create the recovery files with bad block
create_recovery_file_absolute $RECOVERY_FILE_P0 0 4096
create_recovery_file_absolute $RECOVERY_FILE_P1 0 4096
create_recovery_file_absolute $RECOVERY_FILE_P2 0 4096

copy_files_to_node 0 ${NODE_DIR[0]} $DIR/$POOLSET_LOCAL
copy_files_to_node 1 ${NODE_DIR[1]} $DIR/$POOLSET_REMOTE

expect_normal_exit run_on_node 0 ../pmempool rm -sf ${NODE_DIR[0]}$POOLSET_LOCAL
expect_normal_exit run_on_node 0 "../obj_verify ${NODE_DIR[0]}$POOLSET_LOCAL $LAYOUT c v &>> $LOG"

# inject bad blocks
expect_normal_exit run_on_node 0 "dd if=/dev/zero of=${NODE_DIR[0]}/pool.local.part.0 bs=512 seek=0 count=8 conv=notrunc status=none"
expect_normal_exit run_on_node 0 "dd if=/dev/zero of=${NODE_DIR[0]}/pool.local.part.1 bs=512 seek=0 count=8 conv=notrunc status=none"
expect_normal_exit run_on_node 0 "dd if=/dev/zero of=${NODE_DIR[0]}/pool.local.part.2 bs=512 seek=0 count=8 conv=notrunc status=none"

# copy the recovery files
copy_files_to_node 0 ${NODE_DIR[0]} $RECOVERY_FILE_P0 $RECOVERY_FILE_P1 $RECOVERY_FILE_P2

expect_abnormal_exit run_on_node 0 "../obj_verify ${NODE_DIR[0]}$POOLSET_LOCAL $LAYOUT v &>> $LOG"
expect_normal_exit run_on_node 0 "../pmempool sync -b -v ${NODE_DIR[0]}$POOLSET_LOCAL &>> $LOG"
expect_normal_exit run_on_node 0 "../obj_verify ${NODE_DIR[0]}$POOLSET_LOCAL $LAYOUT v &>> $LOG"

pass
