You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hawq.apache.org by ji...@apache.org on 2015/12/03 03:38:08 UTC

incubator-hawq git commit: HAWQ-200. Add the logic of freeing unused AO segment file status

Repository: incubator-hawq
Updated Branches:
  refs/heads/master 9e151e069 -> 13e713c18


HAWQ-200. Add the logic of freeing unused AO segment file status


Project: http://git-wip-us.apache.org/repos/asf/incubator-hawq/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-hawq/commit/13e713c1
Tree: http://git-wip-us.apache.org/repos/asf/incubator-hawq/tree/13e713c1
Diff: http://git-wip-us.apache.org/repos/asf/incubator-hawq/diff/13e713c1

Branch: refs/heads/master
Commit: 13e713c182919a69b6f90ce87c74cae71fdb6ca5
Parents: 9e151e0
Author: Lirong Jian <ji...@gmail.com>
Authored: Wed Dec 2 14:08:18 2015 +0800
Committer: Lirong Jian <ji...@gmail.com>
Committed: Thu Dec 3 10:30:37 2015 +0800

----------------------------------------------------------------------
 .../access/appendonly/appendonlywriter.c        | 42 +++++++++++++++++++-
 1 file changed, 40 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/13e713c1/src/backend/access/appendonly/appendonlywriter.c
----------------------------------------------------------------------
diff --git a/src/backend/access/appendonly/appendonlywriter.c b/src/backend/access/appendonly/appendonlywriter.c
index b53bf83..cd5c011 100644
--- a/src/backend/access/appendonly/appendonlywriter.c
+++ b/src/backend/access/appendonly/appendonlywriter.c
@@ -1672,14 +1672,52 @@ void ValidateAppendOnlyMetaDataSnapshot(
 	// Placeholder.
 }
 
+static bool
+AORelFreeSegfileStatus()
+{
+  HASH_SEQ_STATUS status;
+  AORelHashEntryData  *hentry;
+  bool freedOne = false;
+  /*
+   * loop through all entries looking for an unused one
+   */
+  hash_seq_init(&status, AppendOnlyHash);
+
+  while ((hentry = (AORelHashEntryData *) hash_seq_search(&status)) != NULL)
+  {
+    if(hentry->txns_using_rel == 0 && InvalidTransactionId==hentry->staleTid)
+    {
+      if (Debug_appendonly_print_segfile_choice)
+      {
+        ereport(LOG, (errmsg("AppendOnlyRelHashNew: Appendonly Writer removing an "
+                   "unused entry (rel %d) to make "
+                   "room for a new one",
+                   hentry->relid)));
+      }
+
+      /* remove this unused entry */
+      /* TODO: remove the LRU entry, not just any unused one */
+      freedOne = AORelRemoveHashEntry(hentry->relid, false);
+      hash_seq_term(&status);
+      break;
+    }
+  }
+  return freedOne;
+}
+
 static int
 AORelGetSegfileStatus(void)
 {
 	int result;
 
-	if (AppendOnlyWriter->num_existing_segfilestatus + 1 > MaxAORelSegFileStatus)
+
+	while (AppendOnlyWriter->num_existing_segfilestatus + 1 > MaxAORelSegFileStatus)
 	{
-		return NEXT_END_OF_LIST;
+	  bool freedOne = AORelFreeSegfileStatus();
+	  if (!freedOne)
+	  {
+	    return NEXT_END_OF_LIST;
+	  }
 	}
 
 	result = AppendOnlyWriter->head_free_segfilestatus;