Skip to content

Commit 5c1f207

Browse files
committed
⚡ Delayed update to improve setVariable performance at thread-pool
mode
1 parent a56169c commit 5c1f207

File tree

4 files changed

+39
-2
lines changed

4 files changed

+39
-2
lines changed

src/java/nginx/clojure/NginxClojureRT.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1106,7 +1106,7 @@ public Integer call() throws Exception {
11061106
}
11071107
}
11081108

1109-
protected static int unsafeSetNginxVariable(long r, String name, String val) throws OutOfMemoryError {
1109+
public static int unsafeSetNginxVariable(long r, String name, String val) throws OutOfMemoryError {
11101110
long np = CORE_VARS.containsKey(name) ? CORE_VARS.get(name) : 0;
11111111
long pool = UNSAFE.getAddress(r + NGX_HTTP_CLOJURE_REQ_POOL_OFFSET);
11121112

src/java/nginx/clojure/NginxHttpServerChannel.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,8 @@ protected long sendResponseHelp(NginxResponse resp, long chain) {
405405
return MiniConstants.NGX_HTTP_INTERNAL_SERVER_ERROR;
406406
}
407407

408+
req.applyDelayed();
409+
408410
long rc = NGX_OK;
409411
long r = req.nativeRequest();
410412

src/java/nginx/clojure/clj/LazyRequestMap.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,10 @@
3636
import java.util.Arrays;
3737
import java.util.HashMap;
3838
import java.util.Iterator;
39+
import java.util.LinkedHashSet;
3940
import java.util.List;
4041
import java.util.Map;
42+
import java.util.Set;
4143
import java.util.concurrent.Callable;
4244
import java.util.concurrent.ExecutionException;
4345
import java.util.concurrent.FutureTask;
@@ -126,6 +128,7 @@ public static void fixDefaultRequestArray() {
126128
protected LazyRequestMap rawRequestMap; // it is make by nginx-clojure inner handler not from assoc()
127129

128130
protected Map<String, String> prefetchedVariables;
131+
protected Set<String> updatedVariables;
129132

130133
public final static LazyRequestMap EMPTY_MAP = new LazyRequestMap(null, 0, null, new Object[0]);
131134

@@ -162,6 +165,7 @@ private LazyRequestMap(LazyRequestMap or, Object[] a) {
162165
this.channel = or.channel;
163166
this.evalCount = or.evalCount;
164167
this.prefetchedVariables = or.prefetchedVariables;
168+
this.updatedVariables = or.updatedVariables;
165169
this.nativeCount = or.nativeCount;
166170
validLen = a.length;
167171
}
@@ -211,6 +215,8 @@ public void prefetchAll(String[] headers, String[] variables, String[] outHeader
211215
for (String variable : variables) {
212216
prefetchedVariables.put(variable, getVariable(variable));
213217
}
218+
219+
updatedVariables = new LinkedHashSet<>();
214220
}
215221

216222

@@ -573,8 +579,9 @@ public void tagReleased() {
573579

574580
if (this.prefetchedVariables != null) {
575581
this.prefetchedVariables.clear();
582+
this.updatedVariables.clear();
576583
}
577-
584+
578585
((NginxClojureHandler)handler).returnToRequestPool(this);
579586
} else {
580587
this.rawRequestMap.tagReleased();
@@ -633,6 +640,12 @@ public int getAndIncEvalCount() {
633640

634641
@Override
635642
public int setVariable(String name, String value) {
643+
if (prefetchedVariables != null) {
644+
prefetchedVariables.put(name, value);
645+
updatedVariables.add(name);
646+
return 0;
647+
}
648+
636649
return NginxClojureRT.setNGXVariable(r, name, value);
637650
}
638651

@@ -686,5 +699,10 @@ public long discardRequestBody() {
686699
*/
687700
@Override
688701
public void applyDelayed() {
702+
if (updatedVariables != null) {
703+
for (String var : updatedVariables) {
704+
NginxClojureRT.unsafeSetNginxVariable(r, var, prefetchedVariables.get(var));
705+
}
706+
}
689707
}
690708
}

src/java/nginx/clojure/java/NginxJavaRequest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import java.util.Collection;
3434
import java.util.HashMap;
3535
import java.util.Iterator;
36+
import java.util.LinkedHashSet;
3637
import java.util.List;
3738
import java.util.Map;
3839
import java.util.Set;
@@ -100,6 +101,7 @@ public static void fixDefaultRequestArray() {
100101
protected volatile boolean released = false;
101102
protected List<java.util.AbstractMap.SimpleEntry<Object, ChannelListener<Object>>> listeners;
102103
protected Map<String, String> prefetchedVariables;
104+
protected Set<String> updatedVariables;
103105

104106
public final static ChannelListener<NginxRequest> requestListener = new RequestRawMessageAdapter();
105107

@@ -169,6 +171,8 @@ public void prefetchAll(String[] headers, String[] variables, String[] outHeader
169171
for (String variable : variables) {
170172
prefetchedVariables.put(variable, getVariable(variable));
171173
}
174+
175+
updatedVariables = new LinkedHashSet<>();
172176
}
173177

174178

@@ -212,6 +216,13 @@ public SimpleEntry<String, Object> entry(int i) {
212216

213217

214218
public int setVariable(String name, String value) {
219+
220+
if (prefetchedVariables != null) {
221+
prefetchedVariables.put(name, value);
222+
updatedVariables.add(name);
223+
return 0;
224+
}
225+
215226
return NginxClojureRT.setNGXVariable(r, name, value);
216227
}
217228

@@ -526,6 +537,7 @@ public void tagReleased() {
526537

527538
if (prefetchedVariables != null) {
528539
prefetchedVariables.clear();
540+
updatedVariables.clear();
529541
}
530542

531543
((NginxJavaHandler)handler).returnToRequestPool(this);
@@ -563,5 +575,10 @@ public int getAndIncEvalCount() {
563575
*/
564576
@Override
565577
public void applyDelayed() {
578+
if (updatedVariables != null) {
579+
for (String var : updatedVariables) {
580+
NginxClojureRT.unsafeSetNginxVariable(r, var, prefetchedVariables.get(var));
581+
}
582+
}
566583
}
567584
}

0 commit comments

Comments
 (0)