Skip to content

Commit

Permalink
Refactoring: Add TimeoutContext (#2976)
Browse files Browse the repository at this point in the history
  • Loading branch information
CTMBNara authored Feb 26, 2024
1 parent 3ddbe47 commit 7cf656a
Show file tree
Hide file tree
Showing 21 changed files with 266 additions and 341 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -488,7 +488,7 @@ private Future<CategoryMappingResult> createCategoryMapping(AuctionContext aucti
return categoryMappingService.createCategoryMapping(
bidderResponses,
auctionContext.getBidRequest(),
auctionContext.getTimeout())
auctionContext.getTimeoutContext().getTimeout())

.map(categoryMappingResult -> addCategoryMappingErrors(categoryMappingResult, auctionContext));
}
Expand Down Expand Up @@ -1253,7 +1253,7 @@ private BidResponse toBidResponse(List<BidderResponseInfo> bidderResponseInfos,
private Future<VideoStoredDataResult> videoStoredDataResult(AuctionContext auctionContext) {
final List<Imp> imps = auctionContext.getBidRequest().getImp();
final String accountId = auctionContext.getAccount().getId();
final Timeout timeout = auctionContext.getTimeout();
final Timeout timeout = auctionContext.getTimeoutContext().getTimeout();

final List<String> errors = new ArrayList<>();
final List<Imp> storedVideoInjectableImps = new ArrayList<>();
Expand Down
25 changes: 11 additions & 14 deletions src/main/java/org/prebid/server/auction/ExchangeService.java
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
import org.prebid.server.auction.model.BidderResponse;
import org.prebid.server.auction.model.MultiBidConfig;
import org.prebid.server.auction.model.StoredResponseResult;
import org.prebid.server.auction.model.TimeoutContext;
import org.prebid.server.auction.versionconverter.BidRequestOrtbVersionConversionManager;
import org.prebid.server.auction.versionconverter.OrtbVersion;
import org.prebid.server.bidder.Bidder;
Expand Down Expand Up @@ -169,7 +170,6 @@ public class ExchangeService {
private static final BigDecimal THOUSAND = BigDecimal.valueOf(1000);

private final double logSamplingRate;
private final int timeoutAdjustmentFactor;
private final BidderCatalog bidderCatalog;
private final StoredResponseProcessor storedResponseProcessor;
private final DealsService dealsService;
Expand Down Expand Up @@ -201,7 +201,6 @@ public class ExchangeService {
private final boolean enabledStrictAppSiteDoohValidation;

public ExchangeService(double logSamplingRate,
int timeoutAdjustmentFactor,
BidderCatalog bidderCatalog,
StoredResponseProcessor storedResponseProcessor,
DealsService dealsService,
Expand Down Expand Up @@ -232,11 +231,7 @@ public ExchangeService(double logSamplingRate,
CriteriaLogManager criteriaLogManager,
boolean enabledStrictAppSiteDoohValidation) {

if (timeoutAdjustmentFactor < 0 || timeoutAdjustmentFactor > 100) {
throw new IllegalArgumentException("Expected timeout adjustment factor should be in [0, 100].");
}
this.logSamplingRate = logSamplingRate;
this.timeoutAdjustmentFactor = timeoutAdjustmentFactor;
this.bidderCatalog = Objects.requireNonNull(bidderCatalog);
this.storedResponseProcessor = Objects.requireNonNull(storedResponseProcessor);
this.dealsService = dealsService;
Expand Down Expand Up @@ -292,7 +287,7 @@ private static BidResponse emptyResponse() {
private Future<AuctionContext> runAuction(AuctionContext receivedContext) {
final UidsCookie uidsCookie = receivedContext.getUidsCookie();
final BidRequest bidRequest = receivedContext.getBidRequest();
final Timeout timeout = receivedContext.getTimeout();
final Timeout timeout = receivedContext.getTimeoutContext().getTimeout();
final Account account = receivedContext.getAccount();
final List<String> debugWarnings = receivedContext.getDebugWarnings();
final MetricName requestTypeMetric = receivedContext.getRequestTypeMetric();
Expand Down Expand Up @@ -1141,15 +1136,16 @@ private Source prepareSource(String bidder, BidRequest bidRequest, boolean trans

final SupplyChain bidderSchain = supplyChainResolver.resolveForBidder(bidder, bidRequest);

if (bidderSchain == null && transmitTid) {
if (bidderSchain == null && (transmitTid || receivedSource == null)) {
return receivedSource;
}

return receivedSource == null
? Source.builder().schain(bidderSchain).build()
: receivedSource.toBuilder()
.schain(bidderSchain != null ? bidderSchain : receivedSource.getSchain())
.tid(transmitTid ? receivedSource.getTid() : null).build();
.tid(transmitTid ? receivedSource.getTid() : null)
.build();
}

/**
Expand Down Expand Up @@ -1388,11 +1384,13 @@ private Future<BidderResponse> requestBids(BidderRequest bidderRequest,
final Bidder<?> bidder = bidderCatalog.bidderByName(resolvedBidderName);
final BidRejectionTracker bidRejectionTracker = auctionContext.getBidRejectionTrackers().get(bidderName);

final long auctionStartTime = auctionContext.getStartTime();
final TimeoutContext timeoutContext = auctionContext.getTimeoutContext();
final long auctionStartTime = timeoutContext.getStartTime();
final int adjustmentFactor = timeoutContext.getAdjustmentFactor();
final long bidderRequestStartTime = clock.millis();

return Future.succeededFuture(bidderRequest.getBidRequest())
.map(bidRequest -> adjustTmax(bidRequest, auctionStartTime, bidderRequestStartTime))
.map(bidRequest -> adjustTmax(bidRequest, auctionStartTime, adjustmentFactor, bidderRequestStartTime))
.map(bidRequest -> ortbVersionConversionManager.convertFromAuctionSupportedVersion(
bidRequest, bidderRequest.getOrtbVersion()))
.map(bidderRequest::with)
Expand All @@ -1407,10 +1405,9 @@ private Future<BidderResponse> requestBids(BidderRequest bidderRequest,
.map(seatBid -> BidderResponse.of(bidderName, seatBid, responseTime(bidderRequestStartTime)));
}

private BidRequest adjustTmax(BidRequest bidRequest, long startTime, long currentTime) {
private BidRequest adjustTmax(BidRequest bidRequest, long startTime, int adjustmentFactor, long currentTime) {
final long tmax = timeoutResolver.limitToMax(bidRequest.getTmax());
final long adjustedTmax = timeoutResolver.adjustForBidder(
tmax, timeoutAdjustmentFactor, currentTime - startTime);
final long adjustedTmax = timeoutResolver.adjustForBidder(tmax, adjustmentFactor, currentTime - startTime);
return tmax != adjustedTmax
? bidRequest.toBuilder().tmax(adjustedTmax).build()
: bidRequest;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ public Future<PrivacyContext> contextFromBidRequest(AuctionContext auctionContex
final List<String> errors = auctionContext.getPrebidErrors();
final Account account = auctionContext.getAccount();
final MetricName requestType = auctionContext.getRequestTypeMetric();
final Timeout timeout = auctionContext.getTimeout();
final Timeout timeout = auctionContext.getTimeoutContext().getTimeout();

final Privacy privacy = privacyExtractor.validPrivacyFrom(bidRequest, errors);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
import org.prebid.server.cookie.UidsCookie;
import org.prebid.server.deals.model.DeepDebugLog;
import org.prebid.server.deals.model.TxnLog;
import org.prebid.server.execution.Timeout;
import org.prebid.server.geolocation.model.GeoInfo;
import org.prebid.server.hooks.execution.model.HookExecutionContext;
import org.prebid.server.metric.MetricName;
Expand Down Expand Up @@ -40,12 +39,6 @@ public class AuctionContext {
@JsonIgnore
List<AuctionParticipation> auctionParticipations;

@JsonIgnore
long startTime;

@JsonIgnore
Timeout timeout;

Account account;

MetricName requestTypeMetric;
Expand All @@ -58,6 +51,9 @@ public class AuctionContext {

Map<String, BidRejectionTracker> bidRejectionTrackers;

@JsonIgnore
TimeoutContext timeoutContext;

GppContext gppContext;

PrivacyContext privacyContext;
Expand Down
18 changes: 18 additions & 0 deletions src/main/java/org/prebid/server/auction/model/TimeoutContext.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package org.prebid.server.auction.model;

import lombok.Value;
import org.prebid.server.execution.Timeout;

@Value(staticConstructor = "of")
public class TimeoutContext {

long startTime;

Timeout timeout;

int adjustmentFactor;

public TimeoutContext with(Timeout timeout) {
return TimeoutContext.of(startTime, timeout, adjustmentFactor);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ public Future<PrivacyContext> contextFrom(AuctionContext auctionContext) {
final BidRequest bidRequest = auctionContext.getBidRequest();

final MetricName requestType = auctionContext.getRequestTypeMetric();
final Timeout timeout = auctionContext.getTimeout();
final Timeout timeout = auctionContext.getTimeoutContext().getTimeout();
final List<String> errors = auctionContext.getPrebidErrors();

final Privacy initialPrivacy = privacyExtractor.validPrivacyFrom(bidRequest, errors);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import org.prebid.server.auction.TimeoutResolver;
import org.prebid.server.auction.model.AuctionContext;
import org.prebid.server.auction.model.IpAddress;
import org.prebid.server.auction.model.TimeoutContext;
import org.prebid.server.auction.model.debug.DebugContext;
import org.prebid.server.cookie.UidsCookieService;
import org.prebid.server.deals.UserAdditionalInfoService;
Expand Down Expand Up @@ -91,6 +92,7 @@ public class Ortb2RequestFactory {
private static final ConditionalLogger UNKNOWN_ACCOUNT_LOGGER = new ConditionalLogger("unknown_account", logger);

private final boolean enforceValidAccount;
private final int timeoutAdjustmentFactor;
private final double logSamplingRate;
private final List<String> blacklistedAccounts;
private final UidsCookieService uidsCookieService;
Expand All @@ -109,6 +111,7 @@ public class Ortb2RequestFactory {
private final Clock clock;

public Ortb2RequestFactory(boolean enforceValidAccount,
int timeoutAdjustmentFactor,
double logSamplingRate,
List<String> blacklistedAccounts,
UidsCookieService uidsCookieService,
Expand All @@ -126,7 +129,12 @@ public Ortb2RequestFactory(boolean enforceValidAccount,
Metrics metrics,
Clock clock) {

if (timeoutAdjustmentFactor < 0 || timeoutAdjustmentFactor > 100) {
throw new IllegalArgumentException("Expected timeout adjustment factor should be in [0, 100].");
}

this.enforceValidAccount = enforceValidAccount;
this.timeoutAdjustmentFactor = timeoutAdjustmentFactor;
this.logSamplingRate = logSamplingRate;
this.blacklistedAccounts = Objects.requireNonNull(blacklistedAccounts);
this.uidsCookieService = Objects.requireNonNull(uidsCookieService);
Expand Down Expand Up @@ -168,8 +176,7 @@ public AuctionContext enrichAuctionContext(AuctionContext auctionContext,
.httpRequest(httpRequest)
.uidsCookie(uidsCookieService.parseFromRequest(httpRequest))
.bidRequest(bidRequest)
.startTime(startTime)
.timeout(timeout(bidRequest, startTime))
.timeoutContext(TimeoutContext.of(startTime, timeout(bidRequest, startTime), timeoutAdjustmentFactor))
.deepDebugLog(createDeepDebugLog(bidRequest))
.build();
}
Expand All @@ -184,7 +191,7 @@ public Future<Account> fetchAccount(AuctionContext auctionContext) {

private Future<Account> fetchAccount(AuctionContext auctionContext, boolean isLookupStoredRequest) {
final BidRequest bidRequest = auctionContext.getBidRequest();
final Timeout timeout = auctionContext.getTimeout();
final Timeout timeout = auctionContext.getTimeoutContext().getTimeout();
final HttpRequestContext httpRequest = auctionContext.getHttpRequest();

return findAccountIdFrom(bidRequest, isLookupStoredRequest)
Expand Down Expand Up @@ -359,7 +366,8 @@ public AuctionContext enrichWithPriceFloors(AuctionContext auctionContext) {
}

public AuctionContext updateTimeout(AuctionContext auctionContext, long startTime) {
final Timeout currentTimeout = auctionContext.getTimeout();
final TimeoutContext timeoutContext = auctionContext.getTimeoutContext();
final Timeout currentTimeout = timeoutContext.getTimeout();

final BidRequest bidRequest = auctionContext.getBidRequest();
final BidRequest resolvedBidRequest = resolveBidRequest(bidRequest);
Expand All @@ -376,7 +384,7 @@ public AuctionContext updateTimeout(AuctionContext auctionContext, long startTim

return auctionContext.toBuilder()
.bidRequest(effectiveBidRequest)
.timeout(requestTimeout)
.timeoutContext(timeoutContext.with(requestTimeout))
.build();
}

Expand Down
2 changes: 1 addition & 1 deletion src/main/java/org/prebid/server/cache/CacheService.java
Original file line number Diff line number Diff line change
Expand Up @@ -361,7 +361,7 @@ private Future<CacheServiceResult> doCacheOpenrtb(List<CacheBid> bids,
cachedCreatives.add(makeDebugCacheCreative(cachedDebugLog, hbCacheId, videoCacheTtl));
}

final long remainingTimeout = auctionContext.getTimeout().remaining();
final long remainingTimeout = auctionContext.getTimeoutContext().getTimeout().remaining();
if (remainingTimeout <= 0) {
return Future.succeededFuture(CacheServiceResult.of(null, new TimeoutException("Timeout has been exceeded"),
Collections.emptyMap()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ public Future<AuctionContext> populate(AuctionContext context) {
}

final Device device = context.getBidRequest().getDevice();
final Timeout timeout = context.getTimeout();
final Timeout timeout = context.getTimeoutContext().getTimeout();
final GeoInfo geoInfo = context.getGeoInfo();

final CompositeFuture compositeFuture = CompositeFuture.join(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -352,6 +352,7 @@ SetuidGppService setuidGppService(GppService gppService) {
@Bean
Ortb2RequestFactory openRtb2RequestFactory(
@Value("${settings.enforce-valid-account}") boolean enforceValidAccount,
@Value("${auction.biddertmax.percent}") int timeoutAdjustmentFactor,
@Value("${auction.blacklisted-accounts}") String blacklistedAccountsString,
UidsCookieService uidsCookieService,
ActivityInfrastructureCreator activityInfrastructureCreator,
Expand All @@ -372,6 +373,7 @@ Ortb2RequestFactory openRtb2RequestFactory(

return new Ortb2RequestFactory(
enforceValidAccount,
timeoutAdjustmentFactor,
logSamplingRate,
blacklistedAccounts,
uidsCookieService,
Expand Down Expand Up @@ -797,7 +799,6 @@ BidResponseCreator bidResponseCreator(
@Bean
ExchangeService exchangeService(
@Value("${logging.sampling-rate:0.01}") double logSamplingRate,
@Value("${auction.biddertmax.percent}") int timeoutAdjustmentFactor,
BidderCatalog bidderCatalog,
StoredResponseProcessor storedResponseProcessor,
@Autowired(required = false) DealsService dealsService,
Expand Down Expand Up @@ -830,7 +831,6 @@ ExchangeService exchangeService(

return new ExchangeService(
logSamplingRate,
timeoutAdjustmentFactor,
bidderCatalog,
storedResponseProcessor,
dealsService,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import org.prebid.server.analytics.model.SetuidEvent;
import org.prebid.server.analytics.reporter.pubstack.model.PubstackAnalyticsProperties;
import org.prebid.server.auction.model.AuctionContext;
import org.prebid.server.auction.model.TimeoutContext;
import org.prebid.server.cookie.UidsCookie;
import org.prebid.server.deals.model.DeepDebugLog;
import org.prebid.server.deals.model.TxnLog;
Expand Down Expand Up @@ -159,7 +160,7 @@ public void handleShouldBeAbleToEncodeAuctionEvent() {
final AuctionEvent event = AuctionEvent.builder()
.auctionContext(AuctionContext.builder()
.uidsCookie(mock(UidsCookie.class))
.timeout(mock(Timeout.class))
.timeoutContext(TimeoutContext.of(0, mock(Timeout.class), 0))
.txnLog(mock(TxnLog.class))
.deepDebugLog(mock(DeepDebugLog.class))
.build())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
import org.prebid.server.auction.model.CategoryMappingResult;
import org.prebid.server.auction.model.MultiBidConfig;
import org.prebid.server.auction.model.TargetingInfo;
import org.prebid.server.auction.model.TimeoutContext;
import org.prebid.server.auction.model.debug.DebugContext;
import org.prebid.server.bidder.BidderCatalog;
import org.prebid.server.bidder.model.BidderBid;
Expand Down Expand Up @@ -3867,8 +3868,8 @@ public void shouldPopulateTargetingKeywordsWithDefaultPrefixAndRelatedWarning()

final String expectedErrorMsg = "Key prefix value is dropped to default. "
+ "Decrease custom prefix length or increase truncateattrchars by 30";
assertThat(bidResponse.getExt().getWarnings()).containsOnly(entry("targeting", Arrays.asList(
ExtBidderError.of(BidderError.Type.bad_input.getCode(), expectedErrorMsg))));
assertThat(bidResponse.getExt().getWarnings()).containsOnly(entry("targeting", singletonList(
ExtBidderError.of(BidderError.Type.bad_input.getCode(), expectedErrorMsg))));

verify(cacheService, never()).cacheBidsOpenrtb(anyList(), any(), any(), any());
}
Expand All @@ -3880,7 +3881,7 @@ private AuctionContext givenAuctionContext(BidRequest bidRequest,
.account(Account.empty("accountId"))
.bidRequest(bidRequest)
.txnLog(TxnLog.create())
.timeout(timeout)
.timeoutContext(TimeoutContext.of(0, timeout, 0))
.debugContext(DebugContext.empty())
.deepDebugLog(DeepDebugLog.create(false, clock))
.debugHttpCalls(new HashMap<>())
Expand Down
Loading

0 comments on commit 7cf656a

Please sign in to comment.