| 1137 | } |
| 1138 | |
| 1139 | Status BundleReader::LookupSegmentOffset(StringPiece key, uint64_t offset, size_t buffer_size, char* destination, size_t& real_bytes_read) { |
| 1140 | LookupSegItem& seg_item = tmp_lookupseg_items_[string(key)]; |
| 1141 | const size_t desired_bytes = std::min(buffer_size, seg_item.total_size); |
| 1142 | if (desired_bytes == 0) { |
| 1143 | real_bytes_read = 0; |
| 1144 | return Status::OK(); |
| 1145 | } |
| 1146 | |
| 1147 | io::InputBuffer* buffered_file = data_[seg_item.entry.shard_id()]; |
| 1148 | StringPiece result; |
| 1149 | Status status = buffered_file->file()->Read(seg_item.entry.offset() + offset, desired_bytes, &result, destination); |
| 1150 | |
| 1151 | if (!status.ok()) { |
| 1152 | return errors::InvalidArgument("Read Error! ", buffer_size, " ", seg_item.total_size, " ", seg_item.entry.offset() + seg_item.bytes_read, " ", desired_bytes, " ", status.ToString()); |
| 1153 | } |
| 1154 | if (result.size() != desired_bytes) { |
| 1155 | return errors::DataLoss("Requested ", desired_bytes, " bytes but read ", |
| 1156 | result.size(), " bytes."); |
| 1157 | } |
| 1158 | // Data is already in the correct location. |
| 1159 | seg_item.bytes_read += result.size(); |
| 1160 | seg_item.total_size -= result.size(); |
| 1161 | real_bytes_read = result.size(); |
| 1162 | return Status::OK(); |
| 1163 | } |
| 1164 | |
| 1165 | Status BundleReader::GetTensorInfo( |
| 1166 | StringPiece key, int64* size, |