tsan fixes on ubuntu xenial (what travis run)

This commit is contained in:
Benjamin Sergeant 2019-04-29 19:29:27 -07:00
parent 6d310d417a
commit ad8b344298
6 changed files with 156 additions and 57 deletions

@ -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

@ -0,0 +1 @@
docker/Dockerfile.fedora

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

@ -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"]

@ -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;