transcoding: add more dumps for jobs
bug: 154733526
test: run the following to monitor transcoding status:
watch -n 1 adb shell dumpsys media.transcoding
Change-Id: I167bae9adcff2f80b26aefb520b4ab6d493e3f9d
diff --git a/media/libmediatranscoding/TranscodingClientManager.cpp b/media/libmediatranscoding/TranscodingClientManager.cpp
index d9f3f28..3f79705 100644
--- a/media/libmediatranscoding/TranscodingClientManager.cpp
+++ b/media/libmediatranscoding/TranscodingClientManager.cpp
@@ -282,16 +282,16 @@
char buffer[SIZE];
std::scoped_lock lock{mLock};
- snprintf(buffer, SIZE, " Total num of Clients: %zu\n", mClientIdToClientMap.size());
- result.append(buffer);
-
if (mClientIdToClientMap.size() > 0) {
- snprintf(buffer, SIZE, "========== Dumping all clients =========\n");
+ snprintf(buffer, SIZE, "\n========== Dumping all clients =========\n");
result.append(buffer);
}
+ snprintf(buffer, SIZE, " Total num of Clients: %zu\n", mClientIdToClientMap.size());
+ result.append(buffer);
+
for (const auto& iter : mClientIdToClientMap) {
- snprintf(buffer, SIZE, " -- Client id: %lld name: %s\n", (long long)iter.first,
+ snprintf(buffer, SIZE, " Client %lld: pkg: %s\n", (long long)iter.first,
iter.second->mClientName.c_str());
result.append(buffer);
}
diff --git a/media/libmediatranscoding/TranscodingJobScheduler.cpp b/media/libmediatranscoding/TranscodingJobScheduler.cpp
index 8045043..d3a1836 100644
--- a/media/libmediatranscoding/TranscodingJobScheduler.cpp
+++ b/media/libmediatranscoding/TranscodingJobScheduler.cpp
@@ -21,6 +21,7 @@
#include <inttypes.h>
#include <media/TranscodingJobScheduler.h>
+#include <media/TranscodingUidPolicy.h>
#include <utils/Log.h>
#include <utility>
@@ -36,6 +37,21 @@
return String8::format("{client:%lld, job:%d}", (long long)jobKey.first, jobKey.second);
}
+//static
+const char* TranscodingJobScheduler::jobStateToString(const Job::State jobState) {
+ switch (jobState) {
+ case Job::State::NOT_STARTED:
+ return "NOT_STARTED";
+ case Job::State::RUNNING:
+ return "RUNNING";
+ case Job::State::PAUSED:
+ return "PAUSED";
+ default:
+ break;
+ }
+ return "(unknown)";
+}
+
TranscodingJobScheduler::TranscodingJobScheduler(
const std::shared_ptr<TranscoderInterface>& transcoder,
const std::shared_ptr<UidPolicyInterface>& uidPolicy,
@@ -60,24 +76,46 @@
char buffer[SIZE];
std::scoped_lock lock{mLock};
- snprintf(buffer, SIZE, " \n\n Total num of Jobs: %zu\n", mJobMap.size());
+ snprintf(buffer, SIZE, "\n========== Dumping all jobs queues =========\n");
+ result.append(buffer);
+ snprintf(buffer, SIZE, " Total num of Jobs: %zu\n", mJobMap.size());
result.append(buffer);
- if (mJobMap.size() > 0) {
- snprintf(buffer, SIZE, "========== Dumping all jobs =========\n");
- result.append(buffer);
+ std::vector<int32_t> uids(mUidSortedList.begin(), mUidSortedList.end());
+ // Exclude last uid, which is for offline queue
+ uids.pop_back();
+ std::vector<std::string> packageNames;
+ if (TranscodingUidPolicy::getNamesForUids(uids, &packageNames)) {
+ uids.push_back(OFFLINE_UID);
+ packageNames.push_back("(offline)");
}
- for (auto uidIt = mUidSortedList.begin(); uidIt != mUidSortedList.end(); uidIt++) {
- for (auto jobIt = mJobQueues[*uidIt].begin(); jobIt != mJobQueues[*uidIt].end(); jobIt++) {
- if (mJobMap.count(*jobIt) != 0) {
- TranscodingRequestParcel& request = mJobMap[*jobIt].request;
- snprintf(buffer, SIZE, "Job: %s Client: %d\n", request.sourceFilePath.c_str(),
- request.clientUid);
+ for (int32_t i = 0; i < uids.size(); i++) {
+ const uid_t uid = uids[i];
- } else {
- snprintf(buffer, SIZE, "Failed to look up Job %s \n", jobToString(*jobIt).c_str());
+ if (mJobQueues[uid].empty()) {
+ continue;
+ }
+ snprintf(buffer, SIZE, " Uid: %d, pkg: %s\n", uid,
+ packageNames.empty() ? "(unknown)" : packageNames[i].c_str());
+ result.append(buffer);
+ snprintf(buffer, SIZE, " Num of jobs: %zu\n", mJobQueues[uid].size());
+ result.append(buffer);
+ for (auto& jobKey : mJobQueues[uid]) {
+ auto jobIt = mJobMap.find(jobKey);
+ if (jobIt == mJobMap.end()) {
+ snprintf(buffer, SIZE, "Failed to look up Job %s \n", jobToString(jobKey).c_str());
+ result.append(buffer);
+ continue;
}
+ Job& job = jobIt->second;
+ TranscodingRequestParcel& request = job.request;
+ snprintf(buffer, SIZE, " Job: %s, %s, %d%%\n", jobToString(jobKey).c_str(),
+ jobStateToString(job.state), job.lastProgress);
+ result.append(buffer);
+ snprintf(buffer, SIZE, " Src: %s\n", request.sourceFilePath.c_str());
+ result.append(buffer);
+ snprintf(buffer, SIZE, " Dst: %s\n", request.destinationFilePath.c_str());
result.append(buffer);
}
}
@@ -240,6 +278,7 @@
mJobMap[jobKey].key = jobKey;
mJobMap[jobKey].uid = uid;
mJobMap[jobKey].state = Job::NOT_STARTED;
+ mJobMap[jobKey].lastProgress = 0;
mJobMap[jobKey].request = request;
mJobMap[jobKey].callback = callback;
@@ -431,6 +470,7 @@
if (callback != nullptr) {
callback->onProgressUpdate(jobId, progress);
}
+ mJobMap[jobKey].lastProgress = progress;
});
}
@@ -509,15 +549,15 @@
"mUidList and mJobQueues size mismatch");
int32_t totalJobs = 0;
- for (auto uidIt = mUidSortedList.begin(); uidIt != mUidSortedList.end(); uidIt++) {
- LOG_ALWAYS_FATAL_IF(mJobQueues.count(*uidIt) != 1, "mJobQueues count for uid %d is not 1",
- *uidIt);
- for (auto jobIt = mJobQueues[*uidIt].begin(); jobIt != mJobQueues[*uidIt].end(); jobIt++) {
- LOG_ALWAYS_FATAL_IF(mJobMap.count(*jobIt) != 1, "mJobs count for job %s is not 1",
- jobToString(*jobIt).c_str());
+ for (auto uid : mUidSortedList) {
+ LOG_ALWAYS_FATAL_IF(mJobQueues.count(uid) != 1, "mJobQueues count for uid %d is not 1",
+ uid);
+ for (auto& jobKey : mJobQueues[uid]) {
+ LOG_ALWAYS_FATAL_IF(mJobMap.count(jobKey) != 1, "mJobs count for job %s is not 1",
+ jobToString(jobKey).c_str());
}
- totalJobs += mJobQueues[*uidIt].size();
+ totalJobs += mJobQueues[uid].size();
}
LOG_ALWAYS_FATAL_IF(mJobMap.size() != totalJobs,
"mJobs size doesn't match total jobs counted from uid queues");
diff --git a/media/libmediatranscoding/TranscodingUidPolicy.cpp b/media/libmediatranscoding/TranscodingUidPolicy.cpp
index fd41f65..f0d4945 100644
--- a/media/libmediatranscoding/TranscodingUidPolicy.cpp
+++ b/media/libmediatranscoding/TranscodingUidPolicy.cpp
@@ -21,7 +21,9 @@
#include <aidl/android/media/IResourceManagerService.h>
#include <android/binder_manager.h>
#include <android/binder_process.h>
+#include <android/content/pm/IPackageManagerNative.h>
#include <binder/ActivityManager.h>
+#include <binder/IServiceManager.h>
#include <cutils/misc.h> // FIRST_APPLICATION_UID
#include <inttypes.h>
#include <media/TranscodingUidPolicy.h>
@@ -109,6 +111,28 @@
////////////////////////////////////////////////////////////////////////////
+//static
+bool TranscodingUidPolicy::getNamesForUids(const std::vector<int32_t>& uids,
+ std::vector<std::string>* names) {
+ names->clear();
+ sp<IServiceManager> sm(defaultServiceManager());
+ sp<IBinder> binder(sm->getService(String16("package_native")));
+ if (binder == nullptr) {
+ ALOGE("getService package_native failed");
+ return false;
+ }
+
+ sp<content::pm::IPackageManagerNative> packageMgr =
+ interface_cast<content::pm::IPackageManagerNative>(binder);
+ binder::Status status = packageMgr->getNamesForUids(uids, names);
+
+ if (!status.isOk() || names->size() != uids.size()) {
+ names->clear();
+ return false;
+ }
+ return true;
+}
+
TranscodingUidPolicy::TranscodingUidPolicy()
: mAm(std::make_shared<ActivityManager>()),
mUidObserver(new UidObserver(this)),
diff --git a/media/libmediatranscoding/include/media/TranscodingJobScheduler.h b/media/libmediatranscoding/include/media/TranscodingJobScheduler.h
index b6efa59..7a656d5 100644
--- a/media/libmediatranscoding/include/media/TranscodingJobScheduler.h
+++ b/media/libmediatranscoding/include/media/TranscodingJobScheduler.h
@@ -82,11 +82,12 @@
struct Job {
JobKeyType key;
uid_t uid;
- enum JobState {
+ enum State {
NOT_STARTED,
RUNNING,
PAUSED,
} state;
+ int32_t lastProgress;
TranscodingRequest request;
std::weak_ptr<ITranscodingClientCallback> callback;
};
@@ -127,6 +128,7 @@
void validateState_l();
static String8 jobToString(const JobKeyType& jobKey);
+ static const char* jobStateToString(const Job::State jobState);
};
} // namespace android
diff --git a/media/libmediatranscoding/include/media/TranscodingUidPolicy.h b/media/libmediatranscoding/include/media/TranscodingUidPolicy.h
index 8319eee..42052cb 100644
--- a/media/libmediatranscoding/include/media/TranscodingUidPolicy.h
+++ b/media/libmediatranscoding/include/media/TranscodingUidPolicy.h
@@ -47,6 +47,9 @@
void unregisterMonitorUid(uid_t uid) override;
std::unordered_set<uid_t> getTopUids() const override;
void setCallback(const std::shared_ptr<UidPolicyCallbackInterface>& cb) override;
+ // ~UidPolicyInterface
+
+ static bool getNamesForUids(const std::vector<int32_t>& uids, std::vector<std::string>* names);
private:
void onUidStateChanged(uid_t uid, int32_t procState);
diff --git a/media/libmediatranscoding/tests/TranscodingClientManager_tests.cpp b/media/libmediatranscoding/tests/TranscodingClientManager_tests.cpp
index 41f3ada..c2ca9b4 100644
--- a/media/libmediatranscoding/tests/TranscodingClientManager_tests.cpp
+++ b/media/libmediatranscoding/tests/TranscodingClientManager_tests.cpp
@@ -235,19 +235,19 @@
~TranscodingClientManagerTest() { ALOGD("TranscodingClientManagerTest destroyed"); }
void addMultipleClients() {
- EXPECT_EQ(mClientManager->addClient(mClientCallback1, kClientName,
- kClientPackage, &mClient1),
- OK);
+ EXPECT_EQ(
+ mClientManager->addClient(mClientCallback1, kClientName, kClientPackage, &mClient1),
+ OK);
EXPECT_NE(mClient1, nullptr);
- EXPECT_EQ(mClientManager->addClient(mClientCallback2, kClientName,
- kClientPackage, &mClient2),
- OK);
+ EXPECT_EQ(
+ mClientManager->addClient(mClientCallback2, kClientName, kClientPackage, &mClient2),
+ OK);
EXPECT_NE(mClient2, nullptr);
- EXPECT_EQ(mClientManager->addClient(mClientCallback3, kClientName,
- kClientPackage, &mClient3),
- OK);
+ EXPECT_EQ(
+ mClientManager->addClient(mClientCallback3, kClientName, kClientPackage, &mClient3),
+ OK);
EXPECT_NE(mClient3, nullptr);
EXPECT_EQ(mClientManager->getNumOfClients(), 3);
@@ -273,8 +273,7 @@
TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientCallback) {
// Add a client with null callback and expect failure.
std::shared_ptr<ITranscodingClient> client;
- status_t err = mClientManager->addClient(nullptr, kClientName,
- kClientPackage, &client);
+ status_t err = mClientManager->addClient(nullptr, kClientName, kClientPackage, &client);
EXPECT_EQ(err, IMediaTranscodingService::ERROR_ILLEGAL_ARGUMENT);
}
//
@@ -289,24 +288,24 @@
TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientName) {
// Add a client with invalid name and expect failure.
std::shared_ptr<ITranscodingClient> client;
- status_t err = mClientManager->addClient(mClientCallback1,
- kInvalidClientName, kClientPackage, &client);
+ status_t err = mClientManager->addClient(mClientCallback1, kInvalidClientName, kClientPackage,
+ &client);
EXPECT_EQ(err, IMediaTranscodingService::ERROR_ILLEGAL_ARGUMENT);
}
TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientPackageName) {
// Add a client with invalid packagename and expect failure.
std::shared_ptr<ITranscodingClient> client;
- status_t err = mClientManager->addClient(mClientCallback1, kClientName,
- kInvalidClientPackage, &client);
+ status_t err = mClientManager->addClient(mClientCallback1, kClientName, kInvalidClientPackage,
+ &client);
EXPECT_EQ(err, IMediaTranscodingService::ERROR_ILLEGAL_ARGUMENT);
}
TEST_F(TranscodingClientManagerTest, TestAddingValidClient) {
// Add a valid client, should succeed.
std::shared_ptr<ITranscodingClient> client;
- status_t err = mClientManager->addClient(mClientCallback1, kClientName,
- kClientPackage, &client);
+ status_t err =
+ mClientManager->addClient(mClientCallback1, kClientName, kClientPackage, &client);
EXPECT_EQ(err, OK);
EXPECT_NE(client.get(), nullptr);
EXPECT_EQ(mClientManager->getNumOfClients(), 1);
@@ -319,15 +318,14 @@
TEST_F(TranscodingClientManagerTest, TestAddingDupliacteClient) {
std::shared_ptr<ITranscodingClient> client;
- status_t err = mClientManager->addClient(mClientCallback1, kClientName,
- kClientPackage, &client);
+ status_t err =
+ mClientManager->addClient(mClientCallback1, kClientName, kClientPackage, &client);
EXPECT_EQ(err, OK);
EXPECT_NE(client.get(), nullptr);
EXPECT_EQ(mClientManager->getNumOfClients(), 1);
std::shared_ptr<ITranscodingClient> dupClient;
- err = mClientManager->addClient(mClientCallback1, "dupClient",
- "dupPackage", &dupClient);
+ err = mClientManager->addClient(mClientCallback1, "dupClient", "dupPackage", &dupClient);
EXPECT_EQ(err, IMediaTranscodingService::ERROR_ALREADY_EXISTS);
EXPECT_EQ(dupClient.get(), nullptr);
EXPECT_EQ(mClientManager->getNumOfClients(), 1);
@@ -474,8 +472,8 @@
TEST_F(TranscodingClientManagerTest, TestUseAfterUnregister) {
// Add a client.
std::shared_ptr<ITranscodingClient> client;
- status_t err = mClientManager->addClient(mClientCallback1, kClientName,
- kClientPackage, &client);
+ status_t err =
+ mClientManager->addClient(mClientCallback1, kClientName, kClientPackage, &client);
EXPECT_EQ(err, OK);
EXPECT_NE(client.get(), nullptr);