RETURN(-EALREADY);
}
+ CLASSERT(1 << (CDT_POLICY_SHIFT_COUNT - 1) == CDT_POLICY_LAST);
cdt->cdt_policy = CDT_DEFAULT_POLICY;
cdt->cdt_state = CDT_INIT;
char *name;
char *nickname;
} hsm_policy_names[] = {
- { CDT_NONBLOCKING_RESTORE, "non_blocking_restore", "nbr"},
- { CDT_NORETRY_ACTION, "no_retry_action", "nra"},
+ { CDT_NONBLOCKING_RESTORE, "NonBlockingRestore", "NBR"},
+ { CDT_NORETRY_ACTION, "NoRetryAction", "NRA"},
{ 0 },
};
int i;
for (i = 0; hsm_policy_names[i].bit != 0; i++)
- if (strcmp(hsm_policy_names[i].nickname, name) == 0)
+ if (strcmp(hsm_policy_names[i].nickname, name) == 0 ||
+ strcmp(hsm_policy_names[i].name, name) == 0)
return hsm_policy_names[i].bit;
return 0;
}
/**
* convert a policy bit field to a string
* \param mask [IN] policy bit field
+ * \param hexa [IN] print mask before bit names
* \param buffer [OUT] string
* \param count [IN] size of buffer
* \retval size filled in buffer
*/
-static int hsm_policy_bit2str(const __u64 mask, char *buffer, int count)
+static int hsm_policy_bit2str(const __u64 mask, const bool hexa, char *buffer,
+ int count)
{
int i, j, sz;
char *ptr;
ENTRY;
ptr = buffer;
- sz = snprintf(buffer, count, "("LPX64") ", mask);
- ptr += sz;
- count -= sz;
- for (i = 0; i < (sizeof(mask) * 8); i++) {
+ if (hexa) {
+ sz = snprintf(buffer, count, "("LPX64") ", mask);
+ ptr += sz;
+ count -= sz;
+ }
+ for (i = 0; i < CDT_POLICY_SHIFT_COUNT; i++) {
bit = (1ULL << i);
- if (!(bit & mask))
- continue;
for (j = 0; hsm_policy_names[j].bit != 0; j++) {
- if (hsm_policy_names[j].bit == bit) {
- sz = snprintf(ptr, count, "%s(%s) ",
- hsm_policy_names[j].name,
- hsm_policy_names[j].nickname);
- ptr += sz;
- count -= sz;
+ if (hsm_policy_names[j].bit == bit)
break;
- }
}
+ if (bit & mask)
+ sz = snprintf(ptr, count, "[%s] ",
+ hsm_policy_names[j].name);
+ else
+ sz = snprintf(ptr, count, "%s ",
+ hsm_policy_names[j].name);
+
+ ptr += sz;
+ count -= sz;
}
+ /* remove last ' ' */
+ *ptr = '\0';
+ ptr--;
RETURN(ptr - buffer);
}
int sz;
ENTRY;
- sz = hsm_policy_bit2str(cdt->cdt_policy, page, count);
+ sz = hsm_policy_bit2str(cdt->cdt_policy, false, page, count);
page[sz] = '\n';
sz++;
page[sz] = '\0';
{
struct mdt_device *mdt = data;
struct coordinator *cdt = &mdt->mdt_coordinator;
- int sz;
- char *start, *end;
- __u64 policy;
- int set;
+ char *start, *token, sign;
char *buf;
+ __u64 policy;
+ __u64 add_mask, remove_mask, set_mask;
+ int sz;
+ int rc;
ENTRY;
- if (strncmp(buffer, "help", 4) == 0) {
- sz = PAGE_SIZE;
- OBD_ALLOC(buf, sz);
- if (!buf)
- RETURN(-ENOMEM);
-
- hsm_policy_bit2str(CDT_POLICY_MASK, buf, sz);
- CWARN("Supported policies are: %s\n", buf);
- OBD_FREE(buf, sz);
- RETURN(count);
- }
+ if (count + 1 > PAGE_SIZE)
+ RETURN(-EINVAL);
OBD_ALLOC(buf, count + 1);
if (buf == NULL)
if (copy_from_user(buf, buffer, count))
RETURN(-EFAULT);
-
buf[count] = '\0';
+
start = buf;
+ CDEBUG(D_HSM, "%s: receive new policy: '%s'\n", mdt_obd_name(mdt),
+ start);
- policy = 0;
+ add_mask = remove_mask = set_mask = 0;
do {
- end = strchr(start, ' ');
- if (end != NULL)
- *end = '\0';
- switch (*start) {
+ token = strsep(&start, "\n ");
+ sign = *token;
+
+ if (sign == '\0')
+ continue;
+
+ if (sign == '-' || sign == '+')
+ token++;
+
+ policy = hsm_policy_str2bit(token);
+ if (policy == 0) {
+ char *msg;
+
+ sz = PAGE_SIZE;
+ OBD_ALLOC(msg, sz);
+ if (!msg)
+ RETURN(-ENOMEM);
+
+ hsm_policy_bit2str(0, false, msg, sz);
+ CWARN("%s: '%s' is unknown, "
+ "supported policies are: %s\n", mdt_obd_name(mdt),
+ token, msg);
+ OBD_FREE(msg, sz);
+ GOTO(out, rc = -EINVAL);
+ }
+ switch (sign) {
case '-':
- start++;
- set = 0;
+ remove_mask |= policy;
break;
case '+':
- start++;
- set = 1;
+ add_mask |= policy;
break;
default:
- set = 2;
+ set_mask |= policy;
break;
}
- policy = hsm_policy_str2bit(start);
- if (!policy)
- break;
- switch (set) {
- case 0:
- cdt->cdt_policy &= ~policy;
- break;
- case 1:
- cdt->cdt_policy |= policy;
- break;
- case 2:
- cdt->cdt_policy = policy;
- break;
- }
+ } while (start != NULL);
+
+ CDEBUG(D_HSM, "%s: new policy: rm="LPX64" add="LPX64" set="LPX64"\n",
+ mdt_obd_name(mdt), remove_mask, add_mask, set_mask);
- start = end + 1;
- } while (end != NULL);
+ /* if no sign in all string, it is a clear and set
+ * if some sign found, all unsigned are converted
+ * to add
+ * P1 P2 = set to P1 and P2
+ * P1 -P2 = add P1 clear P2 same as +P1 -P2
+ */
+ if (remove_mask == 0 && add_mask == 0) {
+ cdt->cdt_policy = set_mask;
+ } else {
+ cdt->cdt_policy |= set_mask | add_mask;
+ cdt->cdt_policy &= ~remove_mask;
+ }
+
+ GOTO(out, rc = count);
+
+out:
OBD_FREE(buf, count + 1);
- RETURN(count);
+ RETURN(rc);
}
#define GENERATE_PROC_METHOD(VAR) \
cleanup() {
copytool_cleanup
changelog_cleanup
+ cdt_set_sanity_policy
}
search_and_kill_copytool() {
}
cdt_set_sanity_policy() {
- # clear all
- do_facet $SINGLEMDS $LCTL set_param $HSM_PARAM.policy=-nra
- do_facet $SINGLEMDS $LCTL set_param $HSM_PARAM.policy=-nbr
- do_facet $SINGLEMDS $LCTL set_param $HSM_PARAM.policy=-gc
+ if [[ "$CDT_POLICY_HAD_CHANGED" ]]
+ then
+ # clear all
+ do_facet $SINGLEMDS $LCTL set_param $HSM_PARAM.policy=+NRA
+ do_facet $SINGLEMDS $LCTL set_param $HSM_PARAM.policy=-NBR
+ CDT_POLICY_HAD_CHANGED=
+ fi
}
cdt_set_no_retry() {
- do_facet $SINGLEMDS $LCTL set_param $HSM_PARAM.policy=+nra
+ do_facet $SINGLEMDS $LCTL set_param $HSM_PARAM.policy=+NRA
+ CDT_POLICY_HAD_CHANGED=true
}
cdt_clear_no_retry() {
- do_facet $SINGLEMDS $LCTL set_param $HSM_PARAM.policy=-nra
+ do_facet $SINGLEMDS $LCTL set_param $HSM_PARAM.policy=-NRA
+ CDT_POLICY_HAD_CHANGED=true
}
-cdt_set_no_blocking_restore() {
- do_facet $SINGLEMDS $LCTL set_param $HSM_PARAM.policy=+nbr
+cdt_set_non_blocking_restore() {
+ do_facet $SINGLEMDS $LCTL set_param $HSM_PARAM.policy=+NBR
+ CDT_POLICY_HAD_CHANGED=true
}
-cdt_clear_no_blocking_restore() {
- do_facet $SINGLEMDS $LCTL set_param $HSM_PARAM.policy=-nbr
+cdt_clear_non_blocking_restore() {
+ do_facet $SINGLEMDS $LCTL set_param $HSM_PARAM.policy=-NBR
+ CDT_POLICY_HAD_CHANGED=true
}
cdt_clear_mount_state() {
echo "Start copytool"
copytool_setup
+echo "Set sanity-hsm HSM policy"
+cdt_set_sanity_policy
+
# finished requests are quickly removed from list
set_hsm_param grace_delay 10
}
run_test 107 "Copytool re-register after MDS restart"
+policy_set_and_test()
+{
+ local change="$1"
+ local target="$2"
+ do_facet $SINGLEMDS $LCTL set_param "$HSM_PARAM.policy=\\\"$change\\\""
+ local policy=$(do_facet $SINGLEMDS $LCTL get_param -n $HSM_PARAM.policy)
+ [[ "$policy" == "$target" ]] ||
+ error "Wrong policy after '$change': '$policy' != '$target'"
+}
+
+test_109() {
+ # to force default policy setting if error
+ CDT_POLICY_HAD_CHANGED=true
+
+ local policy=$(do_facet $SINGLEMDS $LCTL get_param -n $HSM_PARAM.policy)
+ local default="NonBlockingRestore [NoRetryAction]"
+ [[ "$policy" == "$default" ]] ||
+ error "default policy has changed,"\
+ " '$policy' != '$default' update the test"
+ policy_set_and_test "+NBR" "[NonBlockingRestore] [NoRetryAction]"
+ policy_set_and_test "+NRA" "[NonBlockingRestore] [NoRetryAction]"
+ policy_set_and_test "-NBR" "NonBlockingRestore [NoRetryAction]"
+ policy_set_and_test "-NRA" "NonBlockingRestore NoRetryAction"
+ policy_set_and_test "NRA NBR" "[NonBlockingRestore] [NoRetryAction]"
+ # useless bacause we know but safer for futur changes to use real value
+ local policy=$(do_facet $SINGLEMDS $LCTL get_param -n $HSM_PARAM.policy)
+ echo "Next set_param must failed"
+ policy_set_and_test "wrong" "$policy"
+
+ # return to default
+ echo "Back to default policy"
+ cdt_set_sanity_policy
+}
+run_test 109 "Policy display/change"
+
test_110a() {
# test needs a running copytool
copytool_setup
import_file $tdir/$tfile $f
local fid=$(path2fid $f)
- cdt_set_no_blocking_restore
+ cdt_set_non_blocking_restore
md5sum $f
local st=$?
# cleanup
wait_request_state $fid RESTORE SUCCEED
- cdt_clear_no_blocking_restore
+ cdt_clear_non_blocking_restore
# Test result
[[ $st == 1 ]] ||
wait_request_state $fid ARCHIVE SUCCEED
$LFS hsm_release $f
- cdt_set_no_blocking_restore
+ cdt_set_non_blocking_restore
md5sum $f
local st=$?
# cleanup
wait_request_state $fid RESTORE SUCCEED
- cdt_clear_no_blocking_restore
+ cdt_clear_non_blocking_restore
# Test result
[[ $st == 1 ]] ||