22
33import io .split .client .dtos .SegmentChange ;
44import io .split .engine .SDKReadinessGates ;
5+ import io .split .engine .segments .storage .SegmentCache ;
6+ import io .split .engine .segments .storage .SegmentCacheInMemoryImpl ;
7+ import org .checkerframework .checker .signedness .qual .SignednessGlb ;
58import org .slf4j .Logger ;
69import org .slf4j .LoggerFactory ;
710
11+ import java .util .ArrayList ;
812import java .util .Collections ;
913import java .util .List ;
1014import java .util .Set ;
@@ -23,10 +27,9 @@ public class RefreshableSegment implements Runnable, Segment {
2327
2428 private final String _segmentName ;
2529 private final SegmentChangeFetcher _segmentChangeFetcher ;
26- private final AtomicLong _changeNumber ;
30+ private final SegmentCache _segmentCache ;
2731 private final SDKReadinessGates _gates ;
2832
29- private Set <String > _concurrentKeySet = Collections .newSetFromMap (new ConcurrentHashMap <String , Boolean >());
3033 private final Object _lock = new Object ();
3134
3235 @ Override
@@ -36,21 +39,21 @@ public String segmentName() {
3639
3740 @ Override
3841 public boolean contains (String key ) {
39- return _concurrentKeySet . contains ( key );
42+ return _segmentCache . isInSegment ( _segmentName , key );
4043 }
4144
42- /*package private*/ Set <String > fetch () {
45+ /*package private*/ /* Set<String> fetch() {
4346 return Collections.unmodifiableSet(_concurrentKeySet);
44- }
47+ }*/
4548
4649 @ Override
4750 public void forceRefresh () {
4851 try {
4952 _log .debug ("Force Refresh segment starting ..." );
5053 while (true ) {
51- long start = _changeNumber . get ( );
54+ long start = _segmentCache . getChangeNumber ( _segmentName );
5255 runWithoutExceptionHandling ();
53- long end = _changeNumber . get ( );
56+ long end = _segmentCache . getChangeNumber ( _segmentName );
5457
5558 if (start >= end ) {
5659 break ;
@@ -63,23 +66,24 @@ public void forceRefresh() {
6366
6467 @ Override
6568 public long changeNumber () {
66- return _changeNumber . get ( );
69+ return _segmentCache . getChangeNumber ( _segmentName );
6770 }
6871
69- public static RefreshableSegment create (String segmentName , SegmentChangeFetcher segmentChangeFetcher , SDKReadinessGates gates ) {
70- return new RefreshableSegment (segmentName , segmentChangeFetcher , -1L , gates );
72+ public static RefreshableSegment create (String segmentName , SegmentChangeFetcher segmentChangeFetcher , SDKReadinessGates gates , SegmentCache segmentCache ) {
73+ return new RefreshableSegment (segmentName , segmentChangeFetcher , -1L , gates , segmentCache );
7174 }
7275
7376
74- public RefreshableSegment (String segmentName , SegmentChangeFetcher segmentChangeFetcher , long changeNumber , SDKReadinessGates gates ) {
77+ public RefreshableSegment (String segmentName , SegmentChangeFetcher segmentChangeFetcher , long changeNumber , SDKReadinessGates gates , SegmentCache segmentCache ) {
7578 _segmentName = segmentName ;
7679 _segmentChangeFetcher = segmentChangeFetcher ;
77- _changeNumber = new AtomicLong ( changeNumber ) ;
80+ _segmentCache = segmentCache ;
7881 _gates = gates ;
7982
8083 checkNotNull (_segmentChangeFetcher );
8184 checkNotNull (_segmentName );
8285 checkNotNull (_gates );
86+ checkNotNull (_segmentCache );
8387 }
8488
8589 @ Override
@@ -88,11 +92,11 @@ public void run() {
8892 // Do this again in case the previous call errored out.
8993 _gates .registerSegment (_segmentName );
9094 while (true ) {
91- long start = _changeNumber . get ( );
95+ long start = _segmentCache . getChangeNumber ( _segmentName );
9296 runWithoutExceptionHandling ();
93- long end = _changeNumber . get ( );
97+ long end = _segmentCache . getChangeNumber ( _segmentName );
9498 if (_log .isDebugEnabled ()) {
95- _log .debug (_segmentName + " segment fetch before: " + start + ", after: " + _changeNumber . get () + " size: " + _concurrentKeySet .size ());
99+ _log .debug (_segmentName + " segment fetch before: " + start + ", after: " + _segmentCache . getChangeNumber ( _segmentName ) /* + " size: " + _concurrentKeySet.size()*/ );
96100 }
97101 if (start >= end ) {
98102 break ;
@@ -110,55 +114,49 @@ public void run() {
110114 }
111115
112116 private void runWithoutExceptionHandling () {
113- SegmentChange change = _segmentChangeFetcher .fetch (_segmentName , _changeNumber . get ( ));
117+ SegmentChange change = _segmentChangeFetcher .fetch (_segmentName , _segmentCache . getChangeNumber ( _segmentName ));
114118
115119 if (change == null ) {
116120 throw new IllegalStateException ("SegmentChange was null" );
117121 }
118122
119- if (change .till == _changeNumber . get ( )) {
123+ if (change .till == _segmentCache . getChangeNumber ( _segmentName )) {
120124 // no change.
121125 return ;
122126 }
123127
124- if (change .since != _changeNumber . get ( )
125- || change .since < _changeNumber . get ( )) {
128+ if (change .since != _segmentCache . getChangeNumber ( _segmentName )
129+ || change .since < _segmentCache . getChangeNumber ( _segmentName )) {
126130 // some other thread may have updated the shared state. exit
127131 return ;
128132 }
129133
130134
131135 if (change .added .isEmpty () && change .removed .isEmpty ()) {
132136 // there are no changes. weird!
133- _changeNumber . set ( change .till );
137+ _segmentCache . setChangeNumber ( _segmentName , change .till );
134138 return ;
135139 }
136140
137141 synchronized (_lock ) {
138142 // check state one more time.
139- if (change .since != _changeNumber . get ( )
140- || change .till < _changeNumber . get ( )) {
143+ if (change .since != _segmentCache . getChangeNumber ( _segmentName )
144+ || change .till < _segmentCache . getChangeNumber ( _segmentName )) {
141145 // some other thread may have updated the shared state. exit
142146 return ;
143147 }
144-
145- for (String added : change .added ) {
146- _concurrentKeySet .add (added );
147- }
148+ //updateSegment(sn, toadd, tormv, chngN)
149+ _segmentCache .updateSegment (_segmentName ,change .added , change .removed );
148150
149151 if (!change .added .isEmpty ()) {
150152 _log .info (_segmentName + " added keys: " + summarize (change .added ));
151153 }
152154
153- for (String removed : change .removed ) {
154- _concurrentKeySet .remove (removed );
155- }
156-
157155 if (!change .removed .isEmpty ()) {
158156 _log .info (_segmentName + " removed keys: " + summarize (change .removed ));
159157 }
160158
161- _changeNumber . set ( change .till );
159+ _segmentCache . setChangeNumber ( _segmentName , change .till );
162160 }
163161 }
164162
0 commit comments