You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@asterixdb.apache.org by am...@apache.org on 2018/08/04 06:34:07 UTC
asterixdb git commit: [NO ISSUE][STO] Skip flush recovery of empty
resources
Repository: asterixdb
Updated Branches:
refs/heads/master 6cd3127c4 -> 8026b2dc9
[NO ISSUE][STO] Skip flush recovery of empty resources
- user model changes: no
- storage format changes: no
- interface changes: no
Details:
- Before this change, recovery would throw a NullPointerException
on recovery of a flush operation on a component without
update logs.
- Since this can happen, we simply check for the case and skip the
flush.
Change-Id: Ib01d7513f43830109632760860d34ca3dcddeaee
Reviewed-on: https://asterix-gerrit.ics.uci.edu/2844
Tested-by: Jenkins <je...@fulliautomatix.ics.uci.edu>
Contrib: Jenkins <je...@fulliautomatix.ics.uci.edu>
Reviewed-by: abdullah alamoudi <ba...@gmail.com>
Integration-Tests: Jenkins <je...@fulliautomatix.ics.uci.edu>
Reviewed-by: Murtadha Hubail <mh...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/asterixdb/repo
Commit: http://git-wip-us.apache.org/repos/asf/asterixdb/commit/8026b2dc
Tree: http://git-wip-us.apache.org/repos/asf/asterixdb/tree/8026b2dc
Diff: http://git-wip-us.apache.org/repos/asf/asterixdb/diff/8026b2dc
Branch: refs/heads/master
Commit: 8026b2dc95b0b48949b192409be97ec40ac3fa2d
Parents: 6cd3127
Author: Abdullah Alamoudi <ba...@gmail.com>
Authored: Fri Aug 3 15:46:20 2018 -0700
Committer: abdullah alamoudi <ba...@gmail.com>
Committed: Fri Aug 3 23:33:48 2018 -0700
----------------------------------------------------------------------
.../apache/asterix/app/nc/RecoveryManager.java | 30 ++++++++++++--------
1 file changed, 18 insertions(+), 12 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8026b2dc/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/RecoveryManager.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/RecoveryManager.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/RecoveryManager.java
index 5e8a5e8..adf9960 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/RecoveryManager.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/RecoveryManager.java
@@ -296,7 +296,7 @@ public class RecoveryManager implements IRecoveryManager, ILifeCycleComponent {
((INcApplicationContext) (serviceCtx.getApplicationContext())).getIndexCheckpointManagerProvider();
Map<Long, LocalResource> resourcesMap = localResourceRepository.loadAndGetAllResources();
- Map<Long, Long> resourceId2MaxLSNMap = new HashMap<>();
+ final Map<Long, Long> resourceId2MaxLSNMap = new HashMap<>();
TxnEntityId tempKeyTxnEntityId = new TxnEntityId(-1, -1, -1, null, -1, false);
ILogRecord logRecord = null;
@@ -399,19 +399,25 @@ public class RecoveryManager implements IRecoveryManager, ILifeCycleComponent {
// we only need to flush open indexes here (opened by previous update records)
// if an index has no ongoing updates, then it's memory component must be empty
// and there is nothing to flush
- for (IndexInfo iInfo : dsInfo.getIndexes().values()) {
+ for (final IndexInfo iInfo : dsInfo.getIndexes().values()) {
if (iInfo.isOpen() && iInfo.getPartition() == partition) {
- maxDiskLastLsn = resourceId2MaxLSNMap.get(iInfo.getResourceId());
- index = iInfo.getIndex();
- if (logRecord.getLSN() > maxDiskLastLsn
- && !index.isCurrentMutableComponentEmpty()) {
- // schedule flush
- redoFlush(index, logRecord);
- redoCount++;
+ Long maxLsnBeforeFlush = resourceId2MaxLSNMap.get(iInfo.getResourceId());
+ if (maxLsnBeforeFlush != null) {
+ // If there was at least one update to the resource.
+ // IMPORTANT: Don't remove the check above
+ // This check is to support indexes without transaction logs
+ maxDiskLastLsn = maxLsnBeforeFlush;
+ index = iInfo.getIndex();
+ if (logRecord.getLSN() > maxDiskLastLsn
+ && !index.isCurrentMutableComponentEmpty()) {
+ // schedule flush
+ redoFlush(index, logRecord);
+ redoCount++;
+ } else {
+ // TODO: update checkpoint file?
+ }
} else {
- // otherwise, do nothing since this component had no records when flush was
- // scheduled.. TODO: update checkpoint file? and do the
- // lsn checks from the checkpoint file
+ // TODO: update checkpoint file?
}
}
}