Skip to content

RBS notification handling in worker #637

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

Open
wants to merge 14 commits into
base: SDKS-9373_baseline
Choose a base branch
from
8 changes: 8 additions & 0 deletions Split.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -1093,6 +1093,8 @@
C539CAD72D8B5AD00050C732 /* TargetingRulesChange.swift in Sources */ = {isa = PBXBuildFile; fileRef = C539CAD32D8B5AD00050C732 /* TargetingRulesChange.swift */; };
C539CAD92D8B5AF00050C732 /* ProcessedRuleBasedSegmentChange.swift in Sources */ = {isa = PBXBuildFile; fileRef = C539CAD82D8B5AF00050C732 /* ProcessedRuleBasedSegmentChange.swift */; };
C539CADA2D8B5AF00050C732 /* ProcessedRuleBasedSegmentChange.swift in Sources */ = {isa = PBXBuildFile; fileRef = C539CAD82D8B5AF00050C732 /* ProcessedRuleBasedSegmentChange.swift */; };
C53F3C472DCB956900655753 /* SplitsSyncHelperTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C53F3C462DCB956900655753 /* SplitsSyncHelperTest.swift */; };
C53F3C4F2DCD112400655753 /* RuleBasedSegmentChangeProcessorStub.swift in Sources */ = {isa = PBXBuildFile; fileRef = C53F3C4E2DCD110700655753 /* RuleBasedSegmentChangeProcessorStub.swift */; };
C58F33732BDAC4AC00D66549 /* split_unsupported_matcher.json in Resources */ = {isa = PBXBuildFile; fileRef = C58F33722BDAC4AC00D66549 /* split_unsupported_matcher.json */; };
C5977BFF2BF27375003E293A /* Semver.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5977BFE2BF27375003E293A /* Semver.swift */; };
C5977C012BF27390003E293A /* SemverTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5977C002BF27390003E293A /* SemverTest.swift */; };
Expand Down Expand Up @@ -1954,6 +1956,8 @@
C539CAD22D8B5AD00050C732 /* RuleBasedSegmentChange.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RuleBasedSegmentChange.swift; sourceTree = "<group>"; };
C539CAD32D8B5AD00050C732 /* TargetingRulesChange.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TargetingRulesChange.swift; sourceTree = "<group>"; };
C539CAD82D8B5AF00050C732 /* ProcessedRuleBasedSegmentChange.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProcessedRuleBasedSegmentChange.swift; sourceTree = "<group>"; };
C53F3C462DCB956900655753 /* SplitsSyncHelperTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplitsSyncHelperTest.swift; sourceTree = "<group>"; };
C53F3C4E2DCD110700655753 /* RuleBasedSegmentChangeProcessorStub.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RuleBasedSegmentChangeProcessorStub.swift; sourceTree = "<group>"; };
C58F33722BDAC4AC00D66549 /* split_unsupported_matcher.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = split_unsupported_matcher.json; sourceTree = "<group>"; };
C5977BFE2BF27375003E293A /* Semver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Semver.swift; sourceTree = "<group>"; };
C5977C002BF27390003E293A /* SemverTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SemverTest.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -3252,6 +3256,7 @@
954F9C73257961AA00140B81 /* Service */ = {
isa = PBXGroup;
children = (
C53F3C4E2DCD110700655753 /* RuleBasedSegmentChangeProcessorStub.swift */,
954F9C74257961C100140B81 /* HttpSplitFetcherStub.swift */,
95C7569C2696457500696148 /* NotificationHelperStub.swift */,
95F7BC262C45C12700C5F2E4 /* TlsPinCheckerMock.swift */,
Expand Down Expand Up @@ -3358,6 +3363,7 @@
956A7E2D297ED7600080D53C /* SplitsEncoderTest.swift */,
956A7E30297EE5A60080D53C /* ComputeProcessCountTest.swift */,
9572BA802AC4A4B100C10FC1 /* SplitChangeProcessorTests.swift */,
C53F3C462DCB956900655753 /* SplitsSyncHelperTest.swift */,
);
path = Splits;
sourceTree = "<group>";
Expand Down Expand Up @@ -4525,6 +4531,7 @@
9577A84B2683CBDC00D92AE1 /* ImpressionsCountRecorderWorkerTests.swift in Sources */,
5932260F24AAB27900496D8B /* TestUtils.swift in Sources */,
95F3F006258D49B600084AF8 /* PersistentEventsStorageStub.swift in Sources */,
C53F3C4F2DCD112400655753 /* RuleBasedSegmentChangeProcessorStub.swift in Sources */,
5959C477227B89820064F968 /* FactoryMonitorTest.swift in Sources */,
592C6ABE211B718E002D120C /* ArrayBlockingQueueTest.swift in Sources */,
5919017D24A28E1D005BD12A /* HttpRequestListTest.swift in Sources */,
Expand Down Expand Up @@ -4664,6 +4671,7 @@
C5977C572BF53D60003E293A /* UnsupportedMatcherIntegrationTest.swift in Sources */,
95B1800527626C70002DC9DF /* TelemetryConfigRecorderWorkerTests.swift in Sources */,
95ABF4C6293522D6006ED016 /* EventsTrackerTest.swift in Sources */,
C53F3C472DCB956900655753 /* SplitsSyncHelperTest.swift in Sources */,
95ABF4C829352425006ED016 /* EventValidatorStub.swift in Sources */,
59F4AAC42513EFF800A1C69A /* PeriodicMySegmentsSyncWorkerTest.swift in Sources */,
31AA21DE01A000A7C30630F2 /* SseClientTest.swift in Sources */,
Expand Down
4 changes: 4 additions & 0 deletions Split/Api/SplitDatabaseHelper.swift
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,10 @@ struct SplitDatabaseHelper {
return DefaultPersistentSplitsStorage(database: database)
}

static func openPersistentRuleBasedSegmentsStorage(database: SplitDatabase, generalInfoStorage: GeneralInfoStorage) -> PersistentRuleBasedSegmentsStorage {
return DefaultPersistentRuleBasedSegmentsStorage(database: database, generalInfoStorage: generalInfoStorage)
}

static func openSplitsStorage(database: SplitDatabase,
flagSetsCache: FlagSetsCache) -> SplitsStorage {
return DefaultSplitsStorage(persistentSplitsStorage: openPersistentSplitsStorage(database: database),
Expand Down
2 changes: 1 addition & 1 deletion Split/Common/Utils/Spec.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@ import Foundation

class Spec {

static var flagsSpec = "1.2"
static var flagsSpec = "1.3"
}
12 changes: 3 additions & 9 deletions Split/FetcherEngine/HttpSplitFetcher.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,7 @@
import Foundation

protocol HttpSplitFetcher {
func execute(since: Int64, till: Int64?, headers: HttpHeaders?) throws -> SplitChange
func executeForTargetingRules(since: Int64, till: Int64?, headers: HttpHeaders?) throws -> TargetingRulesChange
func execute(since: Int64, rbSince: Int64?, till: Int64?, headers: HttpHeaders?) throws -> TargetingRulesChange
}

class DefaultHttpSplitFetcher: HttpSplitFetcher {
Expand All @@ -22,19 +21,14 @@ class DefaultHttpSplitFetcher: HttpSplitFetcher {
self.syncHelper = syncHelper
}

func execute(since: Int64, till: Int64?, headers: HttpHeaders? = nil) throws -> SplitChange {
let targetingRulesChange = try executeForTargetingRules(since: since, till: till, headers: headers)
return targetingRulesChange.featureFlags
}

func executeForTargetingRules(since: Int64, till: Int64?, headers: HttpHeaders? = nil) throws -> TargetingRulesChange {
func execute(since: Int64, rbSince: Int64?, till: Int64?, headers: HttpHeaders? = nil) throws -> TargetingRulesChange {
Logger.d("Fetching targeting rules definitions")
try syncHelper.checkEndpointReachability(restClient: restClient, resource: resource)

let semaphore = DispatchSemaphore(value: 0)
var requestResult: DataResult<TargetingRulesChange>?
let startTime = Date.nowMillis()
restClient.getSplitChanges(since: since, till: till, headers: headers) { result in
restClient.getSplitChanges(since: since, rbSince: rbSince, till: till, headers: headers) { result in
TimeChecker.logInterval("Time to fetch targeting rules", startTime: startTime)
requestResult = result
semaphore.signal()
Expand Down
15 changes: 10 additions & 5 deletions Split/FetcherEngine/Refresh/BackgroundSyncWorker.swift
Original file line number Diff line number Diff line change
Expand Up @@ -45,31 +45,36 @@ class BackgroundMySegmentsSyncWorker: BackgroundSyncWorker {
class BackgroundSplitsSyncWorker: BackgroundSyncWorker {

private let splitFetcher: HttpSplitFetcher
private let splitsStorage: BackgroundSyncSplitsStorage
private let persistenSplitsStorage: PersistentSplitsStorage
private let persistentRuleBasedSegmentsStorage: PersistentRuleBasedSegmentsStorage
private let splitChangeProcessor: SplitChangeProcessor
private let cacheExpiration: Int64
private let syncHelper: SplitsSyncHelper

init(splitFetcher: HttpSplitFetcher,
persistentSplitsStorage: PersistentSplitsStorage,
persistentRuleBasedSegmentsStorage: PersistentRuleBasedSegmentsStorage,
splitChangeProcessor: SplitChangeProcessor,
ruleBasedSegmentsChangeProcessor: RuleBasedSegmentChangeProcessor,
cacheExpiration: Int64,
splitConfig: SplitClientConfig) {

self.persistenSplitsStorage = persistentSplitsStorage
self.persistentRuleBasedSegmentsStorage = persistentRuleBasedSegmentsStorage
self.splitFetcher = splitFetcher
self.splitsStorage = BackgroundSyncSplitsStorage(persistentSplitsStorage: persistentSplitsStorage)
self.splitChangeProcessor = splitChangeProcessor
self.cacheExpiration = cacheExpiration
self.syncHelper = SplitsSyncHelper(splitFetcher: splitFetcher,
splitsStorage: splitsStorage,
splitsStorage: BackgroundSyncSplitsStorage(persistentSplitsStorage: persistentSplitsStorage),
ruleBasedSegmentsStorage: DefaultRuleBasedSegmentsStorage(persistentStorage: persistentRuleBasedSegmentsStorage),
splitChangeProcessor: splitChangeProcessor,
ruleBasedSegmentsChangeProcessor: ruleBasedSegmentsChangeProcessor,
splitConfig: splitConfig)
}

func execute() {
var changeNumber = persistenSplitsStorage.getChangeNumber()
_ = try? syncHelper.sync(since: changeNumber, clearBeforeUpdate: false)
let changeNumber = persistenSplitsStorage.getChangeNumber()
let rbChangeNumber = persistentRuleBasedSegmentsStorage.getChangeNumber()
_ = try? syncHelper.sync(since: changeNumber, rbSince: rbChangeNumber, clearBeforeUpdate: false)
}
}
14 changes: 12 additions & 2 deletions Split/FetcherEngine/Refresh/PeriodicSyncWorker.swift
Original file line number Diff line number Diff line change
Expand Up @@ -141,22 +141,30 @@ class PeriodicSplitsSyncWorker: BasePeriodicSyncWorker {

private let splitFetcher: HttpSplitFetcher
private let splitsStorage: SplitsStorage
private let ruleBasedSegmentsStorage: RuleBasedSegmentsStorage
private let splitChangeProcessor: SplitChangeProcessor
private let ruleBasedSegmentsChangeProcessor: RuleBasedSegmentChangeProcessor
private let syncHelper: SplitsSyncHelper

init(splitFetcher: HttpSplitFetcher,
splitsStorage: SplitsStorage,
ruleBasedSegmentsStorage: RuleBasedSegmentsStorage,
splitChangeProcessor: SplitChangeProcessor,
ruleBasedSegmentsChangeProcessor: RuleBasedSegmentChangeProcessor,
timer: PeriodicTimer,
eventsManager: SplitEventsManager,
splitConfig: SplitClientConfig) {

self.splitFetcher = splitFetcher
self.splitsStorage = splitsStorage
self.ruleBasedSegmentsStorage = ruleBasedSegmentsStorage
self.splitChangeProcessor = splitChangeProcessor
self.ruleBasedSegmentsChangeProcessor = ruleBasedSegmentsChangeProcessor
self.syncHelper = SplitsSyncHelper(splitFetcher: splitFetcher,
splitsStorage: splitsStorage,
ruleBasedSegmentsStorage: ruleBasedSegmentsStorage,
splitChangeProcessor: splitChangeProcessor,
ruleBasedSegmentsChangeProcessor: ruleBasedSegmentsChangeProcessor,
splitConfig: splitConfig)
super.init(timer: timer,
eventsManager: eventsManager)
Expand All @@ -168,10 +176,12 @@ class PeriodicSplitsSyncWorker: BasePeriodicSyncWorker {
return
}

guard let result = try? syncHelper.sync(since: splitsStorage.changeNumber) else {
let changeNumber = splitsStorage.changeNumber
let rbChangeNumber: Int64 = ruleBasedSegmentsStorage.changeNumber
guard let result = try? syncHelper.sync(since: changeNumber, rbSince: rbChangeNumber) else {
return
}
if result.success, result.featureFlagsUpdated {
if result.success, result.featureFlagsUpdated || result.rbsUpdated {
notifyUpdate([.splitsUpdated])
}
}
Expand Down
36 changes: 31 additions & 5 deletions Split/FetcherEngine/Refresh/RetryableSyncWorker.swift
Original file line number Diff line number Diff line change
Expand Up @@ -104,30 +104,40 @@ class RetryableSplitsSyncWorker: BaseRetryableSyncWorker {

private let splitFetcher: HttpSplitFetcher
private let splitsStorage: SplitsStorage
private let ruleBasedSegmentsStorage: RuleBasedSegmentsStorage
private let splitChangeProcessor: SplitChangeProcessor
private let ruleBasedSegmentChangeProcessor: RuleBasedSegmentChangeProcessor
private let syncHelper: SplitsSyncHelper

init(splitFetcher: HttpSplitFetcher,
splitsStorage: SplitsStorage,
ruleBasedSegmentsStorage: RuleBasedSegmentsStorage,
splitChangeProcessor: SplitChangeProcessor,
ruleBasedSegmentChangeProcessor: RuleBasedSegmentChangeProcessor,
eventsManager: SplitEventsManager,
reconnectBackoffCounter: ReconnectBackoffCounter,
splitConfig: SplitClientConfig) {

self.splitFetcher = splitFetcher
self.splitsStorage = splitsStorage
self.ruleBasedSegmentsStorage = ruleBasedSegmentsStorage
self.splitChangeProcessor = splitChangeProcessor
self.ruleBasedSegmentChangeProcessor = ruleBasedSegmentChangeProcessor
self.syncHelper = SplitsSyncHelper(splitFetcher: splitFetcher,
splitsStorage: splitsStorage,
ruleBasedSegmentsStorage: ruleBasedSegmentsStorage,
splitChangeProcessor: splitChangeProcessor,
ruleBasedSegmentsChangeProcessor: ruleBasedSegmentChangeProcessor,
splitConfig: splitConfig)
super.init(eventsManager: eventsManager,
reconnectBackoffCounter: reconnectBackoffCounter)
}

override func fetchFromRemote() throws -> Bool {
do {
let result = try syncHelper.sync(since: splitsStorage.changeNumber, clearBeforeUpdate: false)
let changeNumber = splitsStorage.changeNumber
let rbChangeNumber = ruleBasedSegmentsStorage.changeNumber
let result = try syncHelper.sync(since: changeNumber, rbSince: rbChangeNumber, clearBeforeUpdate: false)
if result.success {
if !isSdkReadyTriggered() ||
result.featureFlagsUpdated {
Expand All @@ -148,42 +158,58 @@ class RetryableSplitsUpdateWorker: BaseRetryableSyncWorker {

private let splitsFetcher: HttpSplitFetcher
private let splitsStorage: SplitsStorage
private let ruleBasedSegmentsStorage: RuleBasedSegmentsStorage
private let splitChangeProcessor: SplitChangeProcessor
private let changeNumber: Int64
private let ruleBasedSegmentChangeProcessor: RuleBasedSegmentChangeProcessor
private let changeNumber: SplitsUpdateChangeNumber
private let syncHelper: SplitsSyncHelper
var changeChecker: SplitsChangesChecker

init(splitsFetcher: HttpSplitFetcher,
splitsStorage: SplitsStorage,
ruleBasedSegmentsStorage: RuleBasedSegmentsStorage,
splitChangeProcessor: SplitChangeProcessor,
changeNumber: Int64,
ruleBasedSegmentChangeProcessor: RuleBasedSegmentChangeProcessor,
changeNumber: SplitsUpdateChangeNumber,
eventsManager: SplitEventsManager,
reconnectBackoffCounter: ReconnectBackoffCounter,
splitConfig: SplitClientConfig) {

self.splitsFetcher = splitsFetcher
self.splitsStorage = splitsStorage
self.ruleBasedSegmentsStorage = ruleBasedSegmentsStorage
self.splitChangeProcessor = splitChangeProcessor
self.ruleBasedSegmentChangeProcessor = ruleBasedSegmentChangeProcessor
self.changeNumber = changeNumber
self.changeChecker = DefaultSplitsChangesChecker()

self.syncHelper = SplitsSyncHelper(splitFetcher: splitsFetcher,
splitsStorage: splitsStorage,
ruleBasedSegmentsStorage: ruleBasedSegmentsStorage,
splitChangeProcessor: splitChangeProcessor,
ruleBasedSegmentsChangeProcessor: ruleBasedSegmentChangeProcessor,
splitConfig: splitConfig)
super.init(eventsManager: eventsManager,
reconnectBackoffCounter: reconnectBackoffCounter)
}

override func fetchFromRemote() throws -> Bool {
let storedChangeNumber = splitsStorage.changeNumber
if changeNumber <= storedChangeNumber {
let flagsChangeNumber = changeNumber.flags
if let flagsChangeNumber, flagsChangeNumber <= storedChangeNumber {
return true
}

let storedRbChangeNumber: Int64 = ruleBasedSegmentsStorage.changeNumber
let rbsChangeNumber = changeNumber.rbs
if let rbsChangeNumber, rbsChangeNumber <= storedRbChangeNumber {
return true
}

do {
let result = try syncHelper.sync(since: storedChangeNumber,
till: changeNumber,
rbSince: storedRbChangeNumber,
till: flagsChangeNumber ?? rbsChangeNumber,
clearBeforeUpdate: false,
headers: ServiceConstants.controlNoCacheHeader)
if result.success {
Expand Down
5 changes: 5 additions & 0 deletions Split/FetcherEngine/Refresh/SplitBgSynchronizer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,8 @@ struct BackgroundSyncExecutor {
}
let splitsStorage = SplitDatabaseHelper.openPersistentSplitsStorage(database: splitDatabase)
let generalInfoStorage = SplitDatabaseHelper.openGeneralInfoStorage(database: splitDatabase)
let persistentRuleBasedSegmentsStorage = SplitDatabaseHelper.openPersistentRuleBasedSegmentsStorage(database: splitDatabase,
generalInfoStorage: generalInfoStorage)
let endpoints = serviceEndpoints ?? ServiceEndpoints.builder().build()
let endpointFactory = EndpointFactory(serviceEndpoints: endpoints,
apiKey: apiKey,
Expand All @@ -189,9 +191,12 @@ struct BackgroundSyncExecutor {
let bySetsFilter = splitsStorage.getBySetsFilter()
let cacheExpiration = Int64(ServiceConstants.cacheExpirationInSeconds)
let changeProcessor = DefaultSplitChangeProcessor(filterBySet: bySetsFilter)
let ruleBasedSegmentChangeProcessor = DefaultRuleBasedSegmentChangeProcessor()
self.splitsSyncWorker = BackgroundSplitsSyncWorker(splitFetcher: splitsFetcher,
persistentSplitsStorage: splitsStorage,
persistentRuleBasedSegmentsStorage: persistentRuleBasedSegmentsStorage,
splitChangeProcessor: changeProcessor,
ruleBasedSegmentsChangeProcessor: ruleBasedSegmentChangeProcessor,
cacheExpiration: cacheExpiration,
splitConfig: SplitClientConfig())

Expand Down
Loading