AU: Speed up updates by using buffered writes.

Given that SSD writes are really slow, this improves performance significantly.
This reduces update time on AGZ from 375 to 100 seconds.

BUG=6901
TEST=unit tests, gmerged on device and measured speed

Change-Id: Idac7743f6eaa8f26878a2d1f6b9401513e2ca600

Review URL: http://codereview.chromium.org/3471006
diff --git a/download_action.cc b/download_action.cc
index 5096703..9779f2a 100644
--- a/download_action.cc
+++ b/download_action.cc
@@ -17,6 +17,9 @@
 
 namespace chromeos_update_engine {
 
+// Use a buffer to reduce the number of IOPS on SSD devices.
+const size_t kFileWriterBufferSize = 128 * 1024;  // 128 KiB
+
 DownloadAction::DownloadAction(HttpFetcher* http_fetcher)
     : writer_(NULL),
       http_fetcher_(http_fetcher),
@@ -41,8 +44,15 @@
     if (install_plan_.is_full_update) {
       kernel_file_writer_.reset(new DirectFileWriter);
       rootfs_file_writer_.reset(new DirectFileWriter);
-      split_file_writer_.reset(new SplitFileWriter(kernel_file_writer_.get(),
-                                                   rootfs_file_writer_.get()));
+      kernel_buffered_file_writer_.reset(
+          new BufferedFileWriter(kernel_file_writer_.get(),
+                                 kFileWriterBufferSize));
+      rootfs_buffered_file_writer_.reset(
+          new BufferedFileWriter(rootfs_file_writer_.get(),
+                                 kFileWriterBufferSize));
+      split_file_writer_.reset(
+          new SplitFileWriter(kernel_buffered_file_writer_.get(),
+                              rootfs_buffered_file_writer_.get()));
       split_file_writer_->SetFirstOpenArgs(
           install_plan_.kernel_install_path.c_str(),
           O_WRONLY | O_CREAT | O_TRUNC | O_LARGEFILE,