42
42
namespace modelbox {
43
43
44
44
constexpr const char *DEFAULT_LD_CACHE = " /etc/ld.so.cache" ;
45
+ constexpr const int DRIVER_SCAN_TIMEOUT = 60 * 3 ;
45
46
46
47
int SubProcessWaitAndLog (int fd) {
47
48
struct pollfd fdset;
48
49
std::string log;
49
50
char tmp[4096 ];
50
51
fdset.fd = fd;
51
52
fdset.events = POLLIN | POLLHUP;
53
+ time_t begin = 0 ;
54
+ time_t now;
52
55
if (fd <= 0 ) {
53
56
return 0 ;
54
57
}
@@ -61,8 +64,15 @@ int SubProcessWaitAndLog(int fd) {
61
64
62
65
fcntl (fd, F_SETFL, fcntl (fd, F_GETFL) | O_NONBLOCK);
63
66
67
+ time (&begin);
64
68
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
+
66
76
if (count < 0 ) {
67
77
if (errno == EINTR) {
68
78
continue ;
@@ -112,16 +122,21 @@ Status SubProcessRun(func &&fun, ts &&...params) {
112
122
signal (SIGABRT, SIG_DFL);
113
123
close (fd[0 ]);
114
124
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
+
115
131
// output log to console
116
- auto loglevel = klogger.GetLogger ()->GetLogLevel ();
117
132
klogger.SetLogger (nullptr );
118
- klogger.GetLogger ()->SetLogLevel (loglevel);
119
-
133
+ klogger.GetLogger ()->SetLogLevel (oldlogger_keeper->GetLogLevel ());
120
134
Status ret = fun (params...);
121
- if (! ret) {
135
+ if (ret == STATUS_OK ) {
122
136
_exit (0 );
123
137
}
124
138
139
+ MBLOG_WARN << " run function failed, errmsg: " << ret.WrapErrormsgs ();
125
140
_exit (1 );
126
141
}
127
142
@@ -152,16 +167,19 @@ Status SubProcessRun(func &&fun, ts &&...params) {
152
167
return {STATUS_FAULT, err_msg};
153
168
}
154
169
155
- if (WIFEXITED (status) != 0 ) {
156
- return {STATUS_NORESPONSE, " process exit abnormal." };
157
- }
158
-
159
170
if (WIFSIGNALED (status)) {
160
171
const auto *err_msg = " killed by signal" ;
161
172
MBLOG_ERROR << err_msg;
162
173
return {STATUS_NORESPONSE, err_msg};
163
174
}
164
175
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
+
165
183
if (status != 0 ) {
166
184
const auto *err_msg = " scan process exit result is fail." ;
167
185
MBLOG_ERROR << err_msg;
@@ -517,7 +535,7 @@ Status Drivers::Scan(const std::string &path, const std::string &filter) {
517
535
struct stat s;
518
536
auto ret = lstat (path.c_str (), &s);
519
537
if (ret) {
520
- auto err_msg = " lstat " + path + " failed, errno: " + StrError (errno);
538
+ auto err_msg = " lstat " + path + " failed, " + StrError (errno);
521
539
return {STATUS_FAULT, err_msg};
522
540
}
523
541
@@ -819,9 +837,10 @@ bool Drivers::CheckPathAndMagicCode() {
819
837
Status Drivers::InnerScan () {
820
838
Status ret = STATUS_NOTFOUND;
821
839
for (const auto &dir : driver_dirs_) {
840
+ MBLOG_INFO << " Scan dir: " << dir;
822
841
ret = Scan (dir, " libmodelbox-*.so*" );
823
842
if (!ret && ret != STATUS_NOTFOUND) {
824
- MBLOG_WARN << " scan " << dir << " failed" ;
843
+ MBLOG_WARN << " scan " << dir << " failed, " << ret. WrapErrormsgs () ;
825
844
}
826
845
ret = STATUS_OK;
827
846
}
@@ -830,9 +849,9 @@ Status Drivers::InnerScan() {
830
849
831
850
ret = WriteScanInfo (default_driver_info_path_, check_code);
832
851
if (ret != STATUS_OK) {
833
- const auto * err_msg = " write scan info failed" ;
852
+ std::string err_msg = " write scan info failed, " + ret. WrapErrormsgs () ;
834
853
MBLOG_ERROR << err_msg;
835
- return {STATUS_FAULT , err_msg};
854
+ return {ret , err_msg};
836
855
}
837
856
838
857
return ret;
0 commit comments