Skip to content
Closed
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
46 changes: 26 additions & 20 deletions src/storages/AbstractMySegmentsCacheSync.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,12 +49,10 @@ export abstract class AbstractMySegmentsCacheSync implements ISegmentsCacheSync
* For client-side synchronizer: it resets or updates the cache.
*/
resetSegments(segmentsData: MySegmentsData | IMySegmentsResponse): boolean {
this.setChangeNumber(segmentsData.cn);

const { added, removed } = segmentsData as MySegmentsData;
let isDiff = false;

if (added && removed) {
let isDiff = false;

added.forEach(segment => {
isDiff = this.addSegment(segment) || isDiff;
Expand All @@ -63,32 +61,40 @@ export abstract class AbstractMySegmentsCacheSync implements ISegmentsCacheSync
removed.forEach(segment => {
isDiff = this.removeSegment(segment) || isDiff;
});
} else {

return isDiff;
}
const names = ((segmentsData as IMySegmentsResponse).k || []).map(s => s.n).sort();
const storedSegmentKeys = this.getRegisteredSegments().sort();

const names = ((segmentsData as IMySegmentsResponse).k || []).map(s => s.n).sort();
const storedSegmentKeys = this.getRegisteredSegments().sort();
// Extreme fast => everything is empty
if (!names.length && !storedSegmentKeys.length) {
isDiff = false;
} else {

// Extreme fast => everything is empty
if (!names.length && !storedSegmentKeys.length) return false;
let index = 0;

let index = 0;
while (index < names.length && index < storedSegmentKeys.length && names[index] === storedSegmentKeys[index]) index++;

while (index < names.length && index < storedSegmentKeys.length && names[index] === storedSegmentKeys[index]) index++;
// Quick path => no changes
if (index === names.length && index === storedSegmentKeys.length) {
isDiff = false;
} else {

// Quick path => no changes
if (index === names.length && index === storedSegmentKeys.length) return false;
// Slowest path => add and/or remove segments
for (let removeIndex = index; removeIndex < storedSegmentKeys.length; removeIndex++) {
this.removeSegment(storedSegmentKeys[removeIndex]);
}

// Slowest path => add and/or remove segments
for (let removeIndex = index; removeIndex < storedSegmentKeys.length; removeIndex++) {
this.removeSegment(storedSegmentKeys[removeIndex]);
}
for (let addIndex = index; addIndex < names.length; addIndex++) {
this.addSegment(names[addIndex]);
}

for (let addIndex = index; addIndex < names.length; addIndex++) {
this.addSegment(names[addIndex]);
isDiff = true;
}
}
}

return true;
this.setChangeNumber(segmentsData.cn);
return isDiff;
}
}
5 changes: 3 additions & 2 deletions src/storages/AbstractSplitsCacheSync.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,10 @@ export abstract class AbstractSplitsCacheSync implements ISplitsCacheSync {
protected abstract setChangeNumber(changeNumber: number): boolean | void

update(toAdd: ISplit[], toRemove: ISplit[], changeNumber: number): boolean {
let updated = toAdd.map(addedFF => this.addSplit(addedFF)).some(result => result);
updated = toRemove.map(removedFF => this.removeSplit(removedFF.name)).some(result => result) || updated;
this.setChangeNumber(changeNumber);
const updated = toAdd.map(addedFF => this.addSplit(addedFF)).some(result => result);
return toRemove.map(removedFF => this.removeSplit(removedFF.name)).some(result => result) || updated;
return updated;
}

abstract getSplit(name: string): ISplit | null
Expand Down
5 changes: 3 additions & 2 deletions src/storages/inLocalStorage/RBSegmentsCacheInLocal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,10 @@ export class RBSegmentsCacheInLocal implements IRBSegmentsCacheSync {
}

update(toAdd: IRBSegment[], toRemove: IRBSegment[], changeNumber: number): boolean {
let updated = toAdd.map(toAdd => this.add(toAdd)).some(result => result);
updated = toRemove.map(toRemove => this.remove(toRemove.name)).some(result => result) || updated;
this.setChangeNumber(changeNumber);
const updated = toAdd.map(toAdd => this.add(toAdd)).some(result => result);
return toRemove.map(toRemove => this.remove(toRemove.name)).some(result => result) || updated;
return updated;
}

private setChangeNumber(changeNumber: number) {
Expand Down