提交 a3836b23 编写于 作者: dengyihao's avatar dengyihao

fix invalid free

上级 743ed82d
...@@ -38,6 +38,8 @@ typedef struct STdbState { ...@@ -38,6 +38,8 @@ typedef struct STdbState {
rocksdb_comparator_t** pCompare; rocksdb_comparator_t** pCompare;
rocksdb_options_t* dbOpt; rocksdb_options_t* dbOpt;
struct SStreamTask* pOwner; struct SStreamTask* pOwner;
void* param;
void* env;
TDB* db; TDB* db;
TTB* pStateDb; TTB* pStateDb;
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "rocksdb/c.h"
#include "streamBackendRocksdb.h" #include "streamBackendRocksdb.h"
#include "tcommon.h" #include "tcommon.h"
#include "tlog.h" #include "tlog.h"
...@@ -280,6 +281,10 @@ int parKeyToString(void* k, char* buf) { ...@@ -280,6 +281,10 @@ int parKeyToString(void* k, char* buf) {
return n; return n;
} }
typedef struct {
void* tableOpt;
void* lru; // global or not
} rocksdbCfParam;
const char* cfName[] = {"default", "state", "fill", "sess", "func", "parname", "partag"}; const char* cfName[] = {"default", "state", "fill", "sess", "func", "parname", "partag"};
typedef int (*EncodeFunc)(void* key, char* buf); typedef int (*EncodeFunc)(void* key, char* buf);
...@@ -354,6 +359,7 @@ int streamInitBackend(SStreamState* pState, char* path) { ...@@ -354,6 +359,7 @@ int streamInitBackend(SStreamState* pState, char* path) {
char* err = NULL; char* err = NULL;
int cfLen = sizeof(ginitDict) / sizeof(ginitDict[0]); int cfLen = sizeof(ginitDict) / sizeof(ginitDict[0]);
rocksdbCfParam* param = taosMemoryCalloc(cfLen, sizeof(rocksdbCfParam));
const rocksdb_options_t** cfOpt = taosMemoryCalloc(cfLen, sizeof(rocksdb_options_t*)); const rocksdb_options_t** cfOpt = taosMemoryCalloc(cfLen, sizeof(rocksdb_options_t*));
for (int i = 0; i < cfLen; i++) { for (int i = 0; i < cfLen; i++) {
cfOpt[i] = rocksdb_options_create_copy(opts); cfOpt[i] = rocksdb_options_create_copy(opts);
...@@ -367,6 +373,8 @@ int streamInitBackend(SStreamState* pState, char* path) { ...@@ -367,6 +373,8 @@ int streamInitBackend(SStreamState* pState, char* path) {
rocksdb_options_set_block_based_table_factory((rocksdb_options_t*)cfOpt[i], tableOpt); rocksdb_options_set_block_based_table_factory((rocksdb_options_t*)cfOpt[i], tableOpt);
param[i].tableOpt = tableOpt;
param[i].lru = cache;
// rocksdb_slicetransform_t* trans = rocksdb_slicetransform_create_fixed_prefix(8); // rocksdb_slicetransform_t* trans = rocksdb_slicetransform_create_fixed_prefix(8);
// rocksdb_options_set_prefix_extractor((rocksdb_options_t*)cfOpt[i], trans); // rocksdb_options_set_prefix_extractor((rocksdb_options_t*)cfOpt[i], trans);
}; };
...@@ -391,6 +399,8 @@ int streamInitBackend(SStreamState* pState, char* path) { ...@@ -391,6 +399,8 @@ int streamInitBackend(SStreamState* pState, char* path) {
pState->pTdbState->cfOpts = (rocksdb_options_t**)cfOpt; pState->pTdbState->cfOpts = (rocksdb_options_t**)cfOpt;
pState->pTdbState->pCompare = pCompare; pState->pTdbState->pCompare = pCompare;
pState->pTdbState->dbOpt = opts; pState->pTdbState->dbOpt = opts;
pState->pTdbState->param = param;
pState->pTdbState->env = env;
return 0; return 0;
} }
void streamCleanBackend(SStreamState* pState) { void streamCleanBackend(SStreamState* pState) {
...@@ -398,12 +408,17 @@ void streamCleanBackend(SStreamState* pState) { ...@@ -398,12 +408,17 @@ void streamCleanBackend(SStreamState* pState) {
qInfo("rocksdb already free"); qInfo("rocksdb already free");
return; return;
} }
int cfLen = sizeof(ginitDict) / sizeof(ginitDict[0]); int cfLen = sizeof(ginitDict) / sizeof(ginitDict[0]);
rocksdbCfParam* param = pState->pTdbState->param;
for (int i = 0; i < cfLen; i++) { for (int i = 0; i < cfLen; i++) {
rocksdb_column_family_handle_destroy(pState->pTdbState->pHandle[i]); rocksdb_column_family_handle_destroy(pState->pTdbState->pHandle[i]);
rocksdb_options_destroy(pState->pTdbState->cfOpts[i]); rocksdb_options_destroy(pState->pTdbState->cfOpts[i]);
rocksdb_comparator_destroy(pState->pTdbState->pCompare[i]); rocksdb_comparator_destroy(pState->pTdbState->pCompare[i]);
rocksdb_cache_destroy(param[i].lru);
rocksdb_block_based_options_destroy(param[i].tableOpt);
} }
taosMemoryFree(pState->pTdbState->param);
rocksdb_options_destroy(pState->pTdbState->dbOpt); rocksdb_options_destroy(pState->pTdbState->dbOpt);
taosMemoryFreeClear(pState->pTdbState->pHandle); taosMemoryFreeClear(pState->pTdbState->pHandle);
...@@ -417,6 +432,7 @@ void streamCleanBackend(SStreamState* pState) { ...@@ -417,6 +432,7 @@ void streamCleanBackend(SStreamState* pState) {
pState->pTdbState->readOpts = NULL; pState->pTdbState->readOpts = NULL;
rocksdb_close(pState->pTdbState->rocksdb); rocksdb_close(pState->pTdbState->rocksdb);
rocksdb_env_destroy(pState->pTdbState->env);
pState->pTdbState->rocksdb = NULL; pState->pTdbState->rocksdb = NULL;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册