| 3772 | } |
| 3773 | |
| 3774 | Future<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 | |
| 3821 | ACTOR Future<Void> watchValueMap(Future<Version> version, |
| 3822 | TenantInfo tenant, |
no test coverage detected