@Override public void commitMigration(PartitionMigrationEvent event) { if (event.getMigrationEndpoint() == MigrationEndpoint.SOURCE) { clearCollectionsHavingLesserBackupCountThan(event.getPartitionId(), event.getNewReplicaIndex()); } }
@Override public void rollbackMigration(PartitionMigrationEvent event) { if (event.getMigrationEndpoint() == MigrationEndpoint.DESTINATION) { int thresholdReplicaIndex = event.getCurrentReplicaIndex(); if (thresholdReplicaIndex == -1 || thresholdReplicaIndex > 1) { clearPartitionReplica(event.getPartitionId()); } } }
/** * Returns whether event involves primary replica migration. * @param event migration event * @return true if migration involves primary replica, false otherwise */ static boolean isPrimaryReplicaMigrationEvent(PartitionMigrationEvent event) { return (event.getCurrentReplicaIndex() == PRIMARY_REPLICA_INDEX || event.getNewReplicaIndex() == PRIMARY_REPLICA_INDEX); }
private static boolean isLocalPromotion(PartitionMigrationEvent event) { return event.getMigrationEndpoint() == DESTINATION && event.getCurrentReplicaIndex() > 0 && event.getNewReplicaIndex() == 0; }
@Override public void commitMigration(PartitionMigrationEvent e) { if (e.getMigrationEndpoint() == MigrationEndpoint.SOURCE) { containers[e.getPartitionId()].clear(); } }
private void depopulateIndexes(PartitionMigrationEvent event) { assert event.getMigrationEndpoint() == SOURCE; assert event.getNewReplicaIndex() != 0 : "Invalid migration event: " + event; if (event.getCurrentReplicaIndex() != 0) { // backup partitions have no indexes to depopulate return; } final long now = getNow(); final PartitionContainer container = mapServiceContext.getPartitionContainer(event.getPartitionId()); for (RecordStore recordStore : container.getMaps().values()) { final MapContainer mapContainer = mapServiceContext.getMapContainer(recordStore.getName()); final Indexes indexes = mapContainer.getIndexes(event.getPartitionId()); if (!indexes.hasIndex()) { // no indexes to work with continue; } final Iterator<Record> iterator = recordStore.iterator(now, false); while (iterator.hasNext()) { final Record record = iterator.next(); final Data key = record.getKey(); final Object value = Records.getValueOrCachedValue(record, serializationService); indexes.removeEntryIndex(key, value, Index.OperationSource.SYSTEM); } } }
@Override public void beforeMigration(@Nonnull PartitionMigrationEvent event) { int partitionId = event.getPartitionId(); SequencerPartition partition = partitions.get(partitionId); if (partition != null) { partition.freeze(); } }
PartitionMigrationEvent getPartitionMigrationEvent() { return new PartitionMigrationEvent(DESTINATION, getPartitionId(), migrationInfo.getDestinationCurrentReplicaIndex(), 0); }
@Override public void rollbackMigration(PartitionMigrationEvent e) { if (e.getMigrationEndpoint() == MigrationEndpoint.DESTINATION) { containers[e.getPartitionId()].clear(); } }
private void depopulateIndexes(PartitionMigrationEvent event) { assert event.getMigrationEndpoint() == SOURCE; assert event.getNewReplicaIndex() != 0 : "Invalid migration event: " + event; if (event.getCurrentReplicaIndex() != 0) { // backup partitions have no indexes to depopulate return; } final long now = getNow(); final PartitionContainer container = mapServiceContext.getPartitionContainer(event.getPartitionId()); for (RecordStore recordStore : container.getMaps().values()) { final MapContainer mapContainer = mapServiceContext.getMapContainer(recordStore.getName()); final Indexes indexes = mapContainer.getIndexes(event.getPartitionId()); if (!indexes.haveAtLeastOneIndex()) { // no indexes to work with continue; } final InternalIndex[] indexesSnapshot = indexes.getIndexes(); final Iterator<Record> iterator = recordStore.iterator(now, false); while (iterator.hasNext()) { final Record record = iterator.next(); final Data key = record.getKey(); final Object value = Records.getValueOrCachedValue(record, serializationService); indexes.removeEntry(key, value, Index.OperationSource.SYSTEM); } Indexes.markPartitionAsUnindexed(event.getPartitionId(), indexesSnapshot); } }
private static boolean isLocalPromotion(PartitionMigrationEvent event) { return event.getMigrationEndpoint() == DESTINATION && event.getCurrentReplicaIndex() > 0 && event.getNewReplicaIndex() == 0; }
@Override public void rollbackMigration(@Nonnull PartitionMigrationEvent event) { int partitionId = event.getPartitionId(); SequencerPartition partition = partitions.get(partitionId); if (partition != null) { partition.unfreeze(); } }
/** * Returns whether event involves primary replica migration. * @param event migration event * @return true if migration involves primary replica, false otherwise */ static boolean isPrimaryReplicaMigrationEvent(PartitionMigrationEvent event) { return (event.getCurrentReplicaIndex() == PRIMARY_REPLICA_INDEX || event.getNewReplicaIndex() == PRIMARY_REPLICA_INDEX); }
PartitionMigrationEvent getPartitionMigrationEvent() { return new PartitionMigrationEvent(DESTINATION, getPartitionId(), migrationInfo.getDestinationCurrentReplicaIndex(), 0); }
@Override public void commitMigration(PartitionMigrationEvent event) { if (event.getMigrationEndpoint() == MigrationEndpoint.SOURCE) { clearSemaphoresHavingLesserBackupCountThan(event.getPartitionId(), event.getNewReplicaIndex()); } }
@Override public void rollbackMigration(PartitionMigrationEvent event) { if (event.getMigrationEndpoint() == MigrationEndpoint.DESTINATION) { clearPartitionReplica(event.getPartitionId(), event.getCurrentReplicaIndex()); } }
@Override public void commitMigration(@Nonnull PartitionMigrationEvent event) { int partitionId = event.getPartitionId(); SequencerPartition partition = partitions.get(partitionId); if (partition != null) { if (event.getMigrationEndpoint() == MigrationEndpoint.SOURCE) { partitions.remove(partitionId); } partition.unfreeze(); } }
private void clearNonGlobalIndexes(PartitionMigrationEvent event) { final PartitionContainer container = mapServiceContext.getPartitionContainer(event.getPartitionId()); for (RecordStore recordStore : container.getMaps().values()) { final MapContainer mapContainer = mapServiceContext.getMapContainer(recordStore.getName()); final Indexes indexes = mapContainer.getIndexes(event.getPartitionId()); if (!indexes.hasIndex() || indexes.isGlobal()) { // no indexes to work with continue; } indexes.clearAll(); } }
@Override protected PartitionMigrationEvent getMigrationEvent() { return new PartitionMigrationEvent(MigrationEndpoint.SOURCE, migrationInfo.getPartitionId(), migrationInfo.getSourceCurrentReplicaIndex(), migrationInfo.getSourceNewReplicaIndex()); }
@Override public void commitMigration(PartitionMigrationEvent event) { if (event.getMigrationEndpoint() == MigrationEndpoint.SOURCE) { clearQueuesHavingLesserBackupCountThan(event.getPartitionId(), event.getNewReplicaIndex()); } }