>From Wail Alkowaileet <[email protected]>:
Wail Alkowaileet has uploaded this change for review. (
https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17935 )
Change subject: [ASTERIXDB-3306][STO] Ensure no ongoing I/Os before cleaning a
partition
......................................................................
[ASTERIXDB-3306][STO] Ensure no ongoing I/Os before cleaning a partition
- user model changes: no
- storage format changes: no
- interface changes: no
Details:
When cleaning a partition, we could end up deleting files that are being
produced by an ongoing operations – namely an asynchronous merge.
Change-Id: Ia9a84eedbcb33c29f03155a8605bb82af372f7f4
---
M
asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/NCAppRuntimeContext.java
M
asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepository.java
M
asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/AllDatasetsReplicationStrategy.java
M
asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepositoryFactory.java
4 files changed, 33 insertions(+), 7 deletions(-)
git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb
refs/changes/35/17935/1
diff --git
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/NCAppRuntimeContext.java
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/NCAppRuntimeContext.java
index bf42541..aee5c01 100644
---
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/NCAppRuntimeContext.java
+++
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/NCAppRuntimeContext.java
@@ -196,9 +196,12 @@
lsmIOScheduler = createIoScheduler(storageProperties);
metadataMergePolicyFactory = new ConcurrentMergePolicyFactory();
indexCheckpointManagerProvider = new
IndexCheckpointManagerProvider(ioManager);
+ datasetLifecycleManager =
+ new DatasetLifecycleManager(storageProperties,
localResourceRepository, txnSubsystem.getLogManager(),
+ virtualBufferCache, indexCheckpointManagerProvider,
ioManager.getIODevices().size());
ILocalResourceRepositoryFactory
persistentLocalResourceRepositoryFactory =
new PersistentLocalResourceRepositoryFactory(ioManager,
indexCheckpointManagerProvider,
- persistedResourceRegistry);
+ persistedResourceRegistry, datasetLifecycleManager);
localResourceRepository =
(PersistentLocalResourceRepository)
persistentLocalResourceRepositoryFactory.createRepository();
configValidator = configValidatorFactory.create();
@@ -226,9 +229,6 @@
// Must start vbc now instead of by life cycle component manager
(lccm) because lccm happens after
// the metadata bootstrap task
((ILifeCycleComponent) virtualBufferCache).start();
- datasetLifecycleManager =
- new DatasetLifecycleManager(storageProperties,
localResourceRepository, txnSubsystem.getLogManager(),
- virtualBufferCache, indexCheckpointManagerProvider,
ioManager.getIODevices().size());
final String nodeId = getServiceContext().getNodeId();
final Set<Integer> nodePartitions =
metadataProperties.getNodePartitions(nodeId);
replicaManager = new ReplicaManager(this, nodePartitions);
diff --git
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/AllDatasetsReplicationStrategy.java
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/AllDatasetsReplicationStrategy.java
index c969777..84f0a39 100644
---
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/AllDatasetsReplicationStrategy.java
+++
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/AllDatasetsReplicationStrategy.java
@@ -19,6 +19,7 @@
package org.apache.asterix.common.replication;
public class AllDatasetsReplicationStrategy implements IReplicationStrategy {
+ public static final IReplicationStrategy INSTANCE = new
AllDatasetsReplicationStrategy();
@Override
public boolean isMatch(int datasetId) {
diff --git
a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepository.java
b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepository.java
index f9bf175..9c08c7b 100644
---
a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepository.java
+++
b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepository.java
@@ -46,8 +46,10 @@
import java.util.stream.Collectors;
import java.util.stream.Stream;
+import org.apache.asterix.common.api.IDatasetLifecycleManager;
import org.apache.asterix.common.dataflow.DatasetLocalResource;
import org.apache.asterix.common.exceptions.AsterixException;
+import org.apache.asterix.common.replication.AllDatasetsReplicationStrategy;
import org.apache.asterix.common.replication.IReplicationManager;
import org.apache.asterix.common.replication.IReplicationStrategy;
import org.apache.asterix.common.replication.ReplicationJob;
@@ -110,13 +112,15 @@
private final List<Path> storageRoots;
private final IIndexCheckpointManagerProvider
indexCheckpointManagerProvider;
private final IPersistedResourceRegistry persistedResourceRegistry;
+ private final IDatasetLifecycleManager datasetLifecycleManager;
public PersistentLocalResourceRepository(IIOManager ioManager,
IIndexCheckpointManagerProvider indexCheckpointManagerProvider,
- IPersistedResourceRegistry persistedResourceRegistry) {
+ IPersistedResourceRegistry persistedResourceRegistry,
IDatasetLifecycleManager datasetLifecycleManager) {
this.ioManager = ioManager;
this.indexCheckpointManagerProvider = indexCheckpointManagerProvider;
this.persistedResourceRegistry = persistedResourceRegistry;
+ this.datasetLifecycleManager = datasetLifecycleManager;
storageRoots = new ArrayList<>();
final List<IODeviceHandle> ioDevices = ioManager.getIODevices();
for (int i = 0; i < ioDevices.size(); i++) {
@@ -480,6 +484,7 @@
}
public synchronized void cleanup(int partition) throws
HyracksDataException {
+
datasetLifecycleManager.waitForIO(AllDatasetsReplicationStrategy.INSTANCE,
partition);
final Set<File> partitionIndexes = getPartitionIndexes(partition);
try {
for (File index : partitionIndexes) {
diff --git
a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepositoryFactory.java
b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepositoryFactory.java
index d1de086..83c9f04 100644
---
a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepositoryFactory.java
+++
b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepositoryFactory.java
@@ -18,6 +18,7 @@
*/
package org.apache.asterix.transaction.management.resource;
+import org.apache.asterix.common.api.IDatasetLifecycleManager;
import org.apache.asterix.common.storage.IIndexCheckpointManagerProvider;
import org.apache.hyracks.api.io.IIOManager;
import org.apache.hyracks.api.io.IPersistedResourceRegistry;
@@ -28,18 +29,20 @@
private final IIOManager ioManager;
private final IIndexCheckpointManagerProvider
indexCheckpointManagerProvider;
private final IPersistedResourceRegistry persistedResourceRegistry;
+ private final IDatasetLifecycleManager datasetLifecycleManager;
public PersistentLocalResourceRepositoryFactory(IIOManager ioManager,
IIndexCheckpointManagerProvider indexCheckpointManagerProvider,
- IPersistedResourceRegistry persistedResourceRegistry) {
+ IPersistedResourceRegistry persistedResourceRegistry,
IDatasetLifecycleManager datasetLifecycleManager) {
this.ioManager = ioManager;
this.indexCheckpointManagerProvider = indexCheckpointManagerProvider;
this.persistedResourceRegistry = persistedResourceRegistry;
+ this.datasetLifecycleManager = datasetLifecycleManager;
}
@Override
public ILocalResourceRepository createRepository() {
return new PersistentLocalResourceRepository(ioManager,
indexCheckpointManagerProvider,
- persistedResourceRegistry);
+ persistedResourceRegistry, datasetLifecycleManager);
}
}
--
To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17935
To unsubscribe, or for help writing mail filters, visit
https://asterix-gerrit.ics.uci.edu/settings
Gerrit-Project: asterixdb
Gerrit-Branch: neo
Gerrit-Change-Id: Ia9a84eedbcb33c29f03155a8605bb82af372f7f4
Gerrit-Change-Number: 17935
Gerrit-PatchSet: 1
Gerrit-Owner: Wail Alkowaileet <[email protected]>
Gerrit-MessageType: newchange