You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sdap.apache.org by rk...@apache.org on 2024/03/06 18:29:06 UTC

(incubator-sdap-ingester) branch SDAP-512 created (now 8f5df51)

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

rkk pushed a change to branch SDAP-512
in repository https://gitbox.apache.org/repos/asf/incubator-sdap-ingester.git


      at 8f5df51  Changelog

This branch includes the following new commits:

     new 835123f  Explicitly close Solr & ZK connections
     new 30d5b1d  Try just using destructor instead of explicit close() calls
     new 8f5df51  Changelog

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(incubator-sdap-ingester) 02/03: Try just using destructor instead of explicit close() calls

Posted by rk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rkk pushed a commit to branch SDAP-512
in repository https://gitbox.apache.org/repos/asf/incubator-sdap-ingester.git

commit 30d5b1d6f890963025960087c863424079c660fd
Author: rileykk <ri...@jpl.nasa.gov>
AuthorDate: Wed Mar 6 10:22:36 2024 -0800

    Try just using destructor instead of explicit close() calls
---
 granule_ingester/granule_ingester/pipeline/Pipeline.py     | 9 +++++----
 granule_ingester/granule_ingester/writers/MetadataStore.py | 3 +++
 2 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/granule_ingester/granule_ingester/pipeline/Pipeline.py b/granule_ingester/granule_ingester/pipeline/Pipeline.py
index 541700f..662aa46 100644
--- a/granule_ingester/granule_ingester/pipeline/Pipeline.py
+++ b/granule_ingester/granule_ingester/pipeline/Pipeline.py
@@ -257,11 +257,12 @@ class Pipeline:
                 logger.info(f"Now writing generated tiles...")
 
                 await self._data_store_factory().save_batch(results)
+                await self._metadata_store_factory().save_batch(results)
 
-                metadata_store = self._metadata_store_factory()
-                await metadata_store.save_batch(results)
-
-                metadata_store.close()
+                # metadata_store = self._metadata_store_factory()
+                # await metadata_store.save_batch(results)
+                #
+                # metadata_store.close()
 
         end = time.perf_counter()
         logger.info("Pipeline finished in {} seconds".format(end - start))
diff --git a/granule_ingester/granule_ingester/writers/MetadataStore.py b/granule_ingester/granule_ingester/writers/MetadataStore.py
index 7296075..e1e317b 100644
--- a/granule_ingester/granule_ingester/writers/MetadataStore.py
+++ b/granule_ingester/granule_ingester/writers/MetadataStore.py
@@ -41,3 +41,6 @@ class MetadataStore(HealthCheck, ABC):
     def close(self) -> None:
         pass
 
+    def __del__(self):
+        self.close()
+


(incubator-sdap-ingester) 03/03: Changelog

Posted by rk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rkk pushed a commit to branch SDAP-512
in repository https://gitbox.apache.org/repos/asf/incubator-sdap-ingester.git

commit 8f5df51d34562e366e931d45c0c0ecb7e00163af
Author: rileykk <ri...@jpl.nasa.gov>
AuthorDate: Wed Mar 6 10:28:58 2024 -0800

    Changelog
---
 CHANGELOG.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index ec18b01..3ba8fc9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 ### Removed
 ### Fixed
 - SDAP-488: Workaround to build issue on Apple Silicon (M1/M2). GI image build installs nexusproto through PyPI instead of building from source. A build arg `BUILD_NEXUSPROTO` was defined to allow building from source if desired/
+- SDAP-512: Fixed Granule Ingester not closing connections to Zookeeper, eventually exhausting network resources and requiring a restart
 ### Security
 
 ## [1.1.0] - 2023-04-26


(incubator-sdap-ingester) 01/03: Explicitly close Solr & ZK connections

Posted by rk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rkk pushed a commit to branch SDAP-512
in repository https://gitbox.apache.org/repos/asf/incubator-sdap-ingester.git

commit 835123f88af734266e765b2b2dda1266f8a97a73
Author: rileykk <ri...@jpl.nasa.gov>
AuthorDate: Wed Mar 6 09:41:52 2024 -0800

    Explicitly close Solr & ZK connections
---
 .../granule_ingester/pipeline/Pipeline.py          |  6 +++++-
 .../granule_ingester/writers/MetadataStore.py      | 10 +++++++++
 .../granule_ingester/writers/SolrStore.py          | 25 ++++++++++++++++------
 3 files changed, 33 insertions(+), 8 deletions(-)

