Per UID DataLoader API.

Bug: 160634487
Test: atest PackageManagerShellCommandTest PackageManagerShellCommandIncrementalTest IncrementalServiceTest PackageManagerServiceTest ChecksumsTest

Change-Id: Id423d838ac7950696b5f75bec2d1610fbc929210
This commit is contained in:
Alex Buynytskyy
2021-01-29 11:07:33 -08:00
parent 4f3e949354
commit 2b2f5f7c5f
4 changed files with 74 additions and 52 deletions

View File

@@ -122,6 +122,7 @@ import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.URISyntaxException;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Base64;
import java.util.Collection;
@@ -155,6 +156,8 @@ class PackageManagerShellCommand extends ShellCommand {
boolean mComponents;
int mQueryFlags;
private static final SecureRandom RANDOM = new SecureRandom();
PackageManagerShellCommand(PackageManagerService service, Context context) {
mInterface = service;
mLegacyPermissionManager = LocalServices.getService(LegacyPermissionManagerInternal.class);
@@ -3146,7 +3149,7 @@ class PackageManagerShellCommand extends ShellCommand {
// 1. Single file from stdin.
if (args.isEmpty() || STDIN_PATH.equals(args.get(0))) {
final String name = "base." + (isApex ? "apex" : "apk");
final String name = "base" + RANDOM.nextInt() + "." + (isApex ? "apex" : "apk");
final Metadata metadata = Metadata.forStdIn(name);
session.addFile(LOCATION_DATA_APP, name, sessionSizeBytes,
metadata.toByteArray(), null);

View File

@@ -22,6 +22,7 @@
#include <android-base/stringprintf.h>
#include <android-base/unique_fd.h>
#include <core_jni_helpers.h>
#include <cutils/multiuser.h>
#include <cutils/trace.h>
#include <endian.h>
#include <nativehelper/JNIHelp.h>
@@ -375,6 +376,9 @@ public:
}
private:
// Bitmask of supported features.
DataLoaderFeatures getFeatures() const final { return DATA_LOADER_FEATURE_UID; }
// Lifecycle.
bool onCreate(const android::dataloader::DataLoaderParams& params,
android::dataloader::FilesystemConnectorPtr ifs,
@@ -554,51 +558,6 @@ private:
return true;
}
// Read tracing.
struct TracedRead {
uint64_t timestampUs;
android::dataloader::FileId fileId;
uint32_t firstBlockIdx;
uint32_t count;
};
void onPageReads(android::dataloader::PageReads pageReads) final {
auto trace = atrace_is_tag_enabled(ATRACE_TAG);
if (CC_LIKELY(!trace)) {
return;
}
TracedRead last = {};
for (auto&& read : pageReads) {
if (read.id != last.fileId || read.block != last.firstBlockIdx + last.count) {
traceRead(last);
last = TracedRead{
.timestampUs = read.bootClockTsUs,
.fileId = read.id,
.firstBlockIdx = (uint32_t)read.block,
.count = 1,
};
} else {
++last.count;
}
}
traceRead(last);
}
void traceRead(const TracedRead& read) {
if (!read.count) {
return;
}
FileIdx fileIdx = convertFileIdToFileIndex(read.fileId);
auto str = android::base::StringPrintf("page_read: index=%lld count=%lld file=%d",
static_cast<long long>(read.firstBlockIdx),
static_cast<long long>(read.count),
static_cast<int>(fileIdx));
ATRACE_BEGIN(str.c_str());
ATRACE_END();
}
// Streaming.
bool initStreaming(unique_fd inout, MetadataMode mode) {
mEventFd.reset(eventfd(0, EFD_CLOEXEC));
@@ -634,7 +593,10 @@ private:
}
// IFS callbacks.
void onPendingReads(dataloader::PendingReads pendingReads) final {
void onPendingReads(dataloader::PendingReads pendingReads) final {}
void onPageReads(dataloader::PageReads pageReads) final {}
void onPendingReadsWithUid(dataloader::PendingReadsWithUid pendingReads) final {
std::lock_guard lock{mOutFdLock};
if (mOutFd < 0) {
return;
@@ -660,6 +622,67 @@ private:
}
}
// Read tracing.
struct TracedRead {
uint64_t timestampUs;
android::dataloader::FileId fileId;
android::dataloader::Uid uid;
uint32_t firstBlockIdx;
uint32_t count;
};
void onPageReadsWithUid(dataloader::PageReadsWithUid pageReads) final {
auto trace = atrace_is_tag_enabled(ATRACE_TAG);
if (CC_LIKELY(!trace)) {
return;
}
TracedRead last = {};
for (auto&& read : pageReads) {
if (read.id != last.fileId || read.uid != last.uid ||
read.block != last.firstBlockIdx + last.count) {
traceRead(last);
last = TracedRead{
.timestampUs = read.bootClockTsUs,
.fileId = read.id,
.uid = read.uid,
.firstBlockIdx = (uint32_t)read.block,
.count = 1,
};
} else {
++last.count;
}
}
traceRead(last);
}
void traceRead(const TracedRead& read) {
if (!read.count) {
return;
}
FileIdx fileIdx = convertFileIdToFileIndex(read.fileId);
std::string trace;
if (read.uid != kIncFsNoUid) {
auto appId = multiuser_get_app_id(read.uid);
auto userId = multiuser_get_user_id(read.uid);
trace = android::base::
StringPrintf("page_read: index=%lld count=%lld file=%d appid=%d userid=%d",
static_cast<long long>(read.firstBlockIdx),
static_cast<long long>(read.count), static_cast<int>(fileIdx),
static_cast<int>(appId), static_cast<int>(userId));
} else {
trace = android::base::StringPrintf("page_read: index=%lld count=%lld file=%d",
static_cast<long long>(read.firstBlockIdx),
static_cast<long long>(read.count),
static_cast<int>(fileIdx));
}
ATRACE_BEGIN(trace.c_str());
ATRACE_END();
}
void receiver(unique_fd inout, MetadataMode mode) {
std::vector<uint8_t> data;
std::vector<IncFsDataBlock> instructions;

View File

@@ -1091,7 +1091,7 @@ void IncrementalService::setUidReadTimeouts(
maxPendingTimeUs = std::max(maxPendingTimeUs, microseconds(timeouts.maxPendingTimeUs));
}
if (maxPendingTimeUs < Constants::minPerUidTimeout) {
LOG(ERROR) << "Skip setting timeouts: maxPendingTime < Constants::minPerUidTimeout"
LOG(ERROR) << "Skip setting read timeouts (maxPendingTime < Constants::minPerUidTimeout): "
<< duration_cast<milliseconds>(maxPendingTimeUs).count() << "ms < "
<< Constants::minPerUidTimeout.count() << "ms";
return;

View File

@@ -221,10 +221,6 @@ public:
timeout.maxPendingTimeUs = perUidTimeout.maxPendingTimeUs;
}
LOG(ERROR) << "Set read timeouts: " << timeouts.size() << " ["
<< (timeouts.empty() ? -1 : timeouts.front().uid) << "@"
<< (timeouts.empty() ? -1 : timeouts.front().minTimeUs / 1000) << "ms]";
return incfs::setUidReadTimeouts(control, timeouts);
}
};