Skip to content

Commit 919e62c

Browse files
committed
driver: fix driver scan timeout issue
1 parent 6361ee7 commit 919e62c

File tree

1 file changed

+32
-13
lines changed

1 file changed

+32
-13
lines changed

src/libmodelbox/base/drivers/driver.cc

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,16 @@
4242
namespace modelbox {
4343

4444
constexpr const char *DEFAULT_LD_CACHE = "/etc/ld.so.cache";
45+
constexpr const int DRIVER_SCAN_TIMEOUT = 60 * 3;
4546

4647
int SubProcessWaitAndLog(int fd) {
4748
struct pollfd fdset;
4849
std::string log;
4950
char tmp[4096];
5051
fdset.fd = fd;
5152
fdset.events = POLLIN | POLLHUP;
53+
time_t begin = 0;
54+
time_t now;
5255
if (fd <= 0) {
5356
return 0;
5457
}
@@ -61,8 +64,15 @@ int SubProcessWaitAndLog(int fd) {
6164

6265
fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK);
6366

67+
time(&begin);
6468
while (true) {
65-
int count = poll(&fdset, 1, 60000);
69+
int count = poll(&fdset, 1, 10000);
70+
time(&now);
71+
72+
if (now - begin >= DRIVER_SCAN_TIMEOUT) {
73+
return -1;
74+
}
75+
6676
if (count < 0) {
6777
if (errno == EINTR) {
6878
continue;
@@ -112,16 +122,21 @@ Status SubProcessRun(func &&fun, ts &&...params) {
112122
signal(SIGABRT, SIG_DFL);
113123
close(fd[0]);
114124
dup2(fd[1], 1);
125+
close(fd[1]);
126+
setbuf(stdout, NULL);
127+
128+
// Keep old log avoid deadlock
129+
auto oldlogger_keeper = klogger.GetLogger();
130+
115131
// output log to console
116-
auto loglevel = klogger.GetLogger()->GetLogLevel();
117132
klogger.SetLogger(nullptr);
118-
klogger.GetLogger()->SetLogLevel(loglevel);
119-
133+
klogger.GetLogger()->SetLogLevel(oldlogger_keeper->GetLogLevel());
120134
Status ret = fun(params...);
121-
if (!ret) {
135+
if (ret == STATUS_OK) {
122136
_exit(0);
123137
}
124138

139+
MBLOG_WARN << "run function failed, errmsg: " << ret.WrapErrormsgs();
125140
_exit(1);
126141
}
127142

@@ -152,16 +167,19 @@ Status SubProcessRun(func &&fun, ts &&...params) {
152167
return {STATUS_FAULT, err_msg};
153168
}
154169

155-
if (WIFEXITED(status) != 0) {
156-
return {STATUS_NORESPONSE, "process exit abnormal."};
157-
}
158-
159170
if (WIFSIGNALED(status)) {
160171
const auto *err_msg = "killed by signal";
161172
MBLOG_ERROR << err_msg;
162173
return {STATUS_NORESPONSE, err_msg};
163174
}
164175

176+
if (!WIFEXITED(status)) {
177+
std::string err_msg =
178+
"process exit abnormal, ret = " + std::to_string(status);
179+
MBLOG_ERROR << err_msg;
180+
return {STATUS_NORESPONSE, err_msg};
181+
}
182+
165183
if (status != 0) {
166184
const auto *err_msg = "scan process exit result is fail.";
167185
MBLOG_ERROR << err_msg;
@@ -517,7 +535,7 @@ Status Drivers::Scan(const std::string &path, const std::string &filter) {
517535
struct stat s;
518536
auto ret = lstat(path.c_str(), &s);
519537
if (ret) {
520-
auto err_msg = "lstat " + path + " failed, errno:" + StrError(errno);
538+
auto err_msg = "lstat " + path + " failed, " + StrError(errno);
521539
return {STATUS_FAULT, err_msg};
522540
}
523541

@@ -819,9 +837,10 @@ bool Drivers::CheckPathAndMagicCode() {
819837
Status Drivers::InnerScan() {
820838
Status ret = STATUS_NOTFOUND;
821839
for (const auto &dir : driver_dirs_) {
840+
MBLOG_INFO << "Scan dir: " << dir;
822841
ret = Scan(dir, "libmodelbox-*.so*");
823842
if (!ret && ret != STATUS_NOTFOUND) {
824-
MBLOG_WARN << "scan " << dir << " failed";
843+
MBLOG_WARN << "scan " << dir << " failed, " << ret.WrapErrormsgs();
825844
}
826845
ret = STATUS_OK;
827846
}
@@ -830,9 +849,9 @@ Status Drivers::InnerScan() {
830849

831850
ret = WriteScanInfo(default_driver_info_path_, check_code);
832851
if (ret != STATUS_OK) {
833-
const auto *err_msg = "write scan info failed";
852+
std::string err_msg = "write scan info failed, " + ret.WrapErrormsgs();
834853
MBLOG_ERROR << err_msg;
835-
return {STATUS_FAULT, err_msg};
854+
return {ret, err_msg};
836855
}
837856

838857
return ret;

0 commit comments

Comments
 (0)