diff options
author | 2018-06-25 15:42:59 -0700 | |
---|---|---|
committer | 2018-06-25 15:45:45 -0700 | |
commit | f2460fc21b22b65ca57c7ea996e4e8d003aa3371 (patch) | |
tree | b2194b3d6e3d6fadd83350999352953b872d636d /tensorflow/core/util/device_name_utils.cc | |
parent | 84a7f40c86a5ac3d8c427085dd28eef45036b48f (diff) |
Making the device name comparison more robust for RemoteCall and
FunctionBufferingResource. Earlier target_device could be '/cpu:0' and
source_device be '/job:localhost/replica:0/task:0/device:CPU:0' and we'd deem
them to be different devices which is incorrect.
PiperOrigin-RevId: 202032979
Diffstat (limited to 'tensorflow/core/util/device_name_utils.cc')
-rw-r--r-- | tensorflow/core/util/device_name_utils.cc | 57 |
1 files changed, 53 insertions, 4 deletions
diff --git a/tensorflow/core/util/device_name_utils.cc b/tensorflow/core/util/device_name_utils.cc index 90c3fed2e8..8c24076aa9 100644 --- a/tensorflow/core/util/device_name_utils.cc +++ b/tensorflow/core/util/device_name_utils.cc @@ -184,16 +184,65 @@ bool DeviceNameUtils::ParseFullName(StringPiece fullname, ParsedName* p) { return true; } +namespace { + +void CompleteName(const DeviceNameUtils::ParsedName& parsed_basename, + DeviceNameUtils::ParsedName* parsed_name) { + if (!parsed_name->has_job) { + parsed_name->job = parsed_basename.job; + parsed_name->has_job = true; + } + if (!parsed_name->has_replica) { + parsed_name->replica = parsed_basename.replica; + parsed_name->has_replica = true; + } + if (!parsed_name->has_task) { + parsed_name->task = parsed_basename.task; + parsed_name->has_task = true; + } + if (!parsed_name->has_type) { + parsed_name->type = parsed_basename.type; + parsed_name->has_type = true; + } + if (!parsed_name->has_id) { + parsed_name->id = parsed_basename.id; + parsed_name->has_id = true; + } +} + +} // namespace + /* static */ -string DeviceNameUtils::CanonicalizeDeviceName(StringPiece fullname) { +Status DeviceNameUtils::CanonicalizeDeviceName(StringPiece fullname, + StringPiece basename, + string* canonical_name) { + *canonical_name = ""; + ParsedName parsed_basename; + if (!ParseFullName(basename, &parsed_basename)) { + return errors::InvalidArgument("Could not parse basename: ", basename, + " into a device specification."); + } + if (!(parsed_basename.has_job && parsed_basename.has_replica && + parsed_basename.has_task && parsed_basename.has_type && + parsed_basename.has_id)) { + return errors::InvalidArgument("Basename: ", basename, + " should be fully " + "specified."); + } ParsedName parsed_name; if (ParseLocalName(fullname, &parsed_name)) { - return ParsedNameToString(parsed_name); + CompleteName(parsed_basename, &parsed_name); + *canonical_name = ParsedNameToString(parsed_name); + return Status::OK(); } if (ParseFullName(fullname, &parsed_name)) { - return ParsedNameToString(parsed_name); + CompleteName(parsed_basename, &parsed_name); + *canonical_name = ParsedNameToString(parsed_name); + return Status::OK(); } - return ""; + return errors::InvalidArgument("Could not parse ", fullname, + " into a device " + "specification."); } /* static */ |