Skip to content

Commit adfb395

Browse files
Anuraag Agrawalwillarmiros
Anuraag Agrawal
andauthored
Remove subsegments lock (#278)
* Remove subsegments lock * Deprecate getSubsegments * Return a copy of subsegments list * json-ignore Co-authored-by: William Armiros <[email protected]>
1 parent c391f82 commit adfb395

File tree

7 files changed

+48
-37
lines changed

7 files changed

+48
-37
lines changed

aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/entities/DummySegment.java

+5
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,11 @@ public List<Subsegment> getSubsegments() {
241241
return list;
242242
}
243243

244+
@Override
245+
public List<Subsegment> getSubsegmentsCopy() {
246+
return new ArrayList<>(list);
247+
}
248+
244249
@Override
245250
public void addSubsegment(Subsegment subsegment) {
246251
}

aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/entities/DummySubsegment.java

+5
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,11 @@ public List<Subsegment> getSubsegments() {
223223
return list;
224224
}
225225

226+
@Override
227+
public List<Subsegment> getSubsegmentsCopy() {
228+
return new ArrayList<>(list);
229+
}
230+
226231
@Override
227232
public void addSubsegment(Subsegment subsegment) {
228233
}

aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/entities/Entity.java

+10-1
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ default void run(Runnable runnable, AWSXRayRecorder recorder) {
158158
void setNamespace(String namespace);
159159

160160
/**
161-
* @return the subsegmentsLock
161+
* @return an unused {@link ReentrantLock}
162162
*
163163
* @deprecated This is for internal use of the SDK and will be made private.
164164
*/
@@ -367,9 +367,18 @@ default void run(Runnable runnable, AWSXRayRecorder recorder) {
367367

368368
/**
369369
* @return the subsegments
370+
*
371+
* @deprecated Use {@link #getSubsegmentsCopy()}.
370372
*/
373+
@Deprecated
371374
List<Subsegment> getSubsegments();
372375

376+
/**
377+
* Returns a copy of the currently added subsegments. Updates to the returned {@link List} will not be reflected in the
378+
* {@link Entity}.
379+
*/
380+
List<Subsegment> getSubsegmentsCopy();
381+
373382
/**
374383
* Adds a subsegment.
375384
*

aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/entities/EntityImpl.java

+12-19
Original file line numberDiff line numberDiff line change
@@ -530,16 +530,19 @@ public List<Subsegment> getSubsegments() {
530530
}
531531
}
532532

533+
@JsonIgnore
534+
@Override
535+
public List<Subsegment> getSubsegmentsCopy() {
536+
synchronized (lock) {
537+
return new ArrayList<>(subsegments);
538+
}
539+
}
540+
533541
@Override
534542
public void addSubsegment(Subsegment subsegment) {
535543
synchronized (lock) {
536544
checkAlreadyEmitted();
537-
getSubsegmentsLock().lock();
538-
try {
539-
subsegments.add(subsegment);
540-
} finally {
541-
getSubsegmentsLock().unlock();
542-
}
545+
subsegments.add(subsegment);
543546
}
544547
}
545548

@@ -548,13 +551,8 @@ public void addException(Throwable exception) {
548551
synchronized (lock) {
549552
checkAlreadyEmitted();
550553
setFault(true);
551-
getSubsegmentsLock().lock();
552-
try {
553-
cause.addExceptions(creator.getThrowableSerializationStrategy()
554-
.describeInContext(this, exception, subsegments));
555-
} finally {
556-
getSubsegmentsLock().unlock();
557-
}
554+
cause.addExceptions(creator.getThrowableSerializationStrategy()
555+
.describeInContext(this, exception, subsegments));
558556
}
559557
}
560558

@@ -756,12 +754,7 @@ public String prettySerialize() {
756754
@Override
757755
public void removeSubsegment(Subsegment subsegment) {
758756
synchronized (lock) {
759-
getSubsegmentsLock().lock();
760-
try {
761-
subsegments.remove(subsegment);
762-
} finally {
763-
getSubsegmentsLock().unlock();
764-
}
757+
subsegments.remove(subsegment);
765758
getParentSegment().getTotalSize().decrement();
766759
}
767760
}

aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/entities/NoOpSegment.java

+5
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,11 @@ public List<Subsegment> getSubsegments() {
282282
return NoOpList.get();
283283
}
284284

285+
@Override
286+
public List<Subsegment> getSubsegmentsCopy() {
287+
return NoOpList.get();
288+
}
289+
285290
@Override
286291
public void addSubsegment(Subsegment subsegment) {
287292
}

aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/entities/NoOpSubSegment.java

+5
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,11 @@ public List<Subsegment> getSubsegments() {
225225
return NoOpList.get();
226226
}
227227

228+
@Override
229+
public List<Subsegment> getSubsegmentsCopy() {
230+
return NoOpList.get();
231+
}
232+
228233
@Override
229234
public void addSubsegment(Subsegment subsegment) {
230235
}

aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/DefaultStreamingStrategy.java

+6-17
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import com.amazonaws.xray.entities.Segment;
2121
import com.amazonaws.xray.entities.Subsegment;
2222
import java.util.ArrayList;
23+
import java.util.List;
2324

2425
public class DefaultStreamingStrategy implements StreamingStrategy {
2526

@@ -82,30 +83,18 @@ public boolean requiresStreaming(Segment segment) {
8283
*/
8384
@Override
8485
public void streamSome(Entity entity, Emitter emitter) {
85-
if (entity.getSubsegmentsLock().tryLock()) {
86-
try {
87-
stream(entity, emitter);
88-
} finally {
89-
entity.getSubsegmentsLock().unlock();
90-
}
91-
}
86+
stream(entity, emitter);
9287
}
9388

9489
private boolean stream(Entity entity, Emitter emitter) {
95-
ArrayList<Subsegment> children = new ArrayList<>(entity.getSubsegments());
96-
ArrayList<Subsegment> streamable = new ArrayList<>();
90+
List<Subsegment> children = entity.getSubsegmentsCopy();
91+
List<Subsegment> streamable = new ArrayList<>();
9792

9893
//Gather children and in the condition they are ready to stream, add them to the streamable list.
9994
if (children.size() > 0) {
10095
for (Subsegment child : children) {
101-
if (child.getSubsegmentsLock().tryLock()) {
102-
try {
103-
if (stream(child, emitter)) {
104-
streamable.add(child);
105-
}
106-
} finally {
107-
child.getSubsegmentsLock().unlock();
108-
}
96+
if (stream(child, emitter)) {
97+
streamable.add(child);
10998
}
11099
}
111100
}

0 commit comments

Comments
 (0)