Merge "Update TrainInfo and BinaryPushStateChanged atoms"
This commit is contained in:
committed by
Android (Google) Code Review
commit
7e477caf01
@@ -1210,20 +1210,22 @@ Status StatsService::sendBinaryPushStateChangedAtom(const android::String16& tra
|
||||
(long long)expId);
|
||||
}
|
||||
|
||||
vector<uint8_t> buffer;
|
||||
buffer.resize(proto.size());
|
||||
vector<uint8_t> experimentIdsProtoBuffer;
|
||||
experimentIdsProtoBuffer.resize(proto.size());
|
||||
size_t pos = 0;
|
||||
auto iter = proto.data();
|
||||
while (iter.readBuffer() != NULL) {
|
||||
size_t toRead = iter.currentToRead();
|
||||
std::memcpy(&(buffer[pos]), iter.readBuffer(), toRead);
|
||||
std::memcpy(&(experimentIdsProtoBuffer[pos]), iter.readBuffer(), toRead);
|
||||
pos += toRead;
|
||||
iter.rp()->move(toRead);
|
||||
}
|
||||
LogEvent event(std::string(String8(trainName).string()), trainVersionCode, requiresStaging,
|
||||
rollbackEnabled, requiresLowLatencyMonitor, state, buffer, userId);
|
||||
|
||||
std::string trainNameUtf8 = std::string(String8(trainName).string());
|
||||
LogEvent event(trainNameUtf8, trainVersionCode, requiresStaging, rollbackEnabled,
|
||||
requiresLowLatencyMonitor, state, experimentIdsProtoBuffer, userId);
|
||||
mProcessor->OnLogEvent(&event);
|
||||
StorageManager::writeTrainInfo(trainVersionCode, buffer);
|
||||
StorageManager::writeTrainInfo(trainVersionCode, trainNameUtf8, state, experimentIdsProtoBuffer);
|
||||
return Status::ok();
|
||||
}
|
||||
|
||||
|
||||
@@ -3243,8 +3243,18 @@ message BinaryPushStateChanged {
|
||||
INSTALL_FAILURE = 6;
|
||||
INSTALL_CANCELLED = 7;
|
||||
INSTALLER_ROLLBACK_REQUESTED = 8;
|
||||
INSTALLER_ROLLBACK_SUCCESS = 9;
|
||||
INSTALLER_ROLLBACK_FAILURE = 10;
|
||||
INSTALLER_ROLLBACK_INITIATED = 9;
|
||||
INSTALLER_ROLLBACK_INITIATED_FAILURE = 10;
|
||||
INSTALLER_ROLLBACK_STAGED = 11;
|
||||
INSTALLER_ROLLBACK_STAGED_FAILURE = 12;
|
||||
INSTALLER_ROLLBACK_BOOT_TRIGGERED = 13;
|
||||
INSTALLER_ROLLBACK_BOOT_TRIGGERED_FAILURE = 14;
|
||||
INSTALLER_ROLLBACK_SUCCESS = 15;
|
||||
INSTALLER_ROLLBACK_FAILURE = 16;
|
||||
INSTALLER_ROLLBACK_CANCEL_STAGED_REMOVE_FROM_QUEUE = 17;
|
||||
INSTALLER_ROLLBACK_CANCEL_STAGED_DELETE_SESSION_INITIATED = 18;
|
||||
INSTALLER_ROLLBACK_CANCEL_STAGED_DELETE_SESSION_SUCCESS = 19;
|
||||
INSTALLER_ROLLBACK_CANCEL_STAGED_DELETE_SESSION_FAILURE = 20;
|
||||
}
|
||||
optional State state = 6;
|
||||
// Possible experiment ids for monitoring this push.
|
||||
@@ -5653,6 +5663,33 @@ message TrainInfo {
|
||||
optional int64 train_version_code = 1;
|
||||
|
||||
optional TrainExperimentIds train_experiment_id = 2;
|
||||
|
||||
optional string train_name = 3;
|
||||
|
||||
enum Status {
|
||||
UNKNOWN = 0;
|
||||
INSTALL_REQUESTED = 1;
|
||||
INSTALL_STARTED = 2;
|
||||
INSTALL_STAGED_NOT_READY = 3;
|
||||
INSTALL_STAGED_READY = 4;
|
||||
INSTALL_SUCCESS = 5;
|
||||
INSTALL_FAILURE = 6;
|
||||
INSTALL_CANCELLED = 7;
|
||||
INSTALLER_ROLLBACK_REQUESTED = 8;
|
||||
INSTALLER_ROLLBACK_INITIATED = 9;
|
||||
INSTALLER_ROLLBACK_INITIATED_FAILURE = 10;
|
||||
INSTALLER_ROLLBACK_STAGED = 11;
|
||||
INSTALLER_ROLLBACK_STAGED_FAILURE = 12;
|
||||
INSTALLER_ROLLBACK_BOOT_TRIGGERED = 13;
|
||||
INSTALLER_ROLLBACK_BOOT_TRIGGERED_FAILURE = 14;
|
||||
INSTALLER_ROLLBACK_SUCCESS = 15;
|
||||
INSTALLER_ROLLBACK_FAILURE = 16;
|
||||
INSTALLER_ROLLBACK_CANCEL_STAGED_REMOVE_FROM_QUEUE = 17;
|
||||
INSTALLER_ROLLBACK_CANCEL_STAGED_DELETE_SESSION_INITIATED = 18;
|
||||
INSTALLER_ROLLBACK_CANCEL_STAGED_DELETE_SESSION_SUCCESS = 19;
|
||||
INSTALLER_ROLLBACK_CANCEL_STAGED_DELETE_SESSION_FAILURE = 20;
|
||||
}
|
||||
optional Status status = 4;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -238,9 +238,12 @@ LogEvent::LogEvent(int64_t wallClockTimestampNs, int64_t elapsedTimestampNs,
|
||||
mLogdTimestampNs = wallClockTimestampNs;
|
||||
mElapsedTimestampNs = elapsedTimestampNs;
|
||||
mTagId = android::util::TRAIN_INFO;
|
||||
|
||||
mValues.push_back(
|
||||
FieldValue(Field(mTagId, getSimpleField(1)), Value(trainInfo.trainVersionCode)));
|
||||
mValues.push_back(FieldValue(Field(mTagId, getSimpleField(2)), Value(trainInfo.experimentIds)));
|
||||
mValues.push_back(FieldValue(Field(mTagId, getSimpleField(3)), Value(trainInfo.trainName)));
|
||||
mValues.push_back(FieldValue(Field(mTagId, getSimpleField(4)), Value(trainInfo.status)));
|
||||
}
|
||||
|
||||
LogEvent::LogEvent(int32_t tagId, int64_t timestampNs) : LogEvent(tagId, timestampNs, 0) {}
|
||||
|
||||
@@ -58,6 +58,8 @@ struct AttributionNodeInternal {
|
||||
|
||||
struct InstallTrainInfo {
|
||||
int64_t trainVersionCode;
|
||||
std::string trainName;
|
||||
int32_t status;
|
||||
std::vector<uint8_t> experimentIds;
|
||||
};
|
||||
/**
|
||||
|
||||
@@ -95,8 +95,8 @@ void StorageManager::writeFile(const char* file, const void* buffer, int numByte
|
||||
close(fd);
|
||||
}
|
||||
|
||||
bool StorageManager::writeTrainInfo(int64_t trainVersionCode,
|
||||
const std::vector<uint8_t>& experimentIds) {
|
||||
bool StorageManager::writeTrainInfo(int64_t trainVersionCode, const std::string& trainName,
|
||||
int32_t status, const std::vector<uint8_t>& experimentIds) {
|
||||
std::lock_guard<std::mutex> lock(sTrainInfoMutex);
|
||||
|
||||
deleteAllFiles(TRAIN_INFO_DIR);
|
||||
@@ -109,7 +109,34 @@ bool StorageManager::writeTrainInfo(int64_t trainVersionCode,
|
||||
return false;
|
||||
}
|
||||
|
||||
size_t result = write(fd, experimentIds.data(), experimentIds.size());
|
||||
size_t result;
|
||||
|
||||
// Write # of bytes in trainName to file
|
||||
const size_t trainNameSize = trainName.size();
|
||||
const size_t trainNameSizeByteCount = sizeof(trainNameSize);
|
||||
result = write(fd, (uint8_t*)&trainNameSize, trainNameSizeByteCount);
|
||||
if (result != trainNameSizeByteCount) {
|
||||
VLOG("Failed to write %s", file_name.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
// Write trainName to file
|
||||
result = write(fd, trainName.c_str(), trainNameSize);
|
||||
if (result != trainNameSize) {
|
||||
VLOG("Failed to write %s", file_name.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
// Write status to file
|
||||
const size_t statusByteCount = sizeof(status);
|
||||
result = write(fd, (uint8_t*)&status, statusByteCount);
|
||||
if (result != statusByteCount) {
|
||||
VLOG("Failed to write %s", file_name.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
// Write experimentIds to file
|
||||
result = write(fd, experimentIds.data(), experimentIds.size());
|
||||
if (result == experimentIds.size()) {
|
||||
VLOG("Successfully wrote %s", file_name.c_str());
|
||||
} else {
|
||||
@@ -150,7 +177,27 @@ bool StorageManager::readTrainInfo(InstallTrainInfo& trainInfo) {
|
||||
string str;
|
||||
if (android::base::ReadFdToString(fd, &str)) {
|
||||
close(fd);
|
||||
std::copy(str.begin(), str.end(), std::back_inserter(trainInfo.experimentIds));
|
||||
|
||||
auto it = str.begin();
|
||||
|
||||
// Read # of bytes taken by trainName in the file
|
||||
size_t trainNameSize;
|
||||
const size_t trainNameSizeByteCount = sizeof(trainNameSize);
|
||||
std::copy_n(it, trainNameSizeByteCount, &trainNameSize);
|
||||
it += trainNameSizeByteCount;
|
||||
|
||||
// Read trainName
|
||||
std::copy_n(it, trainNameSize, std::back_inserter(trainInfo.trainName));
|
||||
it += trainNameSize;
|
||||
|
||||
// Read status
|
||||
const size_t statusByteCount = sizeof(trainInfo.status);
|
||||
std::copy_n(it, statusByteCount, &trainInfo.status);
|
||||
it += statusByteCount;
|
||||
|
||||
// Read experimentIds
|
||||
std::copy(it, str.end(), std::back_inserter(trainInfo.experimentIds));
|
||||
|
||||
VLOG("Read train info file successful: %s", fullPath.c_str());
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -44,7 +44,8 @@ public:
|
||||
/**
|
||||
* Writes train info.
|
||||
*/
|
||||
static bool writeTrainInfo(int64_t trainVersionCode, const std::vector<uint8_t>& experimentIds);
|
||||
static bool writeTrainInfo(int64_t trainVersionCode, const std::string& trainName,
|
||||
int32_t status, const std::vector<uint8_t>& experimentIds);
|
||||
|
||||
/**
|
||||
* Reads train info.
|
||||
|
||||
@@ -32,16 +32,82 @@ using testing::Contains;
|
||||
TEST(StorageManagerTest, TrainInfoReadWriteTest) {
|
||||
InstallTrainInfo trainInfo;
|
||||
trainInfo.trainVersionCode = 12345;
|
||||
trainInfo.trainName = "This is a train name #)$(&&$";
|
||||
trainInfo.status = 1;
|
||||
const char* expIds = "test_ids";
|
||||
trainInfo.experimentIds.assign(expIds, expIds + strlen(expIds));
|
||||
|
||||
StorageManager::writeTrainInfo(trainInfo.trainVersionCode, trainInfo.experimentIds);
|
||||
bool result;
|
||||
|
||||
InstallTrainInfo result;
|
||||
StorageManager::readTrainInfo(result);
|
||||
EXPECT_EQ(trainInfo.trainVersionCode, result.trainVersionCode);
|
||||
EXPECT_EQ(trainInfo.experimentIds.size(), result.experimentIds.size());
|
||||
EXPECT_EQ(trainInfo.experimentIds, result.experimentIds);
|
||||
result = StorageManager::writeTrainInfo(trainInfo.trainVersionCode, trainInfo.trainName,
|
||||
trainInfo.status, trainInfo.experimentIds);
|
||||
|
||||
EXPECT_TRUE(result);
|
||||
|
||||
InstallTrainInfo trainInfoResult;
|
||||
result = StorageManager::readTrainInfo(trainInfoResult);
|
||||
EXPECT_TRUE(result);
|
||||
|
||||
EXPECT_EQ(trainInfo.trainVersionCode, trainInfoResult.trainVersionCode);
|
||||
EXPECT_EQ(trainInfo.trainName.size(), trainInfoResult.trainName.size());
|
||||
EXPECT_EQ(trainInfo.trainName, trainInfoResult.trainName);
|
||||
EXPECT_EQ(trainInfo.status, trainInfoResult.status);
|
||||
EXPECT_EQ(trainInfo.experimentIds.size(), trainInfoResult.experimentIds.size());
|
||||
EXPECT_EQ(trainInfo.experimentIds, trainInfoResult.experimentIds);
|
||||
}
|
||||
|
||||
TEST(StorageManagerTest, TrainInfoReadWriteEmptyTrainNameTest) {
|
||||
InstallTrainInfo trainInfo;
|
||||
trainInfo.trainVersionCode = 12345;
|
||||
trainInfo.trainName = "";
|
||||
trainInfo.status = 1;
|
||||
const char* expIds = "test_ids";
|
||||
trainInfo.experimentIds.assign(expIds, expIds + strlen(expIds));
|
||||
|
||||
bool result;
|
||||
|
||||
result = StorageManager::writeTrainInfo(trainInfo.trainVersionCode, trainInfo.trainName,
|
||||
trainInfo.status, trainInfo.experimentIds);
|
||||
|
||||
EXPECT_TRUE(result);
|
||||
|
||||
InstallTrainInfo trainInfoResult;
|
||||
result = StorageManager::readTrainInfo(trainInfoResult);
|
||||
EXPECT_TRUE(result);
|
||||
|
||||
EXPECT_EQ(trainInfo.trainVersionCode, trainInfoResult.trainVersionCode);
|
||||
EXPECT_EQ(trainInfo.trainName.size(), trainInfoResult.trainName.size());
|
||||
EXPECT_EQ(trainInfo.trainName, trainInfoResult.trainName);
|
||||
EXPECT_EQ(trainInfo.status, trainInfoResult.status);
|
||||
EXPECT_EQ(trainInfo.experimentIds.size(), trainInfoResult.experimentIds.size());
|
||||
EXPECT_EQ(trainInfo.experimentIds, trainInfoResult.experimentIds);
|
||||
}
|
||||
|
||||
TEST(StorageManagerTest, TrainInfoReadWriteTrainNameSizeOneTest) {
|
||||
InstallTrainInfo trainInfo;
|
||||
trainInfo.trainVersionCode = 12345;
|
||||
trainInfo.trainName = "{";
|
||||
trainInfo.status = 1;
|
||||
const char* expIds = "test_ids";
|
||||
trainInfo.experimentIds.assign(expIds, expIds + strlen(expIds));
|
||||
|
||||
bool result;
|
||||
|
||||
result = StorageManager::writeTrainInfo(trainInfo.trainVersionCode, trainInfo.trainName,
|
||||
trainInfo.status, trainInfo.experimentIds);
|
||||
|
||||
EXPECT_TRUE(result);
|
||||
|
||||
InstallTrainInfo trainInfoResult;
|
||||
result = StorageManager::readTrainInfo(trainInfoResult);
|
||||
EXPECT_TRUE(result);
|
||||
|
||||
EXPECT_EQ(trainInfo.trainVersionCode, trainInfoResult.trainVersionCode);
|
||||
EXPECT_EQ(trainInfo.trainName.size(), trainInfoResult.trainName.size());
|
||||
EXPECT_EQ(trainInfo.trainName, trainInfoResult.trainName);
|
||||
EXPECT_EQ(trainInfo.status, trainInfoResult.status);
|
||||
EXPECT_EQ(trainInfo.experimentIds.size(), trainInfoResult.experimentIds.size());
|
||||
EXPECT_EQ(trainInfo.experimentIds, trainInfoResult.experimentIds);
|
||||
}
|
||||
|
||||
} // namespace statsd
|
||||
|
||||
Reference in New Issue
Block a user