Skip to content

Commit 696fa44

Browse files
committed
如果createBaseFromDBID类接口返回实体已经检出且在当前进程上,但是当前进程上无法找到实体时应该给出错误
这种情况通常是异步的环境中从db查询到已经检出,但等回调时可能实体已经销毁了而造成的
1 parent 9f0e27f commit 696fa44

File tree

1 file changed

+31
-3
lines changed

1 file changed

+31
-3
lines changed

kbe/src/server/baseapp/baseapp.cpp

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1029,7 +1029,21 @@ void Baseapp::onCreateBaseFromDBIDCallback(Network::Channel* pChannel, KBEngine:
10291029
}
10301030
else
10311031
{
1032-
baseRef = static_cast<PyObject*>(new EntityMailbox(EntityDef::findScriptModule(entityType.c_str()), NULL, wasActiveCID, wasActiveEntityID, MAILBOX_TYPE_BASE));
1032+
// 如果createBaseFromDBID类接口返回实体已经检出且在当前进程上,但是当前进程上无法找到实体时应该给出错误
1033+
// 这种情况通常是异步的环境中从db查询到已经检出,但等回调时可能实体已经销毁了而造成的
1034+
if(wasActiveCID != g_componentID)
1035+
{
1036+
baseRef = static_cast<PyObject*>(new EntityMailbox(EntityDef::findScriptModule(entityType.c_str()), NULL, wasActiveCID, wasActiveEntityID, MAILBOX_TYPE_BASE));
1037+
}
1038+
else
1039+
{
1040+
ERROR_MSG(fmt::format("Baseapp::onCreateBaseFromDBID: create {}({}) is failed! A local reference, But it has been destroyed!\n",
1041+
entityType.c_str(), dbid));
1042+
1043+
baseRef = Py_None;
1044+
Py_INCREF(baseRef);
1045+
wasActive = false;
1046+
}
10331047
}
10341048
}
10351049
else
@@ -1038,7 +1052,7 @@ void Baseapp::onCreateBaseFromDBIDCallback(Network::Channel* pChannel, KBEngine:
10381052
Py_INCREF(baseRef);
10391053
wasActive = false;
10401054

1041-
ERROR_MSG(fmt::format("Baseapp::onCreateBaseFromDBID: create {}({}) is failed.\n",
1055+
ERROR_MSG(fmt::format("Baseapp::onCreateBaseFromDBID: create {}({}) is failed!\n",
10421056
entityType.c_str(), dbid));
10431057
}
10441058

@@ -1272,7 +1286,21 @@ void Baseapp::onCreateBaseAnywhereFromDBIDCallback(Network::Channel* pChannel, K
12721286
}
12731287
else
12741288
{
1275-
baseRef = static_cast<PyObject*>(new EntityMailbox(EntityDef::findScriptModule(entityType.c_str()), NULL, wasActiveCID, wasActiveEntityID, MAILBOX_TYPE_BASE));
1289+
// 如果createBaseFromDBID类接口返回实体已经检出且在当前进程上,但是当前进程上无法找到实体时应该给出错误
1290+
// 这种情况通常是异步的环境中从db查询到已经检出,但等回调时可能实体已经销毁了而造成的
1291+
if(wasActiveCID != g_componentID)
1292+
{
1293+
baseRef = static_cast<PyObject*>(new EntityMailbox(EntityDef::findScriptModule(entityType.c_str()), NULL, wasActiveCID, wasActiveEntityID, MAILBOX_TYPE_BASE));
1294+
}
1295+
else
1296+
{
1297+
ERROR_MSG(fmt::format("Baseapp::onCreateBaseFromDBID: create {}({}) is failed! A local reference, But it has been destroyed!\n",
1298+
entityType.c_str(), dbid));
1299+
1300+
baseRef = Py_None;
1301+
Py_INCREF(baseRef);
1302+
wasActive = false;
1303+
}
12761304
}
12771305
}
12781306
else

0 commit comments

Comments
 (0)