diff --git a/granule_ingester/granule_ingester/pipeline/Pipeline.py b/granule_ingester/granule_ingester/pipeline/Pipeline.py
index 9ebb529..541700f 100644
--- a/granule_ingester/granule_ingester/pipeline/Pipeline.py
+++ b/granule_ingester/granule_ingester/pipeline/Pipeline.py
@@ -257,7 +257,11 @@ class Pipeline:
                 logger.info(f"Now writing generated tiles...")
 
                 await self._data_store_factory().save_batch(results)
-                await self._metadata_store_factory().save_batch(results)
+
+                metadata_store = self._metadata_store_factory()
+                await metadata_store.save_batch(results)
+
+                metadata_store.close()
 
         end = time.perf_counter()
         logger.info("Pipeline finished in {} seconds".format(end - start))
diff --git a/granule_ingester/granule_ingester/writers/MetadataStore.py b/granule_ingester/granule_ingester/writers/MetadataStore.py
index 8a97566..7296075 100644
--- a/granule_ingester/granule_ingester/writers/MetadataStore.py
+++ b/granule_ingester/granule_ingester/writers/MetadataStore.py
@@ -18,6 +18,8 @@ from abc import ABC, abstractmethod
 from nexusproto import DataTile_pb2 as nexusproto
 
 from granule_ingester.healthcheck import HealthCheck
+from asyncio import AbstractEventLoop
+
 
 from typing import List
 
@@ -31,3 +33,11 @@ class MetadataStore(HealthCheck, ABC):
     def save_batch(self, tiles: List[nexusproto.NexusTile]) -> None:
         pass
 
+    @abstractmethod
+    def connect(self, loop: AbstractEventLoop = None) -> None:
+        pass
+
+    @abstractmethod
+    def close(self) -> None:
+        pass
+
diff --git a/granule_ingester/granule_ingester/writers/SolrStore.py b/granule_ingester/granule_ingester/writers/SolrStore.py
index 2dac038..963e4bc 100644
--- a/granule_ingester/granule_ingester/writers/SolrStore.py
+++ b/granule_ingester/granule_ingester/writers/SolrStore.py
@@ -21,7 +21,7 @@ import logging
 from asyncio import AbstractEventLoop
 from datetime import datetime
 from pathlib import Path
-from typing import Dict, List, Union
+from typing import Dict, List, Union, Tuple, Optional
 
 import pysolr
 from kazoo.exceptions import NoNodeError
@@ -51,7 +51,8 @@ class SolrStore(MetadataStore):
         self.geo_precision: int = 3
         self._collection: str = "nexustiles"
         self.log: logging.Logger = logging.getLogger(__name__)
-        self._solr = None
+        self._solr: Optional[pysolr.Solr] = None
+        self._zk: Optional[pysolr.ZooKeeper] = None
 
     def _get_collections(self, zk, parent_nodes):
         """
@@ -85,23 +86,33 @@ class SolrStore(MetadataStore):
             collections.update(json.loads(zk.zk.get(f"{parent_node}/{c}/state.json")[0].decode("utf-8")))
         zk.collections = collections
 
-    def _get_connection(self) -> pysolr.Solr:
+    def _get_connection(self) -> Tuple[pysolr.Solr, Union[pysolr.ZooKeeper, None]]:
         if self._zk_url:
             zk = pysolr.ZooKeeper(f"{self._zk_url}")
             self._set_solr_status(zk)
-            return pysolr.SolrCloud(zk, self._collection, always_commit=True)
+            return pysolr.SolrCloud(zk, self._collection, always_commit=True), zk
         elif self._solr_url:
-            return pysolr.Solr(f'{self._solr_url}/solr/{self._collection}', always_commit=True)
+            return pysolr.Solr(f'{self._solr_url}/solr/{self._collection}', always_commit=True), None
         else:
             raise RuntimeError("You must provide either solr_host or zookeeper_host.")
 
     def connect(self, loop: AbstractEventLoop = None):
-        self._solr = self._get_connection()
+        self._solr, self._zk = self._get_connection()
+
+    def close(self):
+        if self._solr is not None:
+            self._solr.get_session().close()
+
+        if self._zk is not None:
+            self._zk.zk.stop()
+            self._zk.zk.close()
 
     async def health_check(self):
         try:
-            connection = self._get_connection()
+            connection, _ = self._get_connection()
             connection.ping()
+
+            self.close()
         except pysolr.SolrError:
             raise SolrFailedHealthCheckError("Cannot connect to Solr!")
         except NoNodeError: