blob: 99dee1751e11d9d2e3fc3328659cc12ea9c084a4 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include <Interpreters/MergeTreeTransaction.h>
#include <Storages/MergeTree/SparkMergeTreeMeta.h>
#include <Storages/MergeTree/SparkStorageMergeTree.h>
#include <Poco/LRUCache.h>
#include <Common/GlutenConfig.h>
#include <Common/QueryContext.h>
namespace local_engine
{
using SparkStorageMergeTreePtr = std::shared_ptr<SparkStorageMergeTree>;
class DataPartStorageHolder
{
public:
DataPartStorageHolder(const DB::DataPartPtr& data_part, const SparkStorageMergeTreePtr& storage)
: storage_(storage),
data_part_(data_part)
{
}
[[nodiscard]] DB::DataPartPtr dataPart() const
{
return data_part_;
}
[[nodiscard]] SparkStorageMergeTreePtr storage() const
{
return storage_;
}
~DataPartStorageHolder()
{
storage_->removePartFromMemory(*data_part_);
}
private:
SparkStorageMergeTreePtr storage_;
DB::DataPartPtr data_part_;
};
using DataPartStorageHolderPtr = std::shared_ptr<DataPartStorageHolder>;
using storage_map_cache = Poco::LRUCache<std::string, std::pair<SparkStorageMergeTreePtr, MergeTreeTable>>;
using datapart_map_cache = Poco::LRUCache<std::string, std::shared_ptr<Poco::LRUCache<std::string, DataPartStorageHolderPtr>>>;
class StorageMergeTreeFactory
{
public:
static StorageMergeTreeFactory & instance();
static void freeStorage(const DB::StorageID & id, const String & snapshot_id = "");
static SparkStorageMergeTreePtr
getStorage(const DB::StorageID& id, const String & snapshot_id, const MergeTreeTable & merge_tree_table,
const std::function<SparkStorageMergeTreePtr()> & creator);
static DB::DataPartsVector getDataPartsByNames(const DB::StorageID & id, const String & snapshot_id, const std::unordered_set<String> & part_name);
static void init_cache_map()
{
auto config = MergeTreeConfig::loadFromContext(QueryContext::globalContext());
auto & storage_map_v = storage_map;
if (!storage_map_v)
{
storage_map_v = std::make_unique<storage_map_cache>(config.table_metadata_cache_max_count);
}
else
{
storage_map_v->clear();
}
auto & datapart_map_v = datapart_map;
if (!datapart_map_v)
{
datapart_map_v = std::make_unique<datapart_map_cache>(config.table_metadata_cache_max_count);
}
else
{
datapart_map_v->clear();
}
}
static void clear_cache_map()
{
if (storage_map) storage_map->clear();
if (datapart_map) datapart_map->clear();
}
static String getTableName(const DB::StorageID & id, const String & snapshot_id);
private:
static std::unique_ptr<storage_map_cache> storage_map;
static std::unique_ptr<datapart_map_cache> datapart_map;
static std::recursive_mutex storage_map_mutex;
static std::recursive_mutex datapart_mutex;
};
}