| Index: delta_diff_generator.cc
|
| diff --git a/delta_diff_generator.cc b/delta_diff_generator.cc
|
| index 9a5219df20de9dad746ee07f2546b9928343e4b1..b9a18c7d3fabe814bfde1304696ecf317ae33dc3 100644
|
| --- a/delta_diff_generator.cc
|
| +++ b/delta_diff_generator.cc
|
| @@ -29,6 +29,7 @@
|
| #include "update_engine/filesystem_iterator.h"
|
| #include "update_engine/graph_types.h"
|
| #include "update_engine/graph_utils.h"
|
| +#include "update_engine/omaha_hash_calculator.h"
|
| #include "update_engine/payload_signer.h"
|
| #include "update_engine/subprocess.h"
|
| #include "update_engine/topological_sort.h"
|
| @@ -586,6 +587,40 @@ bool DeltaDiffGenerator::ReadFileToDiff(
|
| return true;
|
| }
|
|
|
| +bool InitializePartitionInfo(const string& partition, PartitionInfo* info) {
|
| + const off_t size = utils::FileSize(partition);
|
| + TEST_AND_RETURN_FALSE(size >= 0);
|
| + info->set_size(size);
|
| + OmahaHashCalculator hasher;
|
| + TEST_AND_RETURN_FALSE(hasher.UpdateFile(partition, -1) == size);
|
| + TEST_AND_RETURN_FALSE(hasher.Finalize());
|
| + const vector<char>& hash = hasher.raw_hash();
|
| + info->set_hash(string(&hash[0], hash.size()));
|
| + return true;
|
| +}
|
| +
|
| +bool InitializePartitionInfos(const string& old_kernel,
|
| + const string& new_kernel,
|
| + const string& old_rootfs,
|
| + const string& new_rootfs,
|
| + DeltaArchiveManifest* manifest) {
|
| + if (!old_kernel.empty()) {
|
| + TEST_AND_RETURN_FALSE(
|
| + InitializePartitionInfo(old_kernel,
|
| + manifest->mutable_old_kernel_info()));
|
| + }
|
| + TEST_AND_RETURN_FALSE(
|
| + InitializePartitionInfo(new_kernel, manifest->mutable_new_kernel_info()));
|
| + if (!old_rootfs.empty()) {
|
| + TEST_AND_RETURN_FALSE(
|
| + InitializePartitionInfo(old_rootfs,
|
| + manifest->mutable_old_rootfs_info()));
|
| + }
|
| + TEST_AND_RETURN_FALSE(
|
| + InitializePartitionInfo(new_rootfs, manifest->mutable_new_rootfs_info()));
|
| + return true;
|
| +}
|
| +
|
| namespace {
|
|
|
| // Takes a collection (vector or RepeatedPtrField) of Extent and
|
| @@ -679,7 +714,7 @@ bool DeltaDiffGenerator::CutEdges(Graph* graph,
|
| graph->resize(graph->size() + 1);
|
| cuts.back().old_src = it->first;
|
| cuts.back().old_dst = it->second;
|
| -
|
| +
|
| EdgeProperties& cut_edge_properties =
|
| (*graph)[it->first].out_edges.find(it->second)->second;
|
|
|
| @@ -903,7 +938,7 @@ bool DeltaDiffGenerator::AssignTempBlocks(
|
| edge_i != edge_e; ++edge_i) {
|
| ranges.SubtractExtents(edge_i->second.extents);
|
| }
|
| -
|
| +
|
| uint64_t blocks_found = ranges.blocks();
|
| if (blocks_found < blocks_needed) {
|
| if (blocks_found > 0)
|
| @@ -919,12 +954,12 @@ bool DeltaDiffGenerator::AssignTempBlocks(
|
| // depend on old_dst.
|
| vector<Extent> real_extents =
|
| ranges.GetExtentsForBlockCount(blocks_needed);
|
| -
|
| +
|
| // Fix the old dest node w/ the real blocks
|
| SubstituteBlocks(&(*graph)[node],
|
| cuts[i].tmp_extents,
|
| real_extents);
|
| -
|
| +
|
| // Fix the new node w/ the real blocks. Since the new node is just a
|
| // copy operation, we can replace all the dest extents w/ the real
|
| // blocks.
|
| @@ -932,7 +967,7 @@ bool DeltaDiffGenerator::AssignTempBlocks(
|
| &(*graph)[cuts[i].new_vertex].op;
|
| op->clear_dst_extents();
|
| StoreExtents(real_extents, op->mutable_dst_extents());
|
| -
|
| +
|
| // Add an edge from the real-block supplier to the old dest block.
|
| graph_utils::AddReadBeforeDepExtents(&(*graph)[test_node],
|
| node,
|
| @@ -960,7 +995,7 @@ bool DeltaDiffGenerator::AssignTempBlocks(
|
| }
|
| new_op_indexes.push_back(cuts[i].old_dst);
|
| op_indexes->swap(new_op_indexes);
|
| -
|
| +
|
| GenerateReverseTopoOrderMap(*op_indexes, reverse_op_indexes);
|
| }
|
| if (i == e) {
|
| @@ -1045,11 +1080,11 @@ bool DeltaDiffGenerator::ConvertCutToFullOp(Graph* graph,
|
| int data_fd,
|
| off_t* data_file_size) {
|
| // Drop all incoming edges, keep all outgoing edges
|
| -
|
| +
|
| // Keep all outgoing edges
|
| Vertex::EdgeMap out_edges = (*graph)[cut.old_dst].out_edges;
|
| graph_utils::DropWriteBeforeDeps(&out_edges);
|
| -
|
| +
|
| TEST_AND_RETURN_FALSE(DeltaReadFile(graph,
|
| cut.old_dst,
|
| NULL,
|
| @@ -1058,7 +1093,7 @@ bool DeltaDiffGenerator::ConvertCutToFullOp(Graph* graph,
|
| (*graph)[cut.old_dst].file_name,
|
| data_fd,
|
| data_file_size));
|
| -
|
| +
|
| (*graph)[cut.old_dst].out_edges = out_edges;
|
|
|
| // Right now we don't have doubly-linked edges, so we have to scan
|
| @@ -1132,7 +1167,7 @@ bool DeltaDiffGenerator::ReadFullUpdateFromDisk(
|
| std::vector<Vertex::Index>* final_order) {
|
| TEST_AND_RETURN_FALSE(chunk_size > 0);
|
| TEST_AND_RETURN_FALSE((chunk_size % kBlockSize) == 0);
|
| -
|
| +
|
| // Get the sizes early in the function, so we can fail fast if the user
|
| // passed us bad paths.
|
| const off_t image_size = utils::FileSize(new_image);
|
| @@ -1166,17 +1201,17 @@ bool DeltaDiffGenerator::ReadFullUpdateFromDisk(
|
| op = &kernel_ops->back();
|
| }
|
| LOG(INFO) << "have an op";
|
| -
|
| +
|
| vector<char> buf(min(bytes_left, chunk_size));
|
| LOG(INFO) << "buf size: " << buf.size();
|
| ssize_t bytes_read = -1;
|
| -
|
| +
|
| TEST_AND_RETURN_FALSE(utils::PReadAll(
|
| in_fd, &buf[0], buf.size(), offset, &bytes_read));
|
| TEST_AND_RETURN_FALSE(bytes_read == static_cast<ssize_t>(buf.size()));
|
| -
|
| +
|
| vector<char> buf_compressed;
|
| -
|
| +
|
| TEST_AND_RETURN_FALSE(BzipCompress(buf, &buf_compressed));
|
| const bool compress = buf_compressed.size() < buf.size();
|
| const vector<char>& use_buf = compress ? buf_compressed : buf;
|
| @@ -1381,6 +1416,12 @@ bool DeltaDiffGenerator::GenerateDeltaUpdateFile(
|
| kBlockSize);
|
| }
|
|
|
| + TEST_AND_RETURN_FALSE(InitializePartitionInfos(old_kernel_part,
|
| + new_kernel_part,
|
| + old_image,
|
| + new_image,
|
| + &manifest));
|
| +
|
| // Serialize protobuf
|
| string serialized_manifest;
|
|
|
|
|