Fix multiple instances hang issue

This commit is contained in:
2022-11-20 13:41:56 +08:00
parent a51a8c4c22
commit b0931dddb3
5 changed files with 72 additions and 36 deletions
+4 -1
View File
@@ -14,7 +14,7 @@ RUN apt -y install rapidjson-dev libboost-all-dev
# libpcrecpp0v5 unixodbc-dev postgresql-server-dev-12 libgsoap-dev libgsoap-2.8.91
# DEBUG
RUN apt -y install gdb strace vim
RUN apt -y install gdb strace vim postgresql-client-11
ADD scripts/* /usr/local/bin/
ADD configs/* /cfgs/
@@ -32,4 +32,7 @@ RUN cd /opt/mainsite/wrenchboard/src && make
RUN ln -s /opt/mainsite/wrenchboard/src/modules/wrenchboard_api_root.so /usr/local/lib/php/extensions/no-debug-non-zts-20170718/wrenchboard_api_root.so
RUN touch /opt/mainsite/wrenchboard/logs/wrenchboard_api_root.log
RUN chmod a+w /opt/mainsite/wrenchboard/logs/wrenchboard_api_root.log
RUN echo "extension=wrenchboard_api_root.so" > /usr/local/etc/php/conf.d/docker-php-ext-wrenchboard.ini
+18 -10
View File
@@ -116,20 +116,28 @@ PHP_METHOD(WrenchBoard, wrenchboard_api)
// Convert output
convert_to_array_ex( param_out );
CVars::iterator i;
int j = 0;
const int out_size = output.size(); // 200
const int out_value_size = 200;
char out_key[out_value_size], out_value[out_value_size];
for ( i=output.begin(); i != output.end() && j<out_size ; i++ ) {
bzero(out_key, out_value_size);
bzero(out_value, out_value_size);
j++;
logfmt( logINFO, "RET: %s=%s", i->first.c_str(), i->second.c_str() );
strsafecpy( out_key, i->first.c_str(), out_value_size );
strsafecpy( out_value, i->second.c_str(), out_value_size );
add_assoc_string( param_out, out_key, out_value);
}
if (!output.empty()) {
array_init(param_out);
// for ( i=output.begin(); i != output.end() && j<out_size ; i++ ) {
while (!output.empty()) {
bzero(out_key, out_value_size);
bzero(out_value, out_value_size);
i = output.begin();
logfmt( logINFO, "RET: %s=%s", i->first.c_str(), i->second.c_str() );
strsafecpy( out_key, i->first.c_str(), out_value_size );
strsafecpy( out_value, i->second.c_str(), out_value_size );
//add_assoc_string( param_out, out_key, out_value);
add_assoc_string_ex( param_out, out_key, strlen(out_key), out_value);
//SAFE_STRING
//efree(out_value);
output.erase(output.begin());
}
}
logfmt( logDEBUG, "About to return %ld", retval );
RETURN_LONG(retval);
}
+8
View File
@@ -32,10 +32,14 @@ int pgsql_db_connect(const char*host,const char*name,const char*user,const char*
connection_str+=pgsql_uitoa(port,pdb_port,10);
}
//FILE_LOG(logSQL) << "PQconnectdb()";
conn = PQconnectdb(connection_str.c_str());
//FILE_LOG(logSQL) << "PQstatus()";
if (PQstatus(conn) != CONNECTION_OK) {
//FILE_LOG(logSQL) << "ERROR";
return 0;
}
//FILE_LOG(logSQL) << "CONNECTION_OK";
return 1;
}
@@ -43,7 +47,11 @@ void pgsql_close()
{
FILE_LOG(logSQL) << "pgsql_close()";
if (PQstatus(conn)==CONNECTION_OK) {
//FILE_LOG(logSQL) << "PQstatus(conn) == CONNECTION_OK";
PQfinish(conn);
//FILE_LOG(logSQL) << "PQfinish() done!";
} else {
//FILE_LOG(logSQL) << "PQstatus(conn) != CONNECTION_OK";
}
}
+13 -4
View File
@@ -8,15 +8,17 @@
#include "wrenchboard_api_main.h"
#include <exception>
#include <iostream>
#include <libpq-fe.h>
WrenchBoard::WrenchBoard() {
// Open config
// Open log
this->pFile = fopen(WRENCHBOARD_LOG, "a");
Output2FILE::Stream() = pFile;
FILE_LOG(logINFO) << "WRENCHBOARD is starting...";
// Read config
CfgReadConfig();
logfmt(logINFO, "Version from config: %s", CfgReadChar("version"));
@@ -31,10 +33,17 @@ WrenchBoard::WrenchBoard() {
CfgReadChar("database.user"),
CfgReadChar("database.pass"),
CfgReadLong("database.port") );
FILE_LOG(logDEBUG) << "pgsql_db_connect() done!";
} catch (const std::exception &e) {
FILE_LOG(logDEBUG) << "Exception: " << e.what();
} catch (const std::string &e) {
FILE_LOG(logDEBUG) << "Exception: " << e;
} catch (const char *e) {
FILE_LOG(logDEBUG) << "Exception: " << e;
} catch (...) {
logfmt(logDEBUG, "Exception!");
FILE_LOG(logDEBUG) << "Unknown Exception!";
}
logfmt(logDEBUG, "Database connection %s", this->db>0?"successful":"failed");
FILE_LOG(logDEBUG) << "Database connection " << (this->db>0?"successful":"failed");
}
long WrenchBoard::wrenchboard_api(CVars in, CVars &out) {
@@ -70,6 +79,6 @@ WrenchBoard::~WrenchBoard() {
// Do we need it?
if (this->pFile) {
fclose(this->pFile);
}
} // */
}
+29 -21
View File
@@ -116,19 +116,27 @@ PHP_METHOD(WrenchBoard, wrenchboard_api)
// Convert output
convert_to_array_ex( param_out );
CVars::iterator i;
int j = 0;
const int out_size = output.size(); // 200
const int out_value_size = 200;
char out_key[out_value_size], out_value[out_value_size];
for ( i=output.begin(); i != output.end() && j<out_size ; i++ ) {
bzero(out_key, out_value_size);
bzero(out_value, out_value_size);
j++;
logfmt( logINFO, "RET: %s=%s", i->first.c_str(), i->second.c_str() );
strsafecpy( out_key, i->first.c_str(), out_value_size );
strsafecpy( out_value, i->second.c_str(), out_value_size );
add_assoc_string( param_out, out_key, out_value);
if (!output.empty()) {
array_init(param_out);
// for ( i=output.begin(); i != output.end() && j<out_size ; i++ ) {
while (!output.empty()) {
bzero(out_key, out_value_size);
bzero(out_value, out_value_size);
i = output.begin();
logfmt( logINFO, "RET: %s=%s", i->first.c_str(), i->second.c_str() );
strsafecpy( out_key, i->first.c_str(), out_value_size );
strsafecpy( out_value, i->second.c_str(), out_value_size );
//add_assoc_string( param_out, out_key, out_value);
add_assoc_string_ex( param_out, out_key, strlen(out_key), out_value);
//SAFE_STRING
//efree(out_value);
output.erase(output.begin());
}
}
logfmt( logDEBUG, "About to return %ld", retval );
RETURN_LONG(retval);
}
@@ -253,10 +261,10 @@ static void wrenchboard_object_free(zend_object *object)
}
// ------------------------------------------------------------------ // ------------------------------------------------------------------
PHP_MINIT_FUNCTION(wrenchboard_api_oameye)
PHP_MINIT_FUNCTION(wrenchboard_api_root)
{
zend_class_entry ce;
INIT_NS_CLASS_ENTRY(ce, WRENCHBOARD_API_OAMEYE_NS, "WrenchBoard", wrenchboard_methods);
INIT_NS_CLASS_ENTRY(ce, WRENCHBOARD_API_ROOT_NS, "WrenchBoard", wrenchboard_methods);
wrenchboard_ce = zend_register_internal_class(&ce TSRMLS_CC);
wrenchboard_ce->create_object = wrenchboard_object_new;
@@ -277,7 +285,7 @@ PHP_MINIT_FUNCTION(wrenchboard_api_oameye)
}
// ------------------------------------------------------------------ // ------------------------------------------------------------------
PHP_MINFO_FUNCTION(wrenchboard_api_oameye)
PHP_MINFO_FUNCTION(wrenchboard_api_root)
{
php_info_print_table_start();
php_info_print_table_row(2, "WRENCHBOARD API support", "enabled");
@@ -285,31 +293,31 @@ PHP_MINFO_FUNCTION(wrenchboard_api_oameye)
php_info_print_table_row(2, "Config File", WRENCHBOARD_CONFIG"wrenchboard_api.conf");
php_info_print_table_row(2, "Build Date", __DATE__);
php_info_print_table_row(2, "Build Time", __TIME__);
php_info_print_table_row(2, "Namespace", WRENCHBOARD_API_OAMEYE_NS);
php_info_print_table_row(2, "Version", PHP_WRENCHBOARD_API_OAMEYE_EXTVER);
php_info_print_table_row(2, "Namespace", WRENCHBOARD_API_ROOT_NS);
php_info_print_table_row(2, "Version", PHP_WRENCHBOARD_API_ROOT_EXTVER);
php_info_print_table_end();
}
// ------------------------------------------------------------------ // ------------------------------------------------------------------
zend_module_entry wrenchboard_api_oameye_module_entry = {
zend_module_entry wrenchboard_api_root_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
STANDARD_MODULE_HEADER,
#endif
PHP_WRENCHBOARD_API_OAMEYE_EXTNAME,
PHP_WRENCHBOARD_API_ROOT_EXTNAME,
NULL, /* Functions */
PHP_MINIT(wrenchboard_api_oameye),
PHP_MINIT(wrenchboard_api_root),
NULL, /* MSHUTDOWN */
NULL, /* RINIT */
NULL, /* RSHUTDOWN */
PHP_MINFO(wrenchboard_api_oameye), /* MINFO */
PHP_MINFO(wrenchboard_api_root), /* MINFO */
#if ZEND_MODULE_API_NO >= 20010901
PHP_WRENCHBOARD_API_OAMEYE_EXTVER,
PHP_WRENCHBOARD_API_ROOT_EXTVER,
#endif
STANDARD_MODULE_PROPERTIES
};
//#ifdef COMPILE_DL_WRENCHBOARD_API_OAMEYE
//#ifdef COMPILE_DL_WRENCHBOARD_API_ROOT
extern "C" {
ZEND_GET_MODULE(wrenchboard_api_oameye)
ZEND_GET_MODULE(wrenchboard_api_root)
}
//#endif