Skip to content

Make automated invalidation of caches on router on schema reload or ddl sharding keys update #212

Closed
@ligurio

Description

@ligurio

Imagine user have a cluster with running CRUD module. He wants to update a schema or update sharding keys in _ddl_sharding_key space. In such case we should update cache with sharding keys on router.
Now we have a mechanism to follow schema changes on storage (see option add_space_schema_hash in CRUD operations and function schema.get_space_schema_hash()).

Patch for this can look like this:

diff --git a/crud/borders.lua b/crud/borders.lua
index ac77cef..b702d09 100644
--- a/crud/borders.lua
+++ b/crud/borders.lua
@@ -108,9 +108,6 @@ local function call_get_border_on_router(border_name, space_name, index_name, op
         local storage_result = storage_result[1]
         if storage_result.err ~= nil then
             local need_reload = schema.result_needs_reload(space, storage_result)
-            if need_reload == true then
-                sharding.schema_reload_actions(space_name, storage_result.ddl_sharding_key)
-            end
             return nil, BorderError:new("Failed to get %s: %s", border_name, storage_result.err), need_reload
         end
 
diff --git a/crud/common/schema.lua b/crud/common/schema.lua
index 93afc01..bbfae66 100644
--- a/crud/common/schema.lua
+++ b/crud/common/schema.lua
@@ -214,7 +214,6 @@ function schema.wrap_func_result(space, func, args, opts)
     else
         result.res = filter_tuple_fields(func_res, opts.field_names)
     end
-    result.ddl_sharding_key = schema.fetch_ddl_sharding_key(box, space.name)
 
     return result
 end
diff --git a/crud/common/sharding.lua b/crud/common/sharding.lua
index 528b4fe..07d0275 100644
--- a/crud/common/sharding.lua
+++ b/crud/common/sharding.lua
@@ -109,14 +109,6 @@ function sharding.is_sharding_key_in_primary_index(space_name, primary_index, sh
     return sharding_key_in_primary_index_cache[space_name]
 end
 
-function sharding.schema_reload_actions(space_name, sharding_key)
-    dev_checks('string', 'table')
-
-    ddl_sharding_keys_cache[space_name] = sharding_key
-    sharding_key_in_primary_index_cache[space_name] = nil
-    sharding_key_fieldnos_cache[space_name] = nil
-end
-
 -- Build an array with sharding key values.
 local function build_sharding_key(key, index_parts, sharding_key_fieldno_map)
     dev_checks('table', 'table', 'table')
diff --git a/crud/insert.lua b/crud/insert.lua
index 3b9fe1f..9d4332c 100644
--- a/crud/insert.lua
+++ b/crud/insert.lua
@@ -84,9 +84,6 @@ local function call_insert_on_router(space_name, tuple, opts)
 
     if storage_result.err ~= nil then
         local need_reload = schema.result_needs_reload(space, storage_result)
-        if need_reload == true then
-            sharding.schema_reload_actions(space_name, storage_result.ddl_sharding_key)
-        end
         return nil, InsertError:new("Failed to insert: %s", storage_result.err), need_reload
     end
 
diff --git a/crud/replace.lua b/crud/replace.lua
index f52f331..26d5721 100644
--- a/crud/replace.lua
+++ b/crud/replace.lua
@@ -88,9 +88,6 @@ local function call_replace_on_router(space_name, tuple, opts)
 
     if storage_result.err ~= nil then
         local need_reload = schema.result_needs_reload(space, storage_result)
-        if need_reload == true then
-            sharding.schema_reload_actions(space_name, storage_result.ddl_sharding_key)
-        end
         return nil, ReplaceError:new("Failed to replace: %s", storage_result.err), need_reload
     end
 
diff --git a/crud/upsert.lua b/crud/upsert.lua
index 87f16c0..d91d8ba 100644
--- a/crud/upsert.lua
+++ b/crud/upsert.lua
@@ -90,9 +90,6 @@ local function call_upsert_on_router(space_name, tuple, user_operations, opts)
 
     if storage_result.err ~= nil then
         local need_reload = schema.result_needs_reload(space, storage_result)
-        if need_reload == true then
-            sharding.schema_reload_actions(space_name, storage_result.ddl_sharding_key)
-        end
         return nil, UpsertError:new("Failed to upsert: %s", storage_result.err), need_reload
     end

Things missed in a patch:

  • schema.get_space_schema_hash follows only changes in spaces with data and not _ddl_sharding_key and _ddl_sharding_func.
  • crud.insert() does not set opts.add_space_schema_hash = true (as opposite to crud.insert_object().
  • anything else?

Part of #166

Metadata

Metadata

Labels

bugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions