Skip to content
This repository was archived by the owner on Mar 24, 2026. It is now read-only.

Commit f9bcca0

Browse files
Privacy Sandbox Teamcopybara-github
authored andcommitted
feat: Adjust prime sieve udf to calculate primes for a specified duration
Bug: b/409344921 Change-Id: I4bf716fe954d43a9fc61aba79c0d7cf137a11263 GitOrigin-RevId: aac782eb2564bcaace0ed1d7dcb51e4aac6c8149
1 parent 4e7c4ce commit f9bcca0

6 files changed

Lines changed: 53 additions & 15 deletions

File tree

src/roma/byob/benchmark/roma_byob_rpc_factory.h

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "absl/status/statusor.h"
2727
#include "absl/synchronization/blocking_counter.h"
2828
#include "absl/time/time.h"
29+
#include "google/protobuf/util/time_util.h"
2930
#include "src/roma/byob/config/config.h"
3031
#include "src/roma/byob/interface/roma_service.h"
3132
#include "src/roma/byob/sample_udf/sample_udf_interface.pb.h"
@@ -57,7 +58,7 @@ std::pair<ExecutionFunc, CleanupFunc> CreateByobRpcFunc(
5758
Mode mode, std::atomic<std::int64_t>& completions,
5859
SyscallFiltering syscall_filtering, bool disable_ipc_namespace,
5960
absl::Duration connection_timeout, std::string_view function_name,
60-
int prime_count) {
61+
const std::vector<std::string>& input_args) {
6162
std::unique_ptr<AppService> roma_service = std::make_unique<AppService>();
6263
CHECK_OK(roma_service->Init(
6364
/*config=*/{.lib_mounts = std::string(lib_mounts),
@@ -72,8 +73,19 @@ std::pair<ExecutionFunc, CleanupFunc> CreateByobRpcFunc(
7273
::privacy_sandbox::roma_byob::example::SampleRequest request;
7374
if (function_name == "PrimeSieve") {
7475
request.set_function(FUNCTION_PRIME_SIEVE);
75-
if (prime_count > 0) {
76-
request.set_prime_count(prime_count);
76+
77+
if (!input_args.empty()) {
78+
int prime_count = 0;
79+
absl::Duration prime_duration;
80+
if (absl::SimpleAtoi(input_args[0], &prime_count)) {
81+
LOG(INFO) << "Running PrimeSieve with prime count: " << prime_count;
82+
request.set_prime_count(prime_count);
83+
} else if (absl::ParseDuration(input_args[0], &prime_duration)) {
84+
LOG(INFO) << "Running PrimeSieve for duration: " << prime_duration;
85+
*request.mutable_duration() =
86+
google::protobuf::util::TimeUtil::NanosecondsToDuration(
87+
absl::ToInt64Nanoseconds(prime_duration));
88+
}
7789
}
7890
} else if (function_name == "Clone") {
7991
request.set_function(FUNCTION_CLONE);

src/roma/byob/sample_udf/BUILD.bazel

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,10 @@ proto_library(
3636
name = "sample_proto",
3737
srcs = ["sample.proto"],
3838
visibility = ["//src/roma/byob:__subpackages__"],
39-
deps = ["//apis/privacysandbox/apis/roma/app_api/v1:options_proto"],
39+
deps = [
40+
"//apis/privacysandbox/apis/roma/app_api/v1:options_proto",
41+
"@com_google_protobuf//:duration_proto",
42+
],
4043
)
4144

4245
cc_proto_library(
@@ -106,6 +109,7 @@ sample_api = declare_roma_api(
106109
roma_byob_sdk(
107110
name = "sample_byob_sdk",
108111
generated_proto_path = "generated/sample.proto",
112+
proto_deps = ["@com_google_protobuf//:duration_proto"],
109113
roma_app_api = sample_api,
110114
visibility = ["//visibility:public"],
111115
)
@@ -266,7 +270,9 @@ cc_binary(
266270
visibility = ["//visibility:public"],
267271
deps = [
268272
":sample_byob_sdk_cc_proto",
273+
"//src/util:duration",
269274
"@com_google_absl//absl/log",
275+
"@com_google_absl//absl/time",
270276
"@com_google_protobuf//:protobuf",
271277
],
272278
)

src/roma/byob/sample_udf/generated/sample.proto

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ package privacy_sandbox.roma_byob.example;
2828

2929

3030

31+
import "google/protobuf/duration.proto";
3132

3233
//
3334
// UDF rpc: Sample
@@ -42,6 +43,8 @@ message SampleRequest {
4243
FunctionType function = 1;
4344
// The count of prime numbers to generate.
4445
int32 prime_count = 2;
46+
// The duration of RunPrimeSieve.
47+
google.protobuf.Duration duration = 3;
4548
}
4649

4750
// SampleResponse returns the function's output.

src/roma/byob/sample_udf/sample.proto

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,15 @@ syntax = "proto3";
1717
package privacy_sandbox.server_common.byob;
1818

1919
import "apis/privacysandbox/apis/roma/app_api/v1/options.proto";
20+
import "google/protobuf/duration.proto";
2021

2122
service SampleService {
2223
option (privacysandbox.apis.roma.app_api.v1.roma_svc_annotation) = {
2324
name: 'Sample Server',
2425
roma_app_name: 'SampleServer',
2526
description: 'A sample server showcasing declarative APIs for BYOB',
26-
cpp_namespace: 'privacy_sandbox::roma_byob::example'
27+
cpp_namespace: 'privacy_sandbox::roma_byob::example',
28+
proto_imports: ['google/protobuf/duration.proto'],
2729
};
2830

2931
rpc Sample(SampleRequest) returns (SampleResponse) {
@@ -114,6 +116,10 @@ message SampleRequest {
114116
int32 prime_count = 2 [
115117
(privacysandbox.apis.roma.app_api.v1.roma_field_annotation) = {description: 'The count of prime numbers to generate.'}
116118
];
119+
google.protobuf.Duration duration = 3
120+
[(privacysandbox.apis.roma.app_api.v1.roma_field_annotation) = {
121+
description: 'The duration of RunPrimeSieve.'
122+
}];
117123
}
118124

119125
message SampleResponse {

src/roma/byob/sample_udf/sample_udf.cc

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,11 @@
2222
#include <vector>
2323

2424
#include "absl/log/log.h"
25+
#include "absl/time/time.h"
2526
#include "google/protobuf/util/delimited_message_util.h"
27+
#include "google/protobuf/util/time_util.h"
2628
#include "src/roma/byob/sample_udf/sample_udf_interface.pb.h"
29+
#include "src/util/duration.h"
2730

2831
using ::google::protobuf::io::FileInputStream;
2932
using ::privacy_sandbox::roma_byob::example::FUNCTION_CLONE;
@@ -43,20 +46,35 @@ void RunHelloWorld(SampleResponse& bin_response) {
4346
void RunPrimeSieve(SampleRequest& bin_request, SampleResponse& bin_response) {
4447
int prime_count =
4548
bin_request.prime_count() > 0 ? bin_request.prime_count() : kPrimeCount;
49+
int duration_ns = google::protobuf::util::TimeUtil::DurationToNanoseconds(
50+
bin_request.duration());
51+
absl::Duration duration = absl::Nanoseconds(duration_ns);
52+
bool use_duration = duration_ns > 0;
53+
double sqrt_prime_count = sqrt(prime_count);
4654

4755
// Create a boolean array of size n+1
4856
std::vector<bool> primes(prime_count + 1, true);
4957
// Set first two values to false
5058
primes[0] = false;
5159
primes[1] = false;
5260
// Loop through the elements
53-
for (int i = 2; i <= sqrt(prime_count); i++) {
61+
privacy_sandbox::server_common::Stopwatch stopwatch;
62+
for (int i = 2; i <= sqrt_prime_count; i++) {
5463
if (primes[i]) {
5564
for (int j = i * i; j <= prime_count; j += i) {
5665
primes[j] = false;
5766
}
5867
}
68+
69+
if (use_duration) {
70+
if (stopwatch.GetElapsedTime() >= duration) {
71+
break;
72+
} else if (i + 1 > sqrt_prime_count) {
73+
i = 1; // Reset to restart the sieve if time remains
74+
}
75+
}
5976
}
77+
6078
// Loop through the array from 2 to n
6179
for (int i = 2; i <= prime_count; i++) {
6280
if (primes[i]) {

src/roma/traffic_generator/traffic_generator.cc

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -250,14 +250,7 @@ TrafficGenerator::RpcFuncCreator TrafficGenerator::GetDefaultRpcFuncCreator() {
250250
const std::string function_name = absl::GetFlag(FLAGS_function_name);
251251
const std::vector<std::string> input_args = absl::GetFlag(FLAGS_input_args);
252252

253-
int prime_count = 0;
254-
if (function_name == "PrimeSieve" && !input_args.empty() &&
255-
absl::SimpleAtoi(input_args[0], &prime_count)) {
256-
LOG(INFO) << "Running PrimeSieve with prime count: " << prime_count;
257-
}
258-
259-
return [function_name, input_args,
260-
prime_count](std::atomic<std::int64_t>& completions)
253+
return [function_name, input_args](std::atomic<std::int64_t>& completions)
261254
-> std::pair<ExecutionFunc, CleanupFunc> {
262255
return (absl::GetFlag(FLAGS_mode) == "byob")
263256
? CreateByobRpcFunc(absl::GetFlag(FLAGS_num_workers),
@@ -267,7 +260,7 @@ TrafficGenerator::RpcFuncCreator TrafficGenerator::GetDefaultRpcFuncCreator() {
267260
absl::GetFlag(FLAGS_syscall_filtering),
268261
absl::GetFlag(FLAGS_disable_ipc_namespace),
269262
absl::GetFlag(FLAGS_byob_connection_timeout),
270-
function_name, prime_count)
263+
function_name, input_args)
271264
: CreateV8RpcFunc(absl::GetFlag(FLAGS_num_workers),
272265
absl::GetFlag(FLAGS_udf_path), function_name,
273266
input_args, completions);

0 commit comments

Comments
 (0)