You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hudi.apache.org by si...@apache.org on 2022/01/19 23:08:24 UTC

[hudi] 03/06: [HUDI-3263] Do not nullify members in HoodieTableFileSystemView#resetViewState to avoid NPE (#4625)

This is an automated email from the ASF dual-hosted git repository.

sivabalan pushed a commit to branch release-0.10.1
in repository https://gitbox.apache.org/repos/asf/hudi.git

commit f28ea4d5a94d93d8fa7dd562e927b110312459c1
Author: Danny Chan <yu...@gmail.com>
AuthorDate: Tue Jan 18 17:46:40 2022 +0800

    [HUDI-3263] Do not nullify members in HoodieTableFileSystemView#resetViewState to avoid NPE (#4625)
---
 .../table/view/HoodieTableFileSystemView.java      | 30 +++++++++++++++-------
 1 file changed, 21 insertions(+), 9 deletions(-)

diff --git a/hudi-common/src/main/java/org/apache/hudi/common/table/view/HoodieTableFileSystemView.java b/hudi-common/src/main/java/org/apache/hudi/common/table/view/HoodieTableFileSystemView.java
index b8f7f31..299dbab 100644
--- a/hudi-common/src/main/java/org/apache/hudi/common/table/view/HoodieTableFileSystemView.java
+++ b/hudi-common/src/main/java/org/apache/hudi/common/table/view/HoodieTableFileSystemView.java
@@ -114,11 +114,22 @@ public class HoodieTableFileSystemView extends IncrementalTimelineSyncFileSystem
 
   @Override
   protected void resetViewState() {
-    this.fgIdToPendingCompaction = null;
-    this.partitionToFileGroupsMap = null;
-    this.fgIdToBootstrapBaseFile = null;
-    this.fgIdToReplaceInstants = null;
-    this.fgIdToPendingClustering = null;
+    // do not nullify the members to avoid NPE.
+
+    // there are two cases that #resetViewState is called:
+    // 1. when #sync is invoked, the view clear the state through calling #resetViewState,
+    // then re-initialize the view;
+    // 2. when #close is invoked.
+    // (see AbstractTableFileSystemView for details.)
+
+    // for the 1st case, we better do not nullify the members when #resetViewState
+    // because there is possibility that this in-memory view is a backend view under TimelineServer,
+    // and many methods in the RequestHandler is not thread safe, when performRefreshCheck flag in ViewHandler
+    // is set as false, the view does not perform refresh check, if #sync is called just before and the members
+    // are nullified, the methods that use these members would throw NPE.
+
+    // actually there is no need to nullify the members here for 1st case, the members are assigned with new values
+    // when calling #init, for 2nd case, the #close method already nullify the members.
   }
 
   protected Map<String, List<HoodieFileGroup>> createPartitionToFileGroups() {
@@ -350,10 +361,11 @@ public class HoodieTableFileSystemView extends IncrementalTimelineSyncFileSystem
   @Override
   public void close() {
     super.close();
-    partitionToFileGroupsMap = null;
-    fgIdToPendingCompaction = null;
-    fgIdToBootstrapBaseFile = null;
-    fgIdToReplaceInstants = null;
+    this.fgIdToPendingCompaction = null;
+    this.partitionToFileGroupsMap = null;
+    this.fgIdToBootstrapBaseFile = null;
+    this.fgIdToReplaceInstants = null;
+    this.fgIdToPendingClustering = null;
     closed = true;
   }