You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
$ irule -r irods_rule_engine_plugin-unified_storage_tiering-instance -F example_unified_tiering_invocation.r
$ iqstat
id name
10041 {"rule-engine-operation":"irods_policy_storage_tiering","storage-tier-groups":["example_group_g2","example_group"]}
Expected behavior
I expected the tier out to occur with no errors or issues.
Observed behavior (including steps to reproduce, if applicable)
After a while, 3 migrations are scheduled:
$ iqstat
id name
10042 {"delay_conditions":"<INST_NAME>irods_rule_engine_plugin-unified_storage_tiering-instance</INST_NAME><EF>60s DOUBLE UNTIL SUCCESS OR 5 TIMES</EF><PLUSET>16s</PLUSET>","destination-resource":"repl2","group-name":"example_group","md5":"130409f4c26e9054a7e99870855e9b8b","object-path":"/tempZone/home/rods/foo","preserve-replicas":false,"rule-engine-instance-name":"irods_rule_engine_plugin-unified_storage_tiering-instance","rule-engine-operation":"irods_policy_data_movement","source-replica-number":"0","source-resource":"repl1","user-name":"rods","verification-type":"catalog"}
10043 {"delay_conditions":"<INST_NAME>irods_rule_engine_plugin-unified_storage_tiering-instance</INST_NAME><EF>60s DOUBLE UNTIL SUCCESS OR 5 TIMES</EF><PLUSET>22s</PLUSET>","destination-resource":"repl2","group-name":"example_group","md5":"4274ed5655c75052412bc44e691bdedd","object-path":"/tempZone/home/rods/foo","preserve-replicas":false,"rule-engine-instance-name":"irods_rule_engine_plugin-unified_storage_tiering-instance","rule-engine-operation":"irods_policy_data_movement","source-replica-number":"2","source-resource":"repl1","user-name":"rods","verification-type":"catalog"}
10044 {"delay_conditions":"<INST_NAME>irods_rule_engine_plugin-unified_storage_tiering-instance</INST_NAME><EF>60s DOUBLE UNTIL SUCCESS OR 5 TIMES</EF><PLUSET>21s</PLUSET>","destination-resource":"repl2","group-name":"example_group","md5":"a55f702cdaa627c7d7a6b294cc04d0fb","object-path":"/tempZone/home/rods/foo","preserve-replicas":false,"rule-engine-instance-name":"irods_rule_engine_plugin-unified_storage_tiering-instance","rule-engine-operation":"irods_policy_data_movement","source-replica-number":"1","source-resource":"repl1","user-name":"rods","verification-type":"catalog"}
$ iqstat
id name
10042 {"delay_conditions":"<INST_NAME>irods_rule_engine_plugin-unified_storage_tiering-instance</INST_NAME><EF>60s DOUBLE UNTIL SUCCESS OR 5 TIMES</EF><PLUSET>16s</PLUSET>","destination-resource":"repl2","group-name":"example_group","md5":"130409f4c26e9054a7e99870855e9b8b","object-path":"/tempZone/home/rods/foo","preserve-replicas":false,"rule-engine-instance-name":"irods_rule_engine_plugin-unified_storage_tiering-instance","rule-engine-operation":"irods_policy_data_movement","source-replica-number":"0","source-resource":"repl1","user-name":"rods","verification-type":"catalog"}
10043 {"delay_conditions":"<INST_NAME>irods_rule_engine_plugin-unified_storage_tiering-instance</INST_NAME><EF>60s DOUBLE UNTIL SUCCESS OR 5 TIMES</EF><PLUSET>22s</PLUSET>","destination-resource":"repl2","group-name":"example_group","md5":"4274ed5655c75052412bc44e691bdedd","object-path":"/tempZone/home/rods/foo","preserve-replicas":false,"rule-engine-instance-name":"irods_rule_engine_plugin-unified_storage_tiering-instance","rule-engine-operation":"irods_policy_data_movement","source-replica-number":"2","source-resource":"repl1","user-name":"rods","verification-type":"catalog"}
...and a bunch of errors in the log. The first errors have to do with duplicate entries in the catalog:
"apply_policy_for_tier_group :: no resources found for group [example_group_g2]""chlRegReplica cmlExecuteNoAnswerSql(insert) failure -819000""chlRegReplica cmlExecuteNoAnswerSql(rollback) succeeded""[filePathRegRepl] - failed to register replica for [/tempZone/home/rods/foo], status:[-819000]""[create_new_replica:361] - failed to register physical path [error_code=[-819000], path=[/tempZone/home/rods/foo], hierarchy=[repl2;ufs4]""[filePathRegRepl] - failed to register replica for [/tempZone/home/rods/foo], status:[-46000]""[create_new_replica:361] - failed to register physical path [error_code=[-46000], path=[/tempZone/home/rods/foo], hierarchy=[repl2;ufs4]""[replicate_data_object:777] - failed to replicate [/tempZone/home/rods/foo]""rsDataObjRepl - Failed to replicate data object. status:[-46000]""[replicate_data_object:777] - failed to replicate [/tempZone/home/rods/foo]""rsDataObjRepl - Failed to replicate data object. status:[-819000]""[-] /irods_plugin_source/libirods_rule_engine_plugin-unified_storage_tiering.cpp:753:irods::error exec_rule_expression(irods::default_re_ctx &, const std::string &, msParamArray_t *, irods::callback) : status [SYS_COPY_ALREADY_IN_RESC] errno [] -- message [iRODS Exception: file: /irods_plugin_source/libirods_rule_engine_plugin-unified_storage_tiering.cpp function: void (anonymous namespace)::replicate_object_to_resource(rcComm_t *, const std::string &, const std::string &, const std::string &, const std::string &) line: 110 code: -46000 (SYS_COPY_ALREADY_IN_RESC) message: failed to migrate [/tempZone/home/rods/foo] to [repl2]stack trace:-------------- 0# irods::stacktrace::dump() const in /lib/libirods_common.so.4.3.1 1# irods::exception::assemble_full_display_what() const in /lib/libirods_common.so.4.3.1 2# irods::exception::what() const in /lib/libirods_common.so.4.3.1 3# exec_rule_expression(std::__1::tuple<>&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, MsParamArray*, irods::callback) in /usr/lib/irods/plugins/rule_engines/libirods_rule_engine_plugin-unified_storage_tiering.so 4# std::__1::__function::__func<irods::error (*)(std::__1::tuple<>&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, MsParamArray*, irods::callback), std::__1::allocator<irods::error (*)(std::__1::tuple<>&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, MsParamArray*, irods::callback)>, irods::error (std::__1::tuple<>&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, MsParamArray*, irods::callback)>::operator()(std::__1::tuple<>&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, MsParamArray*&&, irods::callback&&) in /usr/lib/irods/plugins/rule_engines/libirods_rule_engine_plugin-unified_storage_tiering.so 5# irods::pluggable_rule_engine<std::__1::tuple<> >::exec_rule_expression(std::__1::tuple<>&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, MsParamArray*, irods::callback) in /lib/libirods_server.so.4.3.1 6# irods::rule_engine_context_manager<std::__1::tuple<>, RuleExecInfo*, (irods::rule_execution_manager_pack)0>::exec_rule_expression(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, MsParamArray*) in /lib/libirods_server.so.4.3.1 7# rsExecRuleExpression(RsComm*, ExecRuleExpression*) in /lib/libirods_server.so.4.3.1 8# irods::api_call_adaptor<ExecRuleExpression*>::operator()(irods::plugin_context&, RsComm*, ExecRuleExpression*) in /lib/libirods_server.so.4.3.1 9# std::__1::__function::__func<irods::api_call_adaptor<ExecRuleExpression*>, std::__1::allocator<irods::api_call_adaptor<ExecRuleExpression*> >, irods::error (irods::plugin_context&, RsComm*, ExecRuleExpression*)>::operator()(irods::plugin_context&, RsComm*&&, ExecRuleExpression*&&) in /lib/libirods_server.so.4.3.110# int irods::api_entry::call_handler<ExecRuleExpression*>(RsComm*, ExecRuleExpression*) in /lib/libirods_server.so.4.3.111# rsApiHandler(RsComm*, int, BytesBuf*, BytesBuf*) in /lib/libirods_server.so.4.3.112# readAndProcClientMsg(RsComm*, int) in /lib/libirods_server.so.4.3.113# agentMain(RsComm*) in /lib/libirods_server.so.4.3.114# runIrodsAgentFactory(sockaddr_un) in /lib/libirods_server.so.4.3.115# main::$_5::operator()() const in /usr/sbin/irodsServer16# main in /usr/sbin/irodsServer17# __libc_start_main in /lib64/libc.so.618# _start in /usr/sbin/irodsServer]""[-] /irods_plugin_source/libirods_rule_engine_plugin-unified_storage_tiering.cpp:753:irods::error exec_rule_expression(irods::default_re_ctx &, const std::string &, msParamArray_t *, irods::callback) : status [CAT_SUCCESS_BUT_WITH_NO_INFO] errno [] -- message [iRODS Exception: file: /irods_plugin_source/libirods_rule_engine_plugin-unified_storage_tiering.cpp function: void (anonymous namespace)::replicate_object_to_resource(rcComm_t *, const std::string &, const std::string &, const std::string &, const std::string &) line: 110 code: -819000 (CAT_SUCCESS_BUT_WITH_NO_INFO) message: failed to migrate [/tempZone/home/rods/foo] to [repl2]stack trace:-------------- 0# irods::stacktrace::dump() const in /lib/libirods_common.so.4.3.1 1# irods::exception::assemble_full_display_what() const in /lib/libirods_common.so.4.3.1 2# irods::exception::what() const in /lib/libirods_common.so.4.3.1 3# exec_rule_expression(std::__1::tuple<>&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, MsParamArray*, irods::callback) in /usr/lib/irods/plugins/rule_engines/libirods_rule_engine_plugin-unified_storage_tiering.so 4# std::__1::__function::__func<irods::error (*)(std::__1::tuple<>&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, MsParamArray*, irods::callback), std::__1::allocator<irods::error (*)(std::__1::tuple<>&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, MsParamArray*, irods::callback)>, irods::error (std::__1::tuple<>&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, MsParamArray*, irods::callback)>::operator()(std::__1::tuple<>&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, MsParamArray*&&, irods::callback&&) in /usr/lib/irods/plugins/rule_engines/libirods_rule_engine_plugin-unified_storage_tiering.so 5# irods::pluggable_rule_engine<std::__1::tuple<> >::exec_rule_expression(std::__1::tuple<>&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, MsParamArray*, irods::callback) in /lib/libirods_server.so.4.3.1 6# irods::rule_engine_context_manager<std::__1::tuple<>, RuleExecInfo*, (irods::rule_execution_manager_pack)0>::exec_rule_expression(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, MsParamArray*) in /lib/libirods_server.so.4.3.1 7# rsExecRuleExpression(RsComm*, ExecRuleExpression*) in /lib/libirods_server.so.4.3.1 8# irods::api_call_adaptor<ExecRuleExpression*>::operator()(irods::plugin_context&, RsComm*, ExecRuleExpression*) in /lib/libirods_server.so.4.3.1 9# std::__1::__function::__func<irods::api_call_adaptor<ExecRuleExpression*>, std::__1::allocator<irods::api_call_adaptor<ExecRuleExpression*> >, irods::error (irods::plugin_context&, RsComm*, ExecRuleExpression*)>::operator()(irods::plugin_context&, RsComm*&&, ExecRuleExpression*&&) in /lib/libirods_server.so.4.3.110# int irods::api_entry::call_handler<ExecRuleExpression*>(RsComm*, ExecRuleExpression*) in /lib/libirods_server.so.4.3.111# rsApiHandler(RsComm*, int, BytesBuf*, BytesBuf*) in /lib/libirods_server.so.4.3.112# readAndProcClientMsg(RsComm*, int) in /lib/libirods_server.so.4.3.113# agentMain(RsComm*) in /lib/libirods_server.so.4.3.114# runIrodsAgentFactory(sockaddr_un) in /lib/libirods_server.so.4.3.115# main::$_5::operator()() const in /usr/sbin/irodsServer16# main in /usr/sbin/irodsServer17# __libc_start_main in /lib64/libc.so.618# _start in /usr/sbin/irodsServer]"
And later, others appear having to do with a missing source replica:
"[rsDataObjRepl:995] - [SYS_REPLICA_INACCESSIBLE: hierarchy descending from specified source resource name [repl1] does not have a replica or the replica is inaccessible at this time]""[rsDataObjRepl:995] - [SYS_REPLICA_INACCESSIBLE: hierarchy descending from specified source resource name [repl1] does not have a replica or the replica is inaccessible at this time]""rsDataObjRepl - Failed to replicate data object. status:[-168000]""rsDataObjRepl - Failed to replicate data object. status:[-168000]""[-] /irods_plugin_source/libirods_rule_engine_plugin-unified_storage_tiering.cpp:753:irods::error exec_rule_expression(irods::default_re_ctx &, const std::string &, msParamArray_t *, irods::callback) : status [SYS_REPLICA_INACCESSIBLE] errno [] -- message [iRODS Exception: file: /irods_plugin_source/libirods_rule_engine_plugin-unified_storage_tiering.cpp function: void (anonymous namespace)::replicate_object_to_resource(rcComm_t *, const std::string &, const std::string &, const std::string &, const std::string &) line: 110 code: -168000 (SYS_REPLICA_INACCESSIBLE) message: failed to migrate [/tempZone/home/rods/foo] to [repl2]stack trace:-------------- 0# irods::stacktrace::dump() const in /lib/libirods_common.so.4.3.1 1# irods::exception::assemble_full_display_what() const in /lib/libirods_common.so.4.3.1 2# irods::exception::what() const in /lib/libirods_common.so.4.3.1 3# exec_rule_expression(std::__1::tuple<>&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, MsParamArray*, irods::callback) in /usr/lib/irods/plugins/rule_engines/libirods_rule_engine_plugin-unified_storage_tiering.so 4# std::__1::__function::__func<irods::error (*)(std::__1::tuple<>&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, MsParamArray*, irods::callback), std::__1::allocator<irods::error (*)(std::__1::tuple<>&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, MsParamArray*, irods::callback)>, irods::error (std::__1::tuple<>&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, MsParamArray*, irods::callback)>::operator()(std::__1::tuple<>&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, MsParamArray*&&, irods::callback&&) in /usr/lib/irods/plugins/rule_engines/libirods_rule_engine_plugin-unified_storage_tiering.so 5# irods::pluggable_rule_engine<std::__1::tuple<> >::exec_rule_expression(std::__1::tuple<>&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, MsParamArray*, irods::callback) in /lib/libirods_server.so.4.3.1 6# irods::rule_engine_context_manager<std::__1::tuple<>, RuleExecInfo*, (irods::rule_execution_manager_pack)0>::exec_rule_expression(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, MsParamArray*) in /lib/libirods_server.so.4.3.1 7# rsExecRuleExpression(RsComm*, ExecRuleExpression*) in /lib/libirods_server.so.4.3.1 8# irods::api_call_adaptor<ExecRuleExpression*>::operator()(irods::plugin_context&, RsComm*, ExecRuleExpression*) in /lib/libirods_server.so.4.3.1 9# std::__1::__function::__func<irods::api_call_adaptor<ExecRuleExpression*>, std::__1::allocator<irods::api_call_adaptor<ExecRuleExpression*> >, irods::error (irods::plugin_context&, RsComm*, ExecRuleExpression*)>::operator()(irods::plugin_context&, RsComm*&&, ExecRuleExpression*&&) in /lib/libirods_server.so.4.3.110# int irods::api_entry::call_handler<ExecRuleExpression*>(RsComm*, ExecRuleExpression*) in /lib/libirods_server.so.4.3.111# rsApiHandler(RsComm*, int, BytesBuf*, BytesBuf*) in /lib/libirods_server.so.4.3.112# readAndProcClientMsg(RsComm*, int) in /lib/libirods_server.so.4.3.113# agentMain(RsComm*) in /lib/libirods_server.so.4.3.114# runIrodsAgentFactory(sockaddr_un) in /lib/libirods_server.so.4.3.115# main::$_5::operator()() const in /usr/sbin/irodsServer16# main in /usr/sbin/irodsServer17# __libc_start_main in /lib64/libc.so.618# _start in /usr/sbin/irodsServer]""[-] /irods_plugin_source/libirods_rule_engine_plugin-unified_storage_tiering.cpp:753:irods::error exec_rule_expression(irods::default_re_ctx &, const std::string &, msParamArray_t *, irods::callback) : status [SYS_REPLICA_INACCESSIBLE] errno [] -- message [iRODS Exception: file: /irods_plugin_source/libirods_rule_engine_plugin-unified_storage_tiering.cpp function: void (anonymous namespace)::replicate_object_to_resource(rcComm_t *, const std::string &, const std::string &, const std::string &, const std::string &) line: 110 code: -168000 (SYS_REPLICA_INACCESSIBLE) message: failed to migrate [/tempZone/home/rods/foo] to [repl2]stack trace:-------------- 0# irods::stacktrace::dump() const in /lib/libirods_common.so.4.3.1 1# irods::exception::assemble_full_display_what() const in /lib/libirods_common.so.4.3.1 2# irods::exception::what() const in /lib/libirods_common.so.4.3.1 3# exec_rule_expression(std::__1::tuple<>&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, MsParamArray*, irods::callback) in /usr/lib/irods/plugins/rule_engines/libirods_rule_engine_plugin-unified_storage_tiering.so 4# std::__1::__function::__func<irods::error (*)(std::__1::tuple<>&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, MsParamArray*, irods::callback), std::__1::allocator<irods::error (*)(std::__1::tuple<>&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, MsParamArray*, irods::callback)>, irods::error (std::__1::tuple<>&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, MsParamArray*, irods::callback)>::operator()(std::__1::tuple<>&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, MsParamArray*&&, irods::callback&&) in /usr/lib/irods/plugins/rule_engines/libirods_rule_engine_plugin-unified_storage_tiering.so 5# irods::pluggable_rule_engine<std::__1::tuple<> >::exec_rule_expression(std::__1::tuple<>&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, MsParamArray*, irods::callback) in /lib/libirods_server.so.4.3.1 6# irods::rule_engine_context_manager<std::__1::tuple<>, RuleExecInfo*, (irods::rule_execution_manager_pack)0>::exec_rule_expression(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, MsParamArray*) in /lib/libirods_server.so.4.3.1 7# rsExecRuleExpression(RsComm*, ExecRuleExpression*) in /lib/libirods_server.so.4.3.1 8# irods::api_call_adaptor<ExecRuleExpression*>::operator()(irods::plugin_context&, RsComm*, ExecRuleExpression*) in /lib/libirods_server.so.4.3.1 9# std::__1::__function::__func<irods::api_call_adaptor<ExecRuleExpression*>, std::__1::allocator<irods::api_call_adaptor<ExecRuleExpression*> >, irods::error (irods::plugin_context&, RsComm*, ExecRuleExpression*)>::operator()(irods::plugin_context&, RsComm*&&, ExecRuleExpression*&&) in /lib/libirods_server.so.4.3.110# int irods::api_entry::call_handler<ExecRuleExpression*>(RsComm*, ExecRuleExpression*) in /lib/libirods_server.so.4.3.111# rsApiHandler(RsComm*, int, BytesBuf*, BytesBuf*) in /lib/libirods_server.so.4.3.112# readAndProcClientMsg(RsComm*, int) in /lib/libirods_server.so.4.3.113# agentMain(RsComm*) in /lib/libirods_server.so.4.3.114# runIrodsAgentFactory(sockaddr_un) in /lib/libirods_server.so.4.3.115# main::$_5::operator()() const in /usr/sbin/irodsServer16# main in /usr/sbin/irodsServer17# __libc_start_main in /lib64/libc.so.618# _start in /usr/sbin/irodsServer]"
Eventually, the migration jobs will fail a sufficient number of times and are removed from the queue.
It seems like all the migration jobs start at the same time and one of them wins the race, locking out the others. It is mildly concerning that it gets all the way to the point of registering the physical path before an error occurs (the "database race", I assume: irods/irods#5742 (comment)) but after that scare, logical locking should keep things sane.
If we consider the "tracked" replica to be the "representative" replica for the group of replicas, it is the only one that needs to be scheduled for replication. The plugin seems to take care of the trimming of the other replicas, so we don't need to worry about that.
Open to other ideas.
The text was updated successfully, but these errors were encountered:
Right, we only have to make the replication jobs each 'check' before doing any work to replicate. Then, if it's already in the desired state, return early... no errors.
Oh, the first three fire at the same time... so it still might be a little noisy. Hmm....
Bug Report
iRODS Version, OS and Version
iRODS server: 4.3.1
Storage tiering plugin: 4.3.1
OS: centos 7
What did you try to do?
Set up a tier group with 3 resource hierarchies:
Then I put an object in...
Then try to tier it out:
Expected behavior
I expected the tier out to occur with no errors or issues.
Observed behavior (including steps to reproduce, if applicable)
After a while, 3 migrations are scheduled:
The tier-out succeeds!
...but there are 2 migration tasks remaining:
...and a bunch of errors in the log. The first errors have to do with duplicate entries in the catalog:
And later, others appear having to do with a missing source replica:
Eventually, the migration jobs will fail a sufficient number of times and are removed from the queue.
It seems like all the migration jobs start at the same time and one of them wins the race, locking out the others. It is mildly concerning that it gets all the way to the point of registering the physical path before an error occurs (the "database race", I assume: irods/irods#5742 (comment)) but after that scare, logical locking should keep things sane.
If we consider the "tracked" replica to be the "representative" replica for the group of replicas, it is the only one that needs to be scheduled for replication. The plugin seems to take care of the trimming of the other replicas, so we don't need to worry about that.
Open to other ideas.
The text was updated successfully, but these errors were encountered: