Skip to content

Commit 18fd259

Browse files
AXIS2-5904 Fix same race condition in AxisMessage.isPolicyUpdated()
AxisMessage has the identical Date.after() millisecond-granularity race as AxisBindingMessage (fixed in prior commit). Apply the same AtomicLong version counter fix. Both classes in the policy hierarchy that cache effective policies are now using monotonic counters. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 118dcca commit 18fd259

1 file changed

Lines changed: 22 additions & 18 deletions

File tree

modules/kernel/src/org/apache/axis2/description/AxisMessage.java

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ public class AxisMessage extends AxisDescription {
6868

6969
private volatile Policy effectivePolicy = null;
7070
private volatile Date lastPolicyCalculatedTime = null;
71+
private volatile long lastPolicyCalculatedVersion = -1;
7172

7273
public String getMessagePartName() {
7374
return messagePartName;
@@ -237,11 +238,12 @@ public void setWrapped(boolean wrapped) {
237238
}
238239

239240
public Policy getEffectivePolicy() {
240-
if (lastPolicyCalculatedTime == null || isPolicyUpdated()) {
241+
if (isPolicyUpdated()) {
241242
synchronized (this) {
242-
if (lastPolicyCalculatedTime == null || isPolicyUpdated()) {
243+
if (isPolicyUpdated()) {
243244
effectivePolicy = calculateEffectivePolicy();
244245
lastPolicyCalculatedTime = new Date();
246+
lastPolicyCalculatedVersion = getMaxPolicyVersion();
245247
}
246248
}
247249
}
@@ -284,31 +286,33 @@ public Policy calculateEffectivePolicy() {
284286
}
285287

286288
public boolean isPolicyUpdated() {
287-
// AxisMessage
288-
if (getPolicySubject().getLastUpdatedTime().after(
289-
lastPolicyCalculatedTime)) {
290-
return true;
291-
}
289+
return getMaxPolicyVersion() > lastPolicyCalculatedVersion;
290+
}
291+
292+
/**
293+
* Returns the maximum policy version across the description hierarchy.
294+
* Uses monotonic counter instead of Date to avoid the millisecond-
295+
* granularity race condition in AXIS2-5904.
296+
*/
297+
private long getMaxPolicyVersion() {
298+
long max = getPolicySubject().getVersion();
292299
// AxisOperation
293300
AxisOperation axisOperation = (AxisOperation) parent;
294-
if (axisOperation != null
295-
&& axisOperation.getPolicySubject().getLastUpdatedTime().after(
296-
lastPolicyCalculatedTime)) {
297-
return true;
301+
if (axisOperation != null) {
302+
max = Math.max(max, axisOperation.getPolicySubject().getVersion());
298303
}
299304
// AxisService
300305
AxisService axisService = (axisOperation == null) ? null
301306
: axisOperation.getAxisService();
302-
if (axisService != null
303-
&& axisService.getPolicySubject().getLastUpdatedTime().after(
304-
lastPolicyCalculatedTime)) {
305-
return true;
307+
if (axisService != null) {
308+
max = Math.max(max, axisService.getPolicySubject().getVersion());
306309
}
307310
// AxisConfiguration
308311
AxisConfiguration axisConfiguration = (axisService == null) ? null
309312
: axisService.getAxisConfiguration();
310-
return axisConfiguration != null
311-
&& axisConfiguration.getPolicySubject().getLastUpdatedTime()
312-
.after(lastPolicyCalculatedTime);
313+
if (axisConfiguration != null) {
314+
max = Math.max(max, axisConfiguration.getPolicySubject().getVersion());
315+
}
316+
return max;
313317
}
314318
}

0 commit comments

Comments
 (0)