Skip to content

Commit e050e28

Browse files
authored
Merge pull request #691 from HubSpot/limit-eager-tokens
[Eager Execution] Add max number of eager tokens to store
2 parents 381fa90 + d0eefec commit e050e28

2 files changed

Lines changed: 21 additions & 0 deletions

File tree

src/main/java/com/hubspot/jinjava/JinjavaConfig.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ public class JinjavaConfig {
5959
private final int maxListSize;
6060
private final int maxMapSize;
6161
private final int rangeLimit;
62+
private final int maxNumEagerTokens;
6263
private final InterpreterFactory interpreterFactory;
6364
private TokenScannerSymbols tokenScannerSymbols;
6465
private final ELResolver elResolver;
@@ -111,6 +112,7 @@ private JinjavaConfig(Builder builder) {
111112
maxListSize = builder.maxListSize;
112113
maxMapSize = builder.maxMapSize;
113114
rangeLimit = builder.rangeLimit;
115+
maxNumEagerTokens = builder.maxNumEagerTokens;
114116
interpreterFactory = builder.interpreterFactory;
115117
tokenScannerSymbols = builder.tokenScannerSymbols;
116118
elResolver = builder.elResolver;
@@ -150,6 +152,10 @@ public int getRangeLimit() {
150152
return rangeLimit;
151153
}
152154

155+
public int getMaxNumEagerTokens() {
156+
return maxNumEagerTokens;
157+
}
158+
153159
public RandomNumberGeneratorStrategy getRandomNumberGeneratorStrategy() {
154160
return randomNumberGenerator;
155161
}
@@ -242,6 +248,7 @@ public static class Builder {
242248
private boolean validationMode = false;
243249
private long maxStringLength = 0;
244250
private int rangeLimit = DEFAULT_RANGE_LIMIT;
251+
private int maxNumEagerTokens = 1000;
245252
private InterpreterFactory interpreterFactory = new JinjavaInterpreterFactory();
246253
private TokenScannerSymbols tokenScannerSymbols = new DefaultTokenScannerSymbols();
247254
private ELResolver elResolver = JinjavaInterpreterResolver.DEFAULT_RESOLVER_READ_ONLY;
@@ -357,6 +364,11 @@ public Builder withRangeLimit(int rangeLimit) {
357364
return this;
358365
}
359366

367+
public Builder withMaxNumEagerTokens(int maxNumEagerTokens) {
368+
this.maxNumEagerTokens = maxNumEagerTokens;
369+
return this;
370+
}
371+
360372
public Builder withInterperterFactory(InterpreterFactory interperterFactory) {
361373
this.interpreterFactory = interperterFactory;
362374
return this;

src/main/java/com/hubspot/jinjava/interpret/Context.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,15 @@ public Set<Node> getDeferredNodes() {
365365
}
366366

367367
public void handleEagerToken(EagerToken eagerToken) {
368+
int maxNumEagerTokens = JinjavaInterpreter
369+
.getCurrentMaybe()
370+
.map(i -> i.getConfig().getMaxNumEagerTokens())
371+
.orElse(1000);
372+
if (eagerTokens.size() >= maxNumEagerTokens) {
373+
throw new DeferredValueException(
374+
"Too many Deferred Tokens, max is " + maxNumEagerTokens
375+
);
376+
}
368377
eagerTokens.add(eagerToken);
369378
DeferredValueUtils.findAndMarkDeferredProperties(this, eagerToken);
370379
if (getParent() != null) {

0 commit comments

Comments
 (0)