function getNullVersionFromMaster(bucketName, objectKey, log, cb) {
    async.waterfall([
        next => metadata.getObjectMD(bucketName, objectKey, {}, log, next),
        (masterMD, next) => {
            if (masterMD.isNull || !masterMD.versionId) {
                log.debug('null version is master version');
                return process.nextTick(() => next(null, masterMD));
            }
            if (masterMD.nullVersionId) {
                // the latest version is not the null version, but null version exists
                // NOTE: for backward-compat with old null version scheme
                log.debug('get the null version via nullVersionId');
                const getOptions = {
                    versionId: masterMD.nullVersionId,
                };
                return metadata.getObjectMD(bucketName, objectKey, getOptions, log, next);
            }
            return next(errors.NoSuchKey);
        },
    ], (err, nullMD) => {
        if (err && err.is && err.is.NoSuchKey) {
            log.debug('could not find a null version');
            return cb();
        }
        if (err) {
            log.debug('err getting object MD from metadata', { error: err });
            return cb(err);
        }
        return cb(null, nullMD);
    });
}
getNullVersionFromMaster - retrieves the null version
metadata via retrieving the master key

Used in the following cases:

- master key is non-versioned (and hence is the 'null' version)

- the null version is stored in a versioned key and its reference
  is in the master key as 'nullVersionId' (compatibility mode with
  old null version storage)

@param {string} bucketName - name of bucket
@param {string} objectKey - name of object key
@param {RequestLogger} log - request logger
@param {function} cb - callback(err: Error, nullMD: object)
@return {undefined}