local function update_and_unlock (key, value, lock_id, lifetime_milliseconds, idle_timeout_milliseconds, new_additional_keys) if not (owns_lock(key, lock_id) and owns_locks(new_additional_keys, lock_id)) then return { "lock_not_owned" } end local existing_entry = get_existing_entry(key) if not existing_entry then return { "not_found" } end local existing_additional_keys = existing_entry.additional_lock_keys if not owns_locks(existing_additional_keys, lock_id) then return { "lock_not_owned" } end local combined_additional_keys = combine(existing_additional_keys, new_additional_keys) set_value(key, value, existing_entry.creation_time_milliseconds, lifetime_milliseconds, idle_timeout_milliseconds, combined_additional_keys) release_lock(key, lock_id) release_locks(combined_additional_keys, lock_id) return { "ok", value } end return scriptResult(update_and_unlock(KEYS[1], ARGV[3], ARGV[4], parseOptionalNumber(ARGV[5]), parseOptionalNumber(ARGV[6]), cjson.decode(ARGV[7])))