| Index: delta_diff_generator.cc
|
| diff --git a/delta_diff_generator.cc b/delta_diff_generator.cc
|
| index 64c17661d980dbede9eeb492bcab025a535f4b67..50db931761101cc238f15b426f46cc3af5ed5deb 100644
|
| --- a/delta_diff_generator.cc
|
| +++ b/delta_diff_generator.cc
|
| @@ -27,6 +27,7 @@
|
| #include "update_engine/extent_ranges.h"
|
| #include "update_engine/file_writer.h"
|
| #include "update_engine/filesystem_iterator.h"
|
| +#include "update_engine/full_update_generator.h"
|
| #include "update_engine/graph_types.h"
|
| #include "update_engine/graph_utils.h"
|
| #include "update_engine/omaha_hash_calculator.h"
|
| @@ -1308,85 +1309,6 @@ bool DeltaDiffGenerator::ConvertGraphToDag(Graph* graph,
|
| return true;
|
| }
|
|
|
| -bool DeltaDiffGenerator::ReadFullUpdateFromDisk(
|
| - Graph* graph,
|
| - const std::string& new_kernel_part,
|
| - const std::string& new_image,
|
| - off_t image_size,
|
| - int fd,
|
| - off_t* data_file_size,
|
| - off_t chunk_size,
|
| - vector<DeltaArchiveManifest_InstallOperation>* kernel_ops,
|
| - 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.
|
| - TEST_AND_RETURN_FALSE(image_size >= 0 &&
|
| - image_size <= utils::FileSize(new_image));
|
| - const off_t kernel_size = utils::FileSize(new_kernel_part);
|
| - TEST_AND_RETURN_FALSE(kernel_size >= 0);
|
| -
|
| - off_t part_sizes[] = { image_size, kernel_size };
|
| - string paths[] = { new_image, new_kernel_part };
|
| -
|
| - for (int partition = 0; partition < 2; ++partition) {
|
| - const string& path = paths[partition];
|
| - LOG(INFO) << "compressing " << path;
|
| -
|
| - int in_fd = open(path.c_str(), O_RDONLY, 0);
|
| - TEST_AND_RETURN_FALSE(in_fd >= 0);
|
| - ScopedFdCloser in_fd_closer(&in_fd);
|
| -
|
| - for (off_t bytes_left = part_sizes[partition], counter = 0, offset = 0;
|
| - bytes_left > 0;
|
| - bytes_left -= chunk_size, ++counter, offset += chunk_size) {
|
| - DeltaArchiveManifest_InstallOperation* op = NULL;
|
| - if (partition == 0) {
|
| - graph->resize(graph->size() + 1);
|
| - graph->back().file_name = path + StringPrintf("-%" PRIi64, counter);
|
| - op = &graph->back().op;
|
| - final_order->push_back(graph->size() - 1);
|
| - } else {
|
| - kernel_ops->resize(kernel_ops->size() + 1);
|
| - op = &kernel_ops->back();
|
| - }
|
| -
|
| - vector<char> buf(min(bytes_left, chunk_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;
|
| - if (compress) {
|
| - op->set_type(DeltaArchiveManifest_InstallOperation_Type_REPLACE_BZ);
|
| - } else {
|
| - op->set_type(DeltaArchiveManifest_InstallOperation_Type_REPLACE);
|
| - }
|
| - op->set_data_offset(*data_file_size);
|
| - TEST_AND_RETURN_FALSE(utils::WriteAll(fd, &use_buf[0], use_buf.size()));
|
| - *data_file_size += use_buf.size();
|
| - op->set_data_length(use_buf.size());
|
| - Extent* dst_extent = op->add_dst_extents();
|
| - dst_extent->set_start_block(offset / kBlockSize);
|
| - dst_extent->set_num_blocks(chunk_size / kBlockSize);
|
| -
|
| - LOG(INFO) << StringPrintf("%.1f", offset * 100.0 / part_sizes[partition])
|
| - << "% complete (offset: " << offset << ", buf size: "
|
| - << buf.size() << ")";
|
| - }
|
| - }
|
| -
|
| - return true;
|
| -}
|
| -
|
| bool DeltaDiffGenerator::GenerateDeltaUpdateFile(
|
| const string& old_root,
|
| const string& old_image,
|
| @@ -1480,15 +1402,16 @@ bool DeltaDiffGenerator::GenerateDeltaUpdateFile(
|
| // Full update
|
| off_t new_image_size =
|
| static_cast<off_t>(new_image_block_count) * new_image_block_size;
|
| - TEST_AND_RETURN_FALSE(ReadFullUpdateFromDisk(&graph,
|
| - new_kernel_part,
|
| - new_image,
|
| - new_image_size,
|
| - fd,
|
| - &data_file_size,
|
| - kFullUpdateChunkSize,
|
| - &kernel_ops,
|
| - &final_order));
|
| + TEST_AND_RETURN_FALSE(FullUpdateGenerator::Run(&graph,
|
| + new_kernel_part,
|
| + new_image,
|
| + new_image_size,
|
| + fd,
|
| + &data_file_size,
|
| + kFullUpdateChunkSize,
|
| + kBlockSize,
|
| + &kernel_ops,
|
| + &final_order));
|
| }
|
| }
|
|
|
|
|