blob: 478d4c8a270c6cddffd541a0d79fe0da849f3af8 [file] [log] [blame]
// Copyright (C) 2023 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#pragma once
#include "worker.h"
#include <liburing.h>
namespace android {
namespace snapshot {
class MergeWorker : public Worker {
public:
MergeWorker(const std::string& cow_device, const std::string& misc_name,
const std::string& base_path_merge, std::shared_ptr<SnapshotHandler> snapuserd);
bool Run();
private:
int PrepareMerge(uint64_t* source_offset, int* pending_ops,
std::vector<const CowOperation*>* replace_zero_vec = nullptr);
bool MergeReplaceZeroOps();
bool MergeOrderedOps();
bool MergeOrderedOpsAsync();
bool Merge();
bool AsyncMerge();
bool SyncMerge();
bool InitializeIouring();
void FinalizeIouring();
private:
BufferSink bufsink_;
std::unique_ptr<ICowOpIter> cowop_iter_;
std::unique_ptr<struct io_uring> ring_;
size_t ra_block_index_ = 0;
uint64_t blocks_merged_in_group_ = 0;
bool merge_async_ = false;
// Queue depth of 8 seems optimal. We don't want
// to have a huge depth as it may put more memory pressure
// on the kernel worker threads given that we use
// IOSQE_ASYNC flag - ASYNC flags can potentially
// result in EINTR; Since we don't restart
// syscalls and fallback to synchronous I/O, we
// don't want huge queue depth
int queue_depth_ = 8;
};
} // namespace snapshot
} // namespace android