Merge changes I115b6b98,Iff84c0df,Ice13f58e,I5302a9a2 into main am: 0381ebefc4 am: bee4b39116
Original change: https://android-review.googlesource.com/c/platform/system/core/+/3102278
Change-Id: Ic687deff061cd090955228d25ac31a8012a70fa8
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/fs_mgr/libsnapshot/android/snapshot/snapshot.proto b/fs_mgr/libsnapshot/android/snapshot/snapshot.proto
index 076a918..d04c9c1 100644
--- a/fs_mgr/libsnapshot/android/snapshot/snapshot.proto
+++ b/fs_mgr/libsnapshot/android/snapshot/snapshot.proto
@@ -103,7 +103,7 @@
// The old partition size (if none existed, this will be zero).
uint64 old_partition_size = 10;
- // Compression algorithm (none, gz, lz4, zstd, or brotli).
+ // Compression algorithm (none, lz4, zstd).
string compression_algorithm = 11;
// Estimated COW size from OTA manifest.
@@ -120,6 +120,18 @@
// Max bytes to be compressed at once (4k, 8k, 16k, 32k, 64k, 128k)
uint64 compression_factor = 16;
+
+ // Default value is 32, can be set lower for low mem devices
+ uint32 read_ahead_size = 17;
+
+ // Enable direct reads on source device
+ bool o_direct = 18;
+
+ // Blocks size to be verified at once
+ uint64 verify_block_size = 19;
+
+ // Default value is 2, configures threads to do verification phase
+ uint32 num_verify_threads = 20;
}
// Next: 8
diff --git a/fs_mgr/libsnapshot/partition_cow_creator.h b/fs_mgr/libsnapshot/partition_cow_creator.h
index cbd664f..a75d993 100644
--- a/fs_mgr/libsnapshot/partition_cow_creator.h
+++ b/fs_mgr/libsnapshot/partition_cow_creator.h
@@ -60,6 +60,7 @@
bool using_snapuserd = false;
std::string compression_algorithm;
uint64_t compression_factor;
+ uint32_t read_ahead_size;
// True if multi-threaded compression should be enabled
bool enable_threading;
diff --git a/fs_mgr/libsnapshot/snapshot.cpp b/fs_mgr/libsnapshot/snapshot.cpp
index 7ca53ad..8620620 100644
--- a/fs_mgr/libsnapshot/snapshot.cpp
+++ b/fs_mgr/libsnapshot/snapshot.cpp
@@ -101,8 +101,7 @@
* time, they could use O_DIRECT functionality wherein the I/O to the source
* block device will be O_DIRECT.
*/
-static constexpr auto kCowReadAheadSizeKb = 32;
-static constexpr auto kSourceReadAheadSizeKb = 32;
+static constexpr auto kReadAheadSizeKb = 32;
// Note: IImageManager is an incomplete type in the header, so the default
// destructor doesn't work.
@@ -418,6 +417,7 @@
status->set_using_snapuserd(cow_creator->using_snapuserd);
status->set_compression_algorithm(cow_creator->compression_algorithm);
status->set_compression_factor(cow_creator->compression_factor);
+ status->set_read_ahead_size(cow_creator->read_ahead_size);
if (cow_creator->enable_threading) {
status->set_enable_threading(cow_creator->enable_threading);
}
@@ -1142,8 +1142,8 @@
return result;
}
-auto SnapshotManager::CheckMergeState(LockedFile* lock, const std::function<bool()>& before_cancel)
- -> MergeResult {
+auto SnapshotManager::CheckMergeState(LockedFile* lock,
+ const std::function<bool()>& before_cancel) -> MergeResult {
SnapshotUpdateStatus update_status = ReadSnapshotUpdateStatus(lock);
switch (update_status.state()) {
case UpdateState::None:
@@ -1765,9 +1765,8 @@
base_path_merge;
snapuserd_argv->emplace_back(std::move(message));
}
-
- SetReadAheadSize(cow_image_device, kCowReadAheadSizeKb);
- SetReadAheadSize(source_device, kSourceReadAheadSizeKb);
+ SetReadAheadSize(cow_image_device, snapshot_status.read_ahead_size());
+ SetReadAheadSize(source_device, snapshot_status.read_ahead_size());
// Do not attempt to connect to the new snapuserd yet, it hasn't
// been started. We do however want to wait for the misc device
@@ -2852,8 +2851,8 @@
return true;
}
-auto SnapshotManager::OpenFile(const std::string& file, int lock_flags)
- -> std::unique_ptr<LockedFile> {
+auto SnapshotManager::OpenFile(const std::string& file,
+ int lock_flags) -> std::unique_ptr<LockedFile> {
unique_fd fd(open(file.c_str(), O_RDONLY | O_CLOEXEC | O_NOFOLLOW));
if (fd < 0) {
PLOG(ERROR) << "Open failed: " << file;
@@ -3309,19 +3308,19 @@
LOG(INFO) << "using compression algorithm: " << compression_algorithm
<< ", max compressible block size: " << compression_factor;
}
-
- PartitionCowCreator cow_creator{
- .target_metadata = target_metadata.get(),
- .target_suffix = target_suffix,
- .target_partition = nullptr,
- .current_metadata = current_metadata.get(),
- .current_suffix = current_suffix,
- .update = nullptr,
- .extra_extents = {},
- .using_snapuserd = using_snapuserd,
- .compression_algorithm = compression_algorithm,
- .compression_factor = compression_factor,
- };
+ auto read_ahead_size =
+ android::base::GetUintProperty<uint>("ro.virtual_ab.read_ahead_size", kReadAheadSizeKb);
+ PartitionCowCreator cow_creator{.target_metadata = target_metadata.get(),
+ .target_suffix = target_suffix,
+ .target_partition = nullptr,
+ .current_metadata = current_metadata.get(),
+ .current_suffix = current_suffix,
+ .update = nullptr,
+ .extra_extents = {},
+ .using_snapuserd = using_snapuserd,
+ .compression_algorithm = compression_algorithm,
+ .compression_factor = compression_factor,
+ .read_ahead_size = read_ahead_size};
if (dap_metadata.vabc_feature_set().has_threaded()) {
cow_creator.enable_threading = dap_metadata.vabc_feature_set().threaded();
diff --git a/fs_mgr/libsnapshot/snapuserd/user-space-merge/handler_manager.cpp b/fs_mgr/libsnapshot/snapuserd/user-space-merge/handler_manager.cpp
index 711e704..ea11f0e 100644
--- a/fs_mgr/libsnapshot/snapuserd/user-space-merge/handler_manager.cpp
+++ b/fs_mgr/libsnapshot/snapuserd/user-space-merge/handler_manager.cpp
@@ -19,6 +19,7 @@
#include <android-base/logging.h>
+#include "android-base/properties.h"
#include "merge_worker.h"
#include "read_worker.h"
#include "snapuserd_core.h"
@@ -235,8 +236,10 @@
LOG(INFO) << "MonitorMerge: active-merge-threads: " << active_merge_threads_;
{
+ auto num_merge_threads = android::base::GetUintProperty<uint>(
+ "ro.virtual_ab.num_merge_threads", kMaxMergeThreads);
std::lock_guard<std::mutex> lock(lock_);
- while (active_merge_threads_ < kMaxMergeThreads && merge_handlers_.size() > 0) {
+ while (active_merge_threads_ < num_merge_threads && merge_handlers_.size() > 0) {
auto handler = merge_handlers_.front();
merge_handlers_.pop();
diff --git a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_server.h b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_server.h
index 3013c47..d9cf97f 100644
--- a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_server.h
+++ b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_server.h
@@ -39,7 +39,7 @@
namespace snapshot {
static constexpr uint32_t kMaxPacketSize = 512;
-static constexpr uint8_t kMaxMergeThreads = 2;
+
static constexpr char kBootSnapshotsWithoutSlotSwitch[] =
"/metadata/ota/snapshot-boot-without-slot-switch";