You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by el...@apache.org on 2023/07/11 00:31:24 UTC

[superset] 03/03: chore(key-value): use json serialization for main resources (#23888)

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

elizabeth pushed a commit to branch 2.1
in repository https://gitbox.apache.org/repos/asf/superset.git

commit 893097b68cb9b6dfd10399aeb6234d3f4e266a66
Author: Ville Brofeldt <33...@users.noreply.github.com>
AuthorDate: Thu May 4 08:04:05 2023 +0300

    chore(key-value): use json serialization for main resources (#23888)
---
 superset/extensions/metastore_cache.py              |  1 +
 ...c2a5681ddfd_convert_key_value_entries_to_json.py | 21 +++++++++++++++++++++
 .../explore/permalink/api_tests.py                  |  8 ++++++++
 3 files changed, 30 insertions(+)

diff --git a/superset/extensions/metastore_cache.py b/superset/extensions/metastore_cache.py
index 0dbd42b2b4..4e6f0067dd 100644
--- a/superset/extensions/metastore_cache.py
+++ b/superset/extensions/metastore_cache.py
@@ -31,6 +31,7 @@ from superset.key_value.types import (
 from superset.key_value.utils import get_uuid_namespace
 
 RESOURCE = KeyValueResource.METASTORE_CACHE
+CODEC = PickleKeyValueCodec()
 
 logger = logging.getLogger(__name__)
 
diff --git a/superset/migrations/versions/2023-05-01_12-03_9c2a5681ddfd_convert_key_value_entries_to_json.py b/superset/migrations/versions/2023-05-01_12-03_9c2a5681ddfd_convert_key_value_entries_to_json.py
index 6e55f3ddc9..ea285d0808 100644
--- a/superset/migrations/versions/2023-05-01_12-03_9c2a5681ddfd_convert_key_value_entries_to_json.py
+++ b/superset/migrations/versions/2023-05-01_12-03_9c2a5681ddfd_convert_key_value_entries_to_json.py
@@ -17,14 +17,22 @@
 """convert key-value entries to json
 
 Revision ID: 9c2a5681ddfd
+<<<<<<< HEAD
 Revises: f3c2d8ec8595
+=======
+Revises: 7e67aecbf3f1
+>>>>>>> f1fa1a733... chore(key-value): use json serialization for main resources (#23888)
 Create Date: 2023-05-01 12:03:17.079862
 
 """
 
 # revision identifiers, used by Alembic.
 revision = "9c2a5681ddfd"
+<<<<<<< HEAD
 down_revision = "f3c2d8ec8595"
+=======
+down_revision = "7e67aecbf3f1"
+>>>>>>> f1fa1a733... chore(key-value): use json serialization for main resources (#23888)
 
 import io
 import json
@@ -45,10 +53,14 @@ RESOURCES_TO_MIGRATE = ("app", "dashboard_permalink", "explore_permalink")
 
 class RestrictedUnpickler(pickle.Unpickler):
     def find_class(self, module, name):
+<<<<<<< HEAD
         if not (module == "superset.utils.core" and name == "DatasourceType"):
             raise pickle.UnpicklingError(f"Unpickling of {module}.{name} is forbidden")
 
         return super().find_class(module, name)
+=======
+        raise pickle.UnpicklingError(f"Unpickling of {module}.{name} is forbidden")
+>>>>>>> f1fa1a733... chore(key-value): use json serialization for main resources (#23888)
 
 
 class KeyValueEntry(Base):
@@ -61,12 +73,16 @@ class KeyValueEntry(Base):
 def upgrade():
     bind = op.get_bind()
     session: Session = db.Session(bind=bind)
+<<<<<<< HEAD
     truncated_count = 0
+=======
+>>>>>>> f1fa1a733... chore(key-value): use json serialization for main resources (#23888)
     for entry in paginated_update(
         session.query(KeyValueEntry).filter(
             KeyValueEntry.resource.in_(RESOURCES_TO_MIGRATE)
         )
     ):
+<<<<<<< HEAD
         try:
             value = RestrictedUnpickler(io.BytesIO(entry.value)).load() or {}
         except pickle.UnpicklingError as ex:
@@ -83,6 +99,11 @@ def upgrade():
     if truncated_count:
         print(f"Replaced {truncated_count} corrupted values with an empty value")
 
+=======
+        value = RestrictedUnpickler(io.BytesIO(entry.value)).load() or {}
+        entry.value = bytes(json.dumps(value), encoding="utf-8")
+
+>>>>>>> f1fa1a733... chore(key-value): use json serialization for main resources (#23888)
 
 def downgrade():
     bind = op.get_bind()
diff --git a/tests/integration_tests/explore/permalink/api_tests.py b/tests/integration_tests/explore/permalink/api_tests.py
index 3a07bd977a..c7b631239e 100644
--- a/tests/integration_tests/explore/permalink/api_tests.py
+++ b/tests/integration_tests/explore/permalink/api_tests.py
@@ -24,7 +24,11 @@ from sqlalchemy.orm import Session
 from superset import db
 from superset.explore.permalink.schemas import ExplorePermalinkSchema
 from superset.key_value.models import KeyValueEntry
+<<<<<<< HEAD
 from superset.key_value.types import KeyValueResource, MarshmallowKeyValueCodec
+=======
+from superset.key_value.types import JsonKeyValueCodec, KeyValueResource
+>>>>>>> f1fa1a733... chore(key-value): use json serialization for main resources (#23888)
 from superset.key_value.utils import decode_permalink_id, encode_permalink_key
 from superset.models.slice import Slice
 from superset.utils.core import DatasourceType
@@ -95,7 +99,11 @@ def test_get_missing_chart(
     chart_id = 1234
     entry = KeyValueEntry(
         resource=KeyValueResource.EXPLORE_PERMALINK,
+<<<<<<< HEAD
         value=MarshmallowKeyValueCodec(ExplorePermalinkSchema()).encode(
+=======
+        value=JsonKeyValueCodec().encode(
+>>>>>>> f1fa1a733... chore(key-value): use json serialization for main resources (#23888)
             {
                 "chartId": chart_id,
                 "datasourceId": chart.datasource.id,