tsan fixes on ubuntu xenial (what travis run)
This commit is contained in:
		
							
								
								
									
										42
									
								
								Dockerfile
									
									
									
									
									
								
							
							
						
						
									
										42
									
								
								Dockerfile
									
									
									
									
									
								
							| @@ -1,42 +0,0 @@ | |||||||
| FROM fedora:30 as build |  | ||||||
|  |  | ||||||
| RUN yum install -y gcc-g++ |  | ||||||
| RUN yum install -y cmake |  | ||||||
| RUN yum install -y make |  | ||||||
| RUN yum install -y openssl-devel |  | ||||||
|  |  | ||||||
| RUN yum install -y wget |  | ||||||
| RUN mkdir -p /tmp/cmake |  | ||||||
| WORKDIR /tmp/cmake |  | ||||||
| RUN wget https://github.com/Kitware/CMake/releases/download/v3.14.0/cmake-3.14.0-Linux-x86_64.tar.gz  |  | ||||||
| RUN tar zxf cmake-3.14.0-Linux-x86_64.tar.gz |  | ||||||
|  |  | ||||||
| ARG CMAKE_BIN_PATH=/tmp/cmake/cmake-3.14.0-Linux-x86_64/bin |  | ||||||
| ENV PATH="${CMAKE_BIN_PATH}:${PATH}" |  | ||||||
|  |  | ||||||
| RUN yum install -y python |  | ||||||
| RUN yum install -y libtsan |  | ||||||
|  |  | ||||||
| COPY . . |  | ||||||
| # RUN ["make", "test"] |  | ||||||
| RUN ["make"] |  | ||||||
|  |  | ||||||
| # Runtime |  | ||||||
| FROM fedora:30 as runtime |  | ||||||
|  |  | ||||||
| RUN yum install -y libtsan |  | ||||||
|  |  | ||||||
| RUN groupadd app && useradd -g app app  |  | ||||||
| COPY --chown=app:app --from=build /usr/local/bin/ws /usr/local/bin/ws |  | ||||||
| RUN chmod +x /usr/local/bin/ws |  | ||||||
| RUN ldd /usr/local/bin/ws |  | ||||||
|  |  | ||||||
| # Now run in usermode |  | ||||||
| USER app |  | ||||||
| WORKDIR /home/app |  | ||||||
|  |  | ||||||
| COPY --chown=app:app ws/snake/appsConfig.json . |  | ||||||
| COPY --chown=app:app ws/cobraMetricsSample.json . |  | ||||||
|  |  | ||||||
| ENTRYPOINT ["ws"] |  | ||||||
| CMD ["--help"] |  | ||||||
							
								
								
									
										1
									
								
								Dockerfile
									
									
									
									
									
										Symbolic link
									
								
							
							
						
						
									
										1
									
								
								Dockerfile
									
									
									
									
									
										Symbolic link
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | docker/Dockerfile.fedora | ||||||
							
								
								
									
										52
									
								
								docker/Dockerfile.debian
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								docker/Dockerfile.debian
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,52 @@ | |||||||
|  | # Build time | ||||||
|  | FROM debian:buster as build | ||||||
|  |  | ||||||
|  | ENV DEBIAN_FRONTEND noninteractive | ||||||
|  | RUN apt-get update  | ||||||
|  | RUN apt-get -y install wget  | ||||||
|  | RUN mkdir -p /tmp/cmake | ||||||
|  | WORKDIR /tmp/cmake | ||||||
|  | RUN wget https://github.com/Kitware/CMake/releases/download/v3.14.0/cmake-3.14.0-Linux-x86_64.tar.gz  | ||||||
|  | RUN tar zxf cmake-3.14.0-Linux-x86_64.tar.gz | ||||||
|  |  | ||||||
|  | RUN apt-get -y install g++  | ||||||
|  | RUN apt-get -y install libssl-dev | ||||||
|  | RUN apt-get -y install libz-dev | ||||||
|  | RUN apt-get -y install make | ||||||
|  |  | ||||||
|  | COPY . . | ||||||
|  |  | ||||||
|  | ARG CMAKE_BIN_PATH=/tmp/cmake/cmake-3.14.0-Linux-x86_64/bin | ||||||
|  | ENV PATH="${CMAKE_BIN_PATH}:${PATH}" | ||||||
|  |  | ||||||
|  | RUN ["make"] | ||||||
|  |  | ||||||
|  | # Runtime | ||||||
|  | FROM debian:buster as runtime | ||||||
|  |  | ||||||
|  | ENV DEBIAN_FRONTEND noninteractive | ||||||
|  | RUN apt-get update  | ||||||
|  | # Runtime  | ||||||
|  | RUN apt-get install -y libssl1.1  | ||||||
|  | RUN apt-get install -y ca-certificates | ||||||
|  | RUN ["update-ca-certificates"] | ||||||
|  |  | ||||||
|  | # Debugging | ||||||
|  | RUN apt-get install -y strace | ||||||
|  | RUN apt-get install -y procps | ||||||
|  | RUN apt-get install -y htop | ||||||
|  |  | ||||||
|  | RUN adduser --disabled-password --gecos '' app | ||||||
|  | COPY --chown=app:app --from=build /usr/local/bin/ws /usr/local/bin/ws | ||||||
|  | RUN chmod +x /usr/local/bin/ws | ||||||
|  | RUN ldd /usr/local/bin/ws | ||||||
|  |  | ||||||
|  | # Now run in usermode | ||||||
|  | USER app | ||||||
|  | WORKDIR /home/app | ||||||
|  |  | ||||||
|  | COPY --chown=app:app ws/snake/appsConfig.json . | ||||||
|  | COPY --chown=app:app ws/cobraMetricsSample.json . | ||||||
|  |  | ||||||
|  | ENTRYPOINT ["ws"] | ||||||
|  | CMD ["--help"] | ||||||
							
								
								
									
										42
									
								
								docker/Dockerfile.fedora
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								docker/Dockerfile.fedora
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | |||||||
|  | FROM fedora:30 as build | ||||||
|  |  | ||||||
|  | RUN yum install -y gcc-g++ | ||||||
|  | RUN yum install -y cmake | ||||||
|  | RUN yum install -y make | ||||||
|  | RUN yum install -y openssl-devel | ||||||
|  |  | ||||||
|  | RUN yum install -y wget | ||||||
|  | RUN mkdir -p /tmp/cmake | ||||||
|  | WORKDIR /tmp/cmake | ||||||
|  | RUN wget https://github.com/Kitware/CMake/releases/download/v3.14.0/cmake-3.14.0-Linux-x86_64.tar.gz  | ||||||
|  | RUN tar zxf cmake-3.14.0-Linux-x86_64.tar.gz | ||||||
|  |  | ||||||
|  | ARG CMAKE_BIN_PATH=/tmp/cmake/cmake-3.14.0-Linux-x86_64/bin | ||||||
|  | ENV PATH="${CMAKE_BIN_PATH}:${PATH}" | ||||||
|  |  | ||||||
|  | RUN yum install -y python | ||||||
|  | RUN yum install -y libtsan | ||||||
|  |  | ||||||
|  | COPY . . | ||||||
|  | # RUN ["make", "test"] | ||||||
|  | RUN ["make"] | ||||||
|  |  | ||||||
|  | # Runtime | ||||||
|  | FROM fedora:30 as runtime | ||||||
|  |  | ||||||
|  | RUN yum install -y libtsan | ||||||
|  |  | ||||||
|  | RUN groupadd app && useradd -g app app  | ||||||
|  | COPY --chown=app:app --from=build /usr/local/bin/ws /usr/local/bin/ws | ||||||
|  | RUN chmod +x /usr/local/bin/ws | ||||||
|  | RUN ldd /usr/local/bin/ws | ||||||
|  |  | ||||||
|  | # Now run in usermode | ||||||
|  | USER app | ||||||
|  | WORKDIR /home/app | ||||||
|  |  | ||||||
|  | COPY --chown=app:app ws/snake/appsConfig.json . | ||||||
|  | COPY --chown=app:app ws/cobraMetricsSample.json . | ||||||
|  |  | ||||||
|  | ENTRYPOINT ["ws"] | ||||||
|  | CMD ["--help"] | ||||||
							
								
								
									
										24
									
								
								docker/Dockerfile.ubuntu_xenial
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								docker/Dockerfile.ubuntu_xenial
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | |||||||
|  | # Build time | ||||||
|  | FROM ubuntu:xenial as build | ||||||
|  |  | ||||||
|  | ENV DEBIAN_FRONTEND noninteractive | ||||||
|  | RUN apt-get update  | ||||||
|  | RUN apt-get -y install wget  | ||||||
|  | RUN mkdir -p /tmp/cmake | ||||||
|  | WORKDIR /tmp/cmake | ||||||
|  | RUN wget https://github.com/Kitware/CMake/releases/download/v3.14.0/cmake-3.14.0-Linux-x86_64.tar.gz  | ||||||
|  | RUN tar zxf cmake-3.14.0-Linux-x86_64.tar.gz | ||||||
|  |  | ||||||
|  | RUN apt-get -y install g++  | ||||||
|  | RUN apt-get -y install libssl-dev | ||||||
|  | RUN apt-get -y install libz-dev | ||||||
|  | RUN apt-get -y install make | ||||||
|  | RUN apt-get -y install python | ||||||
|  |  | ||||||
|  | COPY . . | ||||||
|  |  | ||||||
|  | ARG CMAKE_BIN_PATH=/tmp/cmake/cmake-3.14.0-Linux-x86_64/bin | ||||||
|  | ENV PATH="${CMAKE_BIN_PATH}:${PATH}" | ||||||
|  |  | ||||||
|  | # RUN ["make"] | ||||||
|  | RUN ["make", "test"] | ||||||
| @@ -19,25 +19,24 @@ namespace ix | |||||||
|     std::mutex DNSLookup::_activeJobsMutex; |     std::mutex DNSLookup::_activeJobsMutex; | ||||||
|  |  | ||||||
|     DNSLookup::DNSLookup(const std::string& hostname, int port, int64_t wait) : |     DNSLookup::DNSLookup(const std::string& hostname, int port, int64_t wait) : | ||||||
|         _hostname(hostname), |  | ||||||
|         _port(port), |         _port(port), | ||||||
|         _wait(wait), |         _wait(wait), | ||||||
|         _res(nullptr), |         _res(nullptr), | ||||||
|         _done(false), |         _done(false), | ||||||
|         _id(_nextId++) |         _id(_nextId++) | ||||||
|     { |     { | ||||||
|         ; |         setHostname(hostname); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     DNSLookup::~DNSLookup() |     DNSLookup::~DNSLookup() | ||||||
|     { |     { | ||||||
|         // Remove this job from the active jobs list |         // Remove this job from the active jobs list | ||||||
|         std::unique_lock<std::mutex> lock(_activeJobsMutex); |         std::lock_guard<std::mutex> lock(_activeJobsMutex); | ||||||
|         _activeJobs.erase(_id); |         _activeJobs.erase(_id); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // we want hostname to be copied, not passed as a const reference |     // we want hostname to be copied, not passed as a const reference | ||||||
|     struct addrinfo* DNSLookup::getAddrInfo(std::string hostname, |     struct addrinfo* DNSLookup::getAddrInfo(const std::string& hostname, | ||||||
|                                             int port, |                                             int port, | ||||||
|                                             std::string& errMsg) |                                             std::string& errMsg) | ||||||
|     { |     { | ||||||
| @@ -80,7 +79,7 @@ namespace ix | |||||||
|             return nullptr; |             return nullptr; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         return getAddrInfo(_hostname, _port, errMsg); |         return getAddrInfo(getHostname(), _port, errMsg); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     struct addrinfo* DNSLookup::resolveAsync(std::string& errMsg, |     struct addrinfo* DNSLookup::resolveAsync(std::string& errMsg, | ||||||
| @@ -98,7 +97,7 @@ namespace ix | |||||||
|  |  | ||||||
|         // Record job in the active Job set |         // Record job in the active Job set | ||||||
|         { |         { | ||||||
|             std::unique_lock<std::mutex> lock(_activeJobsMutex); |             std::lock_guard<std::mutex> lock(_activeJobsMutex); | ||||||
|             _activeJobs.insert(_id); |             _activeJobs.insert(_id); | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -106,7 +105,7 @@ namespace ix | |||||||
|         // Good resource on thread forced termination |         // Good resource on thread forced termination | ||||||
|         // https://www.bo-yang.net/2017/11/19/cpp-kill-detached-thread |         // https://www.bo-yang.net/2017/11/19/cpp-kill-detached-thread | ||||||
|         // |         // | ||||||
|         _thread = std::thread(&DNSLookup::run, this, _id, _hostname, _port); |         _thread = std::thread(&DNSLookup::run, this, _id, getHostname(), _port); | ||||||
|         _thread.detach(); |         _thread.detach(); | ||||||
|  |  | ||||||
|         std::unique_lock<std::mutex> lock(_conditionVariableMutex); |         std::unique_lock<std::mutex> lock(_conditionVariableMutex); | ||||||
| @@ -140,7 +139,7 @@ namespace ix | |||||||
|         return getRes(); |         return getRes(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     void DNSLookup::run(uint64_t id, std::string hostname, int port) // thread runner |     void DNSLookup::run(uint64_t id, const std::string& hostname, int port) // thread runner | ||||||
|     { |     { | ||||||
|         // We don't want to read or write into members variables of an object that could be |         // We don't want to read or write into members variables of an object that could be | ||||||
|         // gone, so we use temporary variables (res) or we pass in by copy everything that |         // gone, so we use temporary variables (res) or we pass in by copy everything that | ||||||
| @@ -151,7 +150,7 @@ namespace ix | |||||||
|         // if this isn't an active job, and the control thread is gone |         // if this isn't an active job, and the control thread is gone | ||||||
|         // there is nothing to do, and we don't want to touch the defunct |         // there is nothing to do, and we don't want to touch the defunct | ||||||
|         // object data structure such as _errMsg or _condition |         // object data structure such as _errMsg or _condition | ||||||
|         std::unique_lock<std::mutex> lock(_activeJobsMutex); |         std::lock_guard<std::mutex> lock(_activeJobsMutex); | ||||||
|         if (_activeJobs.count(id) == 0) |         if (_activeJobs.count(id) == 0) | ||||||
|         { |         { | ||||||
|             return; |             return; | ||||||
| @@ -165,27 +164,39 @@ namespace ix | |||||||
|         _done = true; |         _done = true; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     void DNSLookup::setHostname(const std::string& hostname) | ||||||
|  |     { | ||||||
|  |         std::lock_guard<std::mutex> lock(_hostnameMutex); | ||||||
|  |         _hostname = hostname; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     const std::string& DNSLookup::getHostname() | ||||||
|  |     { | ||||||
|  |         std::lock_guard<std::mutex> lock(_hostnameMutex); | ||||||
|  |         return _hostname; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     void DNSLookup::setErrMsg(const std::string& errMsg) |     void DNSLookup::setErrMsg(const std::string& errMsg) | ||||||
|     { |     { | ||||||
|         std::unique_lock<std::mutex> lock(_errMsgMutex); |         std::lock_guard<std::mutex> lock(_errMsgMutex); | ||||||
|         _errMsg = errMsg; |         _errMsg = errMsg; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     const std::string& DNSLookup::getErrMsg() |     const std::string& DNSLookup::getErrMsg() | ||||||
|     { |     { | ||||||
|         std::unique_lock<std::mutex> lock(_errMsgMutex); |         std::lock_guard<std::mutex> lock(_errMsgMutex); | ||||||
|         return _errMsg; |         return _errMsg; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     void DNSLookup::setRes(struct addrinfo* addr) |     void DNSLookup::setRes(struct addrinfo* addr) | ||||||
|     { |     { | ||||||
|         std::unique_lock<std::mutex> lock(_resMutex); |         std::lock_guard<std::mutex> lock(_resMutex); | ||||||
|         _res = addr; |         _res = addr; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     struct addrinfo* DNSLookup::getRes() |     struct addrinfo* DNSLookup::getRes() | ||||||
|     { |     { | ||||||
|         std::unique_lock<std::mutex> lock(_resMutex); |         std::lock_guard<std::mutex> lock(_resMutex); | ||||||
|         return _res; |         return _res; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -39,11 +39,20 @@ namespace ix | |||||||
|         struct addrinfo* resolveBlocking(std::string& errMsg, |         struct addrinfo* resolveBlocking(std::string& errMsg, | ||||||
|                                          const CancellationRequest& isCancellationRequested); |                                          const CancellationRequest& isCancellationRequested); | ||||||
|  |  | ||||||
|         static struct addrinfo* getAddrInfo(std::string hostname, |         static struct addrinfo* getAddrInfo(const std::string& hostname, | ||||||
|                                             int port, |                                             int port, | ||||||
|                                             std::string& errMsg); |                                             std::string& errMsg); | ||||||
|  |  | ||||||
|         void run(uint64_t id, std::string hostname, int port); // thread runner |         void run(uint64_t id, const std::string& hostname, int port); // thread runner | ||||||
|  |  | ||||||
|  |         void setHostname(const std::string& hostname); | ||||||
|  |         const std::string& getHostname(); | ||||||
|  |  | ||||||
|  |         void setErrMsg(const std::string& errMsg); | ||||||
|  |         const std::string& getErrMsg(); | ||||||
|  |  | ||||||
|  |         void setRes(struct addrinfo* addr); | ||||||
|  |         struct addrinfo* getRes(); | ||||||
|  |  | ||||||
|         void setErrMsg(const std::string& errMsg); |         void setErrMsg(const std::string& errMsg); | ||||||
|         const std::string& getErrMsg(); |         const std::string& getErrMsg(); | ||||||
| @@ -52,7 +61,9 @@ namespace ix | |||||||
|         struct addrinfo* getRes(); |         struct addrinfo* getRes(); | ||||||
|  |  | ||||||
|         std::string _hostname; |         std::string _hostname; | ||||||
|  |         std::mutex _hostnameMutex; | ||||||
|         int _port; |         int _port; | ||||||
|  |  | ||||||
|         int64_t _wait; |         int64_t _wait; | ||||||
|  |  | ||||||
|         struct addrinfo* _res; |         struct addrinfo* _res; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user