addObjectACL(bucket, objectKey, objectMD, addACLParams, params, log, cb) {
        log.trace('updating object acl in metadata');
        const isAclUnchanged = Object.keys(objectMD.acl).length === Object.keys(addACLParams).length
            && Object.keys(objectMD.acl).every(grant => this._aclGrantDidNotChange(grant, objectMD.acl, addACLParams));
        if (!isAclUnchanged) {
            /* eslint-disable no-param-reassign */
            objectMD.acl = addACLParams;
            objectMD.originOp = 's3:ObjectAcl:Put';

            // Use storageType to determine if replication update is needed, as it is set only for
            // "cloud" locations. This  ensures that we reset replication when CRR is used, but not
            // when multi-backend replication (i.e. Zenko) is used.
            // TODO: this should be refactored to properly update the replication info, accounting
            // for multiple rules and resetting the status only if needed CLDSRV-646
            const replicationInfo = getReplicationInfo(config, objectKey, bucket, true);
            if (replicationInfo && !replicationInfo.storageType) {
                objectMD.replicationInfo = {
                    ...objectMD.replicationInfo,
                    ...replicationInfo,
                };
            }

            return metadata.putObjectMD(bucket.getName(), objectKey, objectMD, params, log, cb);
        }
        return cb();
    }
An ACL grant is in form of an array of strings
An ACL grant is considered unchanged when both the old and new one
contain the same number of elements, and all elements from one
grant are incuded in the other grant