Skip to content

RBS in memory storage #739

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Feb 25, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .github/workflows/instrumented.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ on:
branches:
- 'development'
- 'master'
- '*_baseline'

jobs:
test:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,11 @@ public long getUniqueAmount() {
return mEmptyMySegmentsStorage.getAll().size();
}

@Override
public void loadLocal() {
// no-op
}

@Override
public void clear() {
// No-op
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,7 @@

public interface RolloutDefinitionsCache {

void loadLocal();

void clear();
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import io.split.android.client.storage.RolloutDefinitionsCache;

public interface MySegmentsStorage extends RolloutDefinitionsCache {
void loadLocal();

Set<String> getAll();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,11 @@ public long getUniqueAmount() {
return segments.size();
}

@Override
public void loadLocal() {
// no-op
}

@Override
public void clear() {
synchronized (lock) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package io.split.android.client.storage.rbs;

import java.util.Set;

import io.split.android.client.dtos.RuleBasedSegment;

public interface PersistentRuleBasedSegmentStorage {

RuleBasedSegmentSnapshot getSnapshot();

boolean update(Set<RuleBasedSegment> toAdd, Set<RuleBasedSegment> toRemove, long changeNumber);

void clear();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package io.split.android.client.storage.rbs;

import java.util.Set;

import io.split.android.client.dtos.RuleBasedSegment;

public class RuleBasedSegmentSnapshot {

private final Set<RuleBasedSegment> mSegments;

private final long mChangeNumber;

public RuleBasedSegmentSnapshot(Set<RuleBasedSegment> segments, long changeNumber) {
mSegments = segments;
mChangeNumber = changeNumber;
}

public Set<RuleBasedSegment> getSegments() {
return mSegments;
}

public long getChangeNumber() {
return mChangeNumber;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package io.split.android.client.storage.rbs;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import java.util.Set;

import io.split.android.client.dtos.RuleBasedSegment;
import io.split.android.client.storage.RolloutDefinitionsCache;

public interface RuleBasedSegmentStorage extends RolloutDefinitionsCache {

@Nullable
RuleBasedSegment get(String segmentName);

boolean update(@NonNull Set<RuleBasedSegment> toAdd, @NonNull Set<RuleBasedSegment> toRemove, long changeNumber);

long getChangeNumber();

boolean contains(@NonNull Set<String> segmentNames);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
package io.split.android.client.storage.rbs;

import static io.split.android.client.utils.Utils.checkNotNull;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;

import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

import io.split.android.client.dtos.RuleBasedSegment;

public class RuleBasedSegmentStorageImpl implements RuleBasedSegmentStorage {

private final ConcurrentHashMap<String, RuleBasedSegment> mInMemorySegments;
private final PersistentRuleBasedSegmentStorage mPersistentStorage;
private volatile long mChangeNumber;

public RuleBasedSegmentStorageImpl(@NonNull PersistentRuleBasedSegmentStorage persistentStorage) {
mInMemorySegments = new ConcurrentHashMap<>();
mPersistentStorage = checkNotNull(persistentStorage);
mChangeNumber = -1;
}

@Nullable
@Override
public RuleBasedSegment get(String segmentName) {
return mInMemorySegments.get(segmentName);
}

@Override
public synchronized boolean update(@NonNull Set<RuleBasedSegment> toAdd, @NonNull Set<RuleBasedSegment> toRemove, long changeNumber) {
boolean appliedUpdates = false;

if (toAdd != null) {
if (!toAdd.isEmpty()) {
for (RuleBasedSegment segment : toAdd) {
mInMemorySegments.put(segment.getName(), segment);
}

appliedUpdates = true;
}
}

if (toRemove != null) {
if (!toRemove.isEmpty()) {
for (RuleBasedSegment segment : toRemove) {
mInMemorySegments.remove(segment.getName());
}
}
}

mChangeNumber = changeNumber;

return appliedUpdates;
}

@Override
public long getChangeNumber() {
return mChangeNumber;
}

@Override
public boolean contains(@NonNull Set<String> segmentNames) {
if (segmentNames == null) {
return false;
}

for (String name : segmentNames) {
if (!mInMemorySegments.containsKey(name)) {
return false;
}
}
return true;
}

@WorkerThread
@Override
public void loadLocal() {
RuleBasedSegmentSnapshot snapshot = mPersistentStorage.getSnapshot();
Set<RuleBasedSegment> segments = snapshot.getSegments();
mChangeNumber = snapshot.getChangeNumber();
for (RuleBasedSegment segment : segments) {
mInMemorySegments.put(segment.getName(), segment);
}
}

@WorkerThread
@Override
public void clear() {
mInMemorySegments.clear();
mChangeNumber = -1;
mPersistentStorage.clear();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
import io.split.android.client.storage.RolloutDefinitionsCache;

public interface SplitsStorage extends RolloutDefinitionsCache {
void loadLocal();

Split get(@NonNull String name);

Expand Down
Loading
Loading