I need to verify this, but here's what I think is happening:
Refactor: pacemaker-attrd: drop redundant argument from update_attr_on_host()
Refactor: pacemaker-attrd: drop unused argument from attrd_peer_sync()
Refactor: pacemaker-attrd: de-functionize attrd_lookup_or_create_value()
Refactor: pacemaker-attrd: minor shuffling to make planned changes easier
Log: pacemaker-attrd: make sure we don't try to log NULL
Merge pull request #3326 from kgaillot/attrd
I've reproduced this on 2.1.0, 2.1.2, and 2.1.7, so it doesn't appear to be a regression. Additionally, it only happens at shutdown, so there's no tangible impact except that it won't reconnect when the cluster starts back... which is not great.
Refactor: libcrmcommon: New PCMK__XA_NODE_FENCED string constant
Refactor: libcrmcommon: New PCMK__XA_REMOTE_NODE string constant
API: libcrmcommon: Deprecate XML_NODE_IS_REMOTE
API: libcrmcommon: Deprecate XML_NODE_IS_FENCED
Refactor: libcrmcommon: Include xml_internal.h in acl_internal.h
Refactor: libcrmcommon: New PCMK__XA_NODE_IN_MAINTENANCE string constant
API: libcrmcommon: Deprecate XML_NODE_IS_MAINTENANCE
Refactor: libcrmcommon: New xml_names_internal.h file
API: libcrmcommon: Deprecate XML_CIB_ATTR_SHUTDOWN
Refactor: libcrmcommon: New PCMK__NODE_ATTR_SHUTDOWN string constant
Refactor: libcrmcommon: New PCMK__XE_SHUTDOWN string constant
Feature: CIB: Deprecate resource-discovery-enabled node attribute
API: libcrmcommon: New PCMK_VALUE_ALWAYS string constant
API: libcrmcommon: New PCMK_VALUE_EXCLUSIVE string constant
API: libcrmcommon: Deprecate XML_NODE_ATTR_RSC_DISCOVERY string constant
API: libcrmcommon: New PCMK_VALUE_NEVER string constant
API: libcrmcommon: New PCMK_VALUE_AND string constant
Log: libpe_rules, libpacemaker: Warn on invalid boolean-op
API: libcrmcommon: New PCMK_VALUE_OR string constant
Log: libpe_rules: Warn on invalid value-source in expressions
API: libcrmcommon: New PCMK_VALUE_LITERAL string constant
Refactor: libcrmcommon: New PCMK__XE_META string constant
API: libcrmcommon: New PCMK_VALUE_META string constant
API: libcrmcommon: New PCMK_XA_SEQUENTIAL string constant
API: libcrmcommon: New PCMK_VALUE_PARAM string constant
API: libcrmcommon: New PCMK_XA_ACTION string constant
Refactor: tools: Split table entries into two lines
API: libcrmcommon: New PCMK_XE_ACTIONS string constant
API: libcrmcommon: New PCMK_XE_ACTION string constant
API: libcrmcommon: New PCMK_XA_PRESENT string constant
API: libcrmcommon: New PCMK_XA_WITH_QUORUM string constant
API: libcrmcommon: New PCMK_XA_MIXED_VERSION string constant
API: libcrmcommon: New PCMK_XA_HOST string constant
API: libcrmcommon: New PCMK_XA_RUNNING string constant
API: libcrmcommon: New PCMK_XA_SCOPE string constant
API: libcrmcommon: New PCMK_XE_TICKET string constant
API: libcrmcommon: New PCMK_XA_STATUS string constant
API: libcrmcommon: New PCMK_XA_DELEGATE string constant
API: libcrmcommon: New PCMK_XA_CLIENT string constant
API: libcrmcommon: New PCMK_XA_TIME string constant
API: libcrmcommon: New PCMK_XA_USER string constant
Refactor: libcrmcommon: New PCMK__XA_PASSWORD string constant
Refactor: libcrmcommon: New PCMK__VALUE_PASSWORD string constant
Refactor: libcrmcommon: New PCMK__XA_HIDDEN string constant
API: libcrmcommon: New PCMK_XA_REPLICAS string constant
API: libcrmcommon: New PCMK_XA_REPLICAS_PER_HOST string constant
API: libcrmcommon: New PCMK_XA_PROMOTED_MAX string constant
Refactor: libcrmcommon: New PCMK__XA_PROMOTED_MAX_LEGACY string constant
API: libcrmcommon: New PCMK_XE_NETWORK string constant
API: libcrmcommon: New PCMK_XA_NETWORK string constant
API: libcrmcommon: New PCMK_XA_RUN_COMMAND string constant
API: libcrmcommon: New PCMK_XA_IMAGE string constant
API: libcrmcommon: New PCMK_XA_OPTIONS string constant
API: libcrmcommon: New PCMK_XA_CONTROL_PORT string constant
API: libcrmcommon: New PCMK_XA_IP_RANGE_START string constant
API: libcrmcommon: New PCMK_XA_HOST_INTERFACE string constant
API: libcrmcommon: New PCMK_XA_HOST_NETMASK string constant
API: libcrmcommon: New PCMK_XE_PORT_MAPPING string constant
API: libcrmcommon: New PCMK_XA_ADD_HOST string constant
API: libcrmcommon: New PCMK_XA_PORT string constant
API: libcrmcommon: New PCMK_XE_STORAGE string constant
API: libcrmcommon: New PCMK_XA_RANGE string constant
API: libcrmcommon: New PCMK_XA_INTERNAL_PORT string constant
API: libcrmcommon: New PCMK_XE_STORAGE_MAPPING string constant
API: libcrmcommon: New PCMK_XA_SOURCE_DIR_ROOT string constant
API: libcrmcommon: New PCMK_XA_SOURCE_DIR string constant
API: libcrmcommon: New PCMK_XA_TARGET_DIR string constant
API: libcrmcommon: New PCMK_VALUE_IGNORE string constant
API: libcrmcommon: New PCMK_VALUE_BLOCK string constant
API: libcrmcommon: New PCMK_VALUE_DEMOTE string constant
API: libcrmcommon: New PCMK_VALUE_STOP string constant
API: libcrmcommon: New PCMK_VALUE_STANDBY string constant
API: libcrmcommon: New PCMK_VALUE_RESTART string constant
API: libcrmcommon: New PCMK_VALUE_FENCE string constant
API: libcrmcommon: New PCMK_XA_EXECUTION_DATE string constant
API: libcrmcommon: New PCMK_VALUE_RESTART_CONTAINER string constant
Doc: Pacemaker Explained: Document execution-date
Doc: Pacemaker Explained: New epoch_time option type
API: libcrmcommon: New PCMK_XA_REMOTE_TLS_PORT string constant
API: libcrmcommon: New PCMK_XA_REMOTE_CLEAR_PORT string constant
API: libcrmcommon: New PCMK_XA_REQUIRE_ALL string constant
Refactor: libcrmcommon: New PCMK__VALUE_GROUP string constant
Refactor: libcrmcommon: New PCMK__XA_ORDERING string constant
API: libcrmcommon: New PCMK_VALUE_FREEZE string constant
API: libcrmcommon: New PCMK_VALUE_FENCE_LEGACY string constant
API: libcrmcommon: New PCMK_VALUE_MANDATORY string constant
API: libcrmcommon: New PCMK_VALUE_OPTIONAL string constant
API: libcrmcommon: New PCMK_VALUE_MEMBER string constant
API: libcrmcommon: New PCMK_VALUE_SERIALIZE string constant
Refactor: libcrmcommon: New PCMK__VALUE_PING string constant