Fix controller locking up if MstLog pipe was already blocked during start, fixed several shared memory pages not being correctly re-created on crash recovery
This commit is contained in:
		
							parent
							
								
									de0423a9da
								
							
						
					
					
						commit
						36501a618e
					
				
					 2 changed files with 49 additions and 15 deletions
				
			
		|  | @ -501,7 +501,6 @@ int main_loop(int argc, char **argv){ | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   Controller::Log("CONF", "Controller started"); |  | ||||||
|   // Generate instanceId once per boot.
 |   // Generate instanceId once per boot.
 | ||||||
|   if (Controller::instanceId == ""){ |   if (Controller::instanceId == ""){ | ||||||
|     srand(mix(clock(), time(0), getpid())); |     srand(mix(clock(), time(0), getpid())); | ||||||
|  | @ -510,17 +509,6 @@ int main_loop(int argc, char **argv){ | ||||||
|     }while (Controller::instanceId.size() < 16); |     }while (Controller::instanceId.size() < 16); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
| /*LTS-START*/ |  | ||||||
| #ifdef UPDATER |  | ||||||
|   if (Controller::conf.getBool("update")){Controller::checkUpdates();} |  | ||||||
| #endif |  | ||||||
| #ifdef LICENSING |  | ||||||
|   Controller::initLicense(); |  | ||||||
|   // start license checking thread
 |  | ||||||
|   tthread::thread licenseThread(Controller::licenseLoop, 0); |  | ||||||
| #endif |  | ||||||
|   /*LTS-END*/ |  | ||||||
| 
 |  | ||||||
|   // start stats thread
 |   // start stats thread
 | ||||||
|   tthread::thread statsThread(Controller::SharedMemStats, &Controller::conf); |   tthread::thread statsThread(Controller::SharedMemStats, &Controller::conf); | ||||||
|   // start monitoring thread
 |   // start monitoring thread
 | ||||||
|  | @ -536,6 +524,18 @@ int main_loop(int argc, char **argv){ | ||||||
|   tthread::thread updaterThread(Controller::updateThread, 0); |   tthread::thread updaterThread(Controller::updateThread, 0); | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  |   Controller::Log("CONF", "Controller started"); | ||||||
|  |   /*LTS-START*/ | ||||||
|  | #ifdef UPDATER | ||||||
|  |   if (Controller::conf.getBool("update")){Controller::checkUpdates();} | ||||||
|  | #endif | ||||||
|  | #ifdef LICENSING | ||||||
|  |   Controller::initLicense(); | ||||||
|  |   // start license checking thread
 | ||||||
|  |   tthread::thread licenseThread(Controller::licenseLoop, 0); | ||||||
|  | #endif | ||||||
|  |   /*LTS-END*/ | ||||||
|  | 
 | ||||||
|   // start main loop
 |   // start main loop
 | ||||||
|   while (Controller::conf.is_active){ |   while (Controller::conf.is_active){ | ||||||
|     Controller::conf.serveThreadedSocket(Controller::handleAPIConnection); |     Controller::conf.serveThreadedSocket(Controller::handleAPIConnection); | ||||||
|  |  | ||||||
|  | @ -1,6 +1,7 @@ | ||||||
| #include "controller_capabilities.h" | #include "controller_capabilities.h" | ||||||
| #include "controller_storage.h" | #include "controller_storage.h" | ||||||
| #include "controller_push.h" //LTS
 | #include "controller_push.h" //LTS
 | ||||||
|  | #include "controller_streams.h" //LTS
 | ||||||
| #include <algorithm> | #include <algorithm> | ||||||
| #include <fstream> | #include <fstream> | ||||||
| #include <iostream> | #include <iostream> | ||||||
|  | @ -261,7 +262,14 @@ namespace Controller{ | ||||||
| 
 | 
 | ||||||
|   void writeCapabilities(){ |   void writeCapabilities(){ | ||||||
|     std::string temp = capabilities.toPacked(); |     std::string temp = capabilities.toPacked(); | ||||||
|     static IPC::sharedPage mistCapaOut(SHM_CAPA, temp.size() + 100, true, false); |     static IPC::sharedPage mistCapaOut(SHM_CAPA, temp.size() + 100, false, false); | ||||||
|  |     if (mistCapaOut){ | ||||||
|  |       Util::RelAccX tmpA(mistCapaOut.mapped, false); | ||||||
|  |       if (tmpA.isReady()){tmpA.setReload();} | ||||||
|  |       mistCapaOut.master = true; | ||||||
|  |       mistCapaOut.close(); | ||||||
|  |     } | ||||||
|  |     mistCapaOut.init(SHM_CAPA, temp.size() + 100, true, false); | ||||||
|     if (!mistCapaOut.mapped){ |     if (!mistCapaOut.mapped){ | ||||||
|       FAIL_MSG("Could not open capabilities config for writing! Is shared memory enabled on your " |       FAIL_MSG("Could not open capabilities config for writing! Is shared memory enabled on your " | ||||||
|                "system?"); |                "system?"); | ||||||
|  | @ -294,6 +302,13 @@ namespace Controller{ | ||||||
|       proxy_written = tmpProxy; |       proxy_written = tmpProxy; | ||||||
|       static IPC::sharedPage mistProxOut(SHM_PROXY, proxy_written.size() + 100, true, false); |       static IPC::sharedPage mistProxOut(SHM_PROXY, proxy_written.size() + 100, true, false); | ||||||
|       mistProxOut.close(); |       mistProxOut.close(); | ||||||
|  |       mistProxOut.init(SHM_PROXY, proxy_written.size() + 100, false, false); | ||||||
|  |       if (mistProxOut){ | ||||||
|  |         Util::RelAccX tmpA(mistProxOut.mapped, false); | ||||||
|  |         if (tmpA.isReady()){tmpA.setReload();} | ||||||
|  |         mistProxOut.master = true; | ||||||
|  |         mistProxOut.close(); | ||||||
|  |       } | ||||||
|       mistProxOut.init(SHM_PROXY, proxy_written.size() + 100, true, false); |       mistProxOut.init(SHM_PROXY, proxy_written.size() + 100, true, false); | ||||||
|       if (!mistProxOut.mapped){ |       if (!mistProxOut.mapped){ | ||||||
|         FAIL_MSG("Could not open trusted proxy config for writing! Is shared memory enabled on " |         FAIL_MSG("Could not open trusted proxy config for writing! Is shared memory enabled on " | ||||||
|  | @ -316,8 +331,13 @@ namespace Controller{ | ||||||
|     if (Storage["config"]["protocols"].compareExcept(proto_written, skip)){return;} |     if (Storage["config"]["protocols"].compareExcept(proto_written, skip)){return;} | ||||||
|     proto_written.assignFrom(Storage["config"]["protocols"], skip); |     proto_written.assignFrom(Storage["config"]["protocols"], skip); | ||||||
|     std::string temp = proto_written.toPacked(); |     std::string temp = proto_written.toPacked(); | ||||||
|     static IPC::sharedPage mistProtoOut(SHM_PROTO, temp.size() + 100, true, false); |     static IPC::sharedPage mistProtoOut(SHM_PROTO, temp.size() + 100, false, false); | ||||||
|  |     if (mistProtoOut){ | ||||||
|  |       Util::RelAccX tmpA(mistProtoOut.mapped, false); | ||||||
|  |       if (tmpA.isReady()){tmpA.setReload();} | ||||||
|  |       mistProtoOut.master = true; | ||||||
|       mistProtoOut.close(); |       mistProtoOut.close(); | ||||||
|  |     } | ||||||
|     mistProtoOut.init(SHM_PROTO, temp.size() + 100, true, false); |     mistProtoOut.init(SHM_PROTO, temp.size() + 100, true, false); | ||||||
|     if (!mistProtoOut.mapped){ |     if (!mistProtoOut.mapped){ | ||||||
|       FAIL_MSG( |       FAIL_MSG( | ||||||
|  | @ -357,6 +377,13 @@ namespace Controller{ | ||||||
|       P.close(); |       P.close(); | ||||||
|       char tmpBuf[NAME_BUFFER_SIZE]; |       char tmpBuf[NAME_BUFFER_SIZE]; | ||||||
|       snprintf(tmpBuf, NAME_BUFFER_SIZE, SHM_STREAM_CONF, sName.c_str()); |       snprintf(tmpBuf, NAME_BUFFER_SIZE, SHM_STREAM_CONF, sName.c_str()); | ||||||
|  |       P.init(tmpBuf, temp.size() + 100, false, false); | ||||||
|  |       if (P){ | ||||||
|  |         Util::RelAccX tmpA(P.mapped, false); | ||||||
|  |         if (tmpA.isReady()){tmpA.setReload();} | ||||||
|  |         P.master = true; | ||||||
|  |         P.close(); | ||||||
|  |       } | ||||||
|       P.init(tmpBuf, temp.size() + 100, true, false); |       P.init(tmpBuf, temp.size() + 100, true, false); | ||||||
|       if (!P){ |       if (!P){ | ||||||
|         writtenStrms.erase(sName); |         writtenStrms.erase(sName); | ||||||
|  | @ -418,6 +445,13 @@ namespace Controller{ | ||||||
|       if (Storage["config"]["triggers"].size()){ |       if (Storage["config"]["triggers"].size()){ | ||||||
|         jsonForEach(Storage["config"]["triggers"], it){ |         jsonForEach(Storage["config"]["triggers"], it){ | ||||||
|           snprintf(tmpBuf, NAME_BUFFER_SIZE, SHM_TRIGGER, (it.key()).c_str()); |           snprintf(tmpBuf, NAME_BUFFER_SIZE, SHM_TRIGGER, (it.key()).c_str()); | ||||||
|  |           pageForType[it.key()].init(tmpBuf, 32 * 1024, false, false); | ||||||
|  |           if (pageForType[it.key()]){ | ||||||
|  |             Util::RelAccX tmpA(pageForType[it.key()].mapped, false); | ||||||
|  |             if (tmpA.isReady()){tmpA.setReload();} | ||||||
|  |             pageForType[it.key()].master = true; | ||||||
|  |             pageForType[it.key()].close(); | ||||||
|  |           } | ||||||
|           pageForType[it.key()].init(tmpBuf, 32 * 1024, true, false); |           pageForType[it.key()].init(tmpBuf, 32 * 1024, true, false); | ||||||
|           Util::RelAccX tPage(pageForType[it.key()].mapped, false); |           Util::RelAccX tPage(pageForType[it.key()].mapped, false); | ||||||
|           tPage.addField("url", RAX_128STRING); |           tPage.addField("url", RAX_128STRING); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Thulinma
						Thulinma