MCPcopy Create free account
hub / github.com/apple/foundationdb / getWatchFuture

Function getWatchFuture

fdbclient/NativeAPI.actor.cpp:3774–3819  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

3772}
3773
3774Future<Void> getWatchFuture(Database cx, Reference<WatchParameters> parameters) {
3775 Reference<WatchMetadata> metadata = cx->getWatchMetadata(parameters->tenant.tenantId, parameters->key);
3776
3777 // case 1: key not in map
3778 if (!metadata.isValid()) {
3779 metadata = makeReference<WatchMetadata>(parameters);
3780 cx->setWatchMetadata(metadata);
3781
3782 metadata->watchFutureSS = watchStorageServerResp(parameters->tenant.tenantId, parameters->key, cx);
3783 return success(metadata->watchPromise.getFuture());
3784 }
3785 // case 2: val_1 == val_2 (received watch with same value as key already in the map so just update)
3786 else if (metadata->parameters->value == parameters->value) {
3787 if (parameters->version > metadata->parameters->version) {
3788 metadata->parameters = parameters;
3789 }
3790
3791 return success(metadata->watchPromise.getFuture());
3792 }
3793 // case 3: val_1 != val_2 && version_2 > version_1 (received watch with different value and a higher version so
3794 // recreate in SS)
3795 else if (parameters->version > metadata->parameters->version) {
3796 CODE_PROBE(true,
3797 "Setting a watch that has a different value than the one in the map but a higher version (newer)");
3798 cx->deleteWatchMetadata(parameters->tenant.tenantId, parameters->key);
3799
3800 metadata->watchPromise.send(parameters->version);
3801 metadata->watchFutureSS.cancel();
3802
3803 metadata = makeReference<WatchMetadata>(parameters);
3804 cx->setWatchMetadata(metadata);
3805
3806 metadata->watchFutureSS = watchStorageServerResp(parameters->tenant.tenantId, parameters->key, cx);
3807
3808 return success(metadata->watchPromise.getFuture());
3809 }
3810 // case 5: val_1 != val_2 && version_1 == version_2 (received watch with different value but same version)
3811 else if (metadata->parameters->version == parameters->version) {
3812 CODE_PROBE(true, "Setting a watch which has a different value than the one in the map but the same version");
3813 return sameVersionDiffValue(cx, parameters);
3814 }
3815 CODE_PROBE(true, "Setting a watch which has a different value than the one in the map but a lower version (older)");
3816
3817 // case 4: val_1 != val_2 && version_2 < version_1
3818 return Void();
3819}
3820
3821ACTOR Future<Void> watchValueMap(Future<Version> version,
3822 TenantInfo tenant,

Callers 1

Calls 8

cancelMethod · 0.65
VoidClass · 0.50
getWatchMetadataMethod · 0.45
isValidMethod · 0.45
setWatchMetadataMethod · 0.45
getFutureMethod · 0.45
deleteWatchMetadataMethod · 0.45
sendMethod · 0.45

Tested by

no test coverage detected