Skip to content

Commit 63e7105

Browse files
committed
Fix UnsupportedOperationException from ReadOnlyVersion in storeMetadataUpdate
1 parent c92eadf commit 63e7105

3 files changed

Lines changed: 19 additions & 2 deletions

File tree

internal/venice-common/src/main/java/com/linkedin/venice/meta/ReadOnlyStore.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1588,6 +1588,12 @@ public Version getVersion(int versionNumber) {
15881588
return version;
15891589
}
15901590

1591+
@Override
1592+
public void setVersionTargetRegionPromoted(int versionNumber, boolean targetRegionPromoted) {
1593+
// Delegate to the mutable store to bypass ReadOnlyVersion, which throws on setters.
1594+
this.delegate.setVersionTargetRegionPromoted(versionNumber, targetRegionPromoted);
1595+
}
1596+
15911597
@Override
15921598
@Nonnull
15931599
public Version getVersionOrThrow(int versionNumber) throws StoreVersionNotFoundException {

internal/venice-common/src/main/java/com/linkedin/venice/meta/Store.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,13 @@ default IntSet getVersionNumbers() {
288288

289289
void updateVersionStatus(int versionNumber, VersionStatus status);
290290

291+
default void setVersionTargetRegionPromoted(int versionNumber, boolean targetRegionPromoted) {
292+
Version version = getVersion(versionNumber);
293+
if (version != null) {
294+
version.setTargetRegionPromoted(targetRegionPromoted);
295+
}
296+
}
297+
291298
int peekNextVersionNumber();
292299

293300
/**

services/venice-controller/src/main/java/com/linkedin/venice/controller/VeniceHelixAdmin.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6682,9 +6682,13 @@ private void internalUpdateStore(String clusterName, String storeName, UpdateSto
66826682

66836683
if (targetRegionPromoted.orElse(false)) {
66846684
storeMetadataUpdate(clusterName, storeName, (store, resources) -> {
6685-
Version futureVersion = store.getVersion(store.getLargestUsedVersionNumber());
6685+
int futureVersionNum = store.getLargestUsedVersionNumber();
6686+
Version futureVersion = store.getVersion(futureVersionNum);
66866687
if (futureVersion != null && !futureVersion.isTargetRegionPromoted()) {
6687-
futureVersion.setTargetRegionPromoted(true);
6688+
// Use store.setVersionTargetRegionPromoted rather than futureVersion.setTargetRegionPromoted
6689+
// because storeMetadataUpdate may provide a ReadOnlyStore whose getVersion() wraps versions
6690+
// in ReadOnlyVersion (setters throw). The store-level method bypasses that wrapper.
6691+
store.setVersionTargetRegionPromoted(futureVersionNum, true);
66886692
}
66896693
return store;
66906694
});

0 commit comments

Comments
 (0)