Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
jaguililla committed Oct 29, 2024
2 parents 2ae467e + 7aca29c commit aa3dbc5
Show file tree
Hide file tree
Showing 301 changed files with 4,218 additions and 2,958 deletions.
44 changes: 27 additions & 17 deletions frameworks/C/h2o/h2o.dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,28 @@ FROM "ubuntu:${UBUNTU_VERSION}" AS compile

ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get -yqq update && \
apt-get -yqq install \
ca-certificates \
curl \
lsb-release && \
install -dm755 /usr/share/postgresql-common/pgdg && \
curl --fail -LSso /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc \
"https://www.postgresql.org/media/keys/ACCC4CF8.asc" && \
sh -c 'echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] \
https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > \
/etc/apt/sources.list.d/pgdg.list' && \
apt-get -yqq update && \
apt-get -yqq install \
autoconf \
bison \
cmake \
curl \
flex \
g++ \
libbpfcc-dev \
libbrotli-dev \
libcap-dev \
libicu-dev \
libnuma-dev \
libreadline-dev \
libpq-dev \
libssl-dev \
libtool \
libuv1-dev \
Expand Down Expand Up @@ -57,18 +66,6 @@ RUN curl -LSs "https://github.com/x86-64/mustache-c/archive/${MUSTACHE_C_REVISIO
CFLAGS="-flto -march=native -mtune=native -O3" ./autogen.sh && \
make -j "$(nproc)" install

ARG POSTGRESQL_VERSION=a37bb7c13995b834095d9d064cad1023a6f99b10

WORKDIR /tmp/postgresql-build
RUN curl -LSs "https://github.com/postgres/postgres/archive/${POSTGRESQL_VERSION}.tar.gz" | \
tar --strip-components=1 -xz && \
CFLAGS="-flto -march=native -mtune=native -O3" ./configure \
--includedir=/usr/local/include/postgresql \
--prefix=/usr/local \
--with-ssl=openssl && \
make -j "$(nproc)" -C src/include install && \
make -j "$(nproc)" -C src/interfaces/libpq install

ARG H2O_APP_PREFIX
WORKDIR /tmp/build
COPY CMakeLists.txt ../
Expand All @@ -85,15 +82,28 @@ RUN cmake \

FROM "ubuntu:${UBUNTU_VERSION}"

ARG POSTGRESQL_VERSION=17

ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get -yqq update && \
apt-get -yqq install \
ca-certificates \
curl \
lsb-release && \
install -dm755 /usr/share/postgresql-common/pgdg && \
curl --fail -LSso /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc \
"https://www.postgresql.org/media/keys/ACCC4CF8.asc" && \
sh -c 'echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] \
https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > \
/etc/apt/sources.list.d/pgdg.list' && \
apt-get -yqq update && \
apt-get -yqq install \
libnuma1 \
libyajl2
libyajl2 \
"postgresql-client-${POSTGRESQL_VERSION}"
ARG H2O_APP_PREFIX
COPY --from=compile "${H2O_APP_PREFIX}" "${H2O_APP_PREFIX}/"
COPY --from=compile /usr/local/lib/libmustache_c.so "${H2O_APP_PREFIX}/lib/"
COPY --from=compile /usr/local/lib/libpq.so.5.17 "${H2O_APP_PREFIX}/lib/libpq.so.5"
ENV LD_LIBRARY_PATH="${H2O_APP_PREFIX}/lib"
EXPOSE 8080
ARG BENCHMARK_ENV
Expand Down
16 changes: 7 additions & 9 deletions frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,6 @@ public DbCommand(string commandText, DbConnection dbConnection)
_dbConnection = dbConnection;
}

public DbCommand(string commandText, DbConnection dbConnection, bool keyed)
{
_odbcCommand = dbConnection.GetCommand(commandText, CommandType.Text, keyed);
_dbConnection = dbConnection;
}

public DbCommand(string commandText, CommandType commandType, DbConnection dbConnection)
{
_odbcCommand = dbConnection.GetCommand(commandText, commandType);
Expand Down Expand Up @@ -175,14 +169,19 @@ public IDataReader ExecuteReader()

public async Task<int> ExecuteNonQueryAsync()
{
return await (_odbcCommand as System.Data.Common.DbCommand).ExecuteNonQueryAsync();
return await _odbcCommand.ExecuteNonQueryAsync();
}

public IDataReader ExecuteReader(CommandBehavior behavior)
{
return _odbcCommand.ExecuteReader(behavior);
}

public async Task<System.Data.Common.DbDataReader> ExecuteReaderAsync(CommandBehavior behavior)
{
return await _odbcCommand.ExecuteReaderAsync(behavior);
}

#nullable enable
public object? ExecuteScalar()
{
Expand All @@ -197,8 +196,7 @@ public void Prepare()

public void Dispose()
{
if (_dbConnection._keyed) _dbConnection._keyedOdbcCommands.TryAdd(_odbcCommand.CommandText, _odbcCommand);
else _dbConnection._odbcCommands.Push(_odbcCommand);
_dbConnection.Release(_odbcCommand);
}
}
}
87 changes: 54 additions & 33 deletions frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbConnection.cs
Original file line number Diff line number Diff line change
@@ -1,26 +1,27 @@
using System.Collections.Concurrent;
using System.Data;
using System.Data.Odbc;
using System.Data.Odbc;

namespace appMpower.Orm.Data
{
public class DbConnection : IDbConnection
{
private string _connectionString;
internal bool _keyed = false;
internal int _number;
internal OdbcConnection _odbcConnection;
internal ConcurrentStack<OdbcCommand> _odbcCommands = new();
internal Dictionary<string, OdbcCommand> _keyedOdbcCommands;
private bool _keyed = false;
private int _number;
private OdbcConnection _odbcConnection;
private ConcurrentStack<OdbcCommand> _odbcCommands = new();
private Dictionary<string, OdbcCommand> _keyedOdbcCommands;

public DbConnection()
{
_connectionString = DbProviderFactory.ConnectionString;
}

public DbConnection(string connectionString)
public DbConnection(string connectionString, bool keyed = false)
{
_connectionString = connectionString;
_keyed = keyed;
_connectionString = connectionString;
GetConnection();
}

public IDbConnection Connection
Expand All @@ -43,7 +44,22 @@ public string ConnectionString
}
set
{
_odbcConnection.ConnectionString = value;
_connectionString = value;
GetConnection();
}
}

private void GetConnection()
{
if (_keyed)
{
(_number, _odbcConnection, _keyedOdbcCommands) =
DbConnectionsKeyed.GetConnectionBase(_connectionString).GetAwaiter().GetResult();
}
else
{
(_number, _odbcConnection, _odbcCommands) =
DbConnections.GetConnectionBase(_connectionString).GetAwaiter().GetResult();
}
}

Expand Down Expand Up @@ -99,23 +115,33 @@ public IDbCommand CreateCommand()

public void Open()
{
if (_odbcConnection is null)
if (_odbcConnection.State == ConnectionState.Closed)
{
DbConnections.GetConnection(_connectionString, this);
_odbcConnection.Open();
}
}

public async Task OpenAsync()
{
if (_odbcConnection.State == ConnectionState.Closed)
{
_odbcConnection.Open();
await _odbcConnection.OpenAsync();
}
}

public void Dispose()
{
DbConnections.Release(this);
if (_keyed)
{
DbConnectionsKeyed.Release((Number: _number, OdbcConnection: _odbcConnection, KeyedOdbcCommands: _keyedOdbcCommands));
}
else
{
DbConnections.Release((Number: _number, OdbcConnection: _odbcConnection, OdbcCommands: _odbcCommands));
}
}

internal OdbcCommand GetCommand(string commandText, CommandType commandType, bool keyed = false)
internal OdbcCommand GetCommand(string commandText, CommandType commandType)
{
OdbcCommand odbcCommand;

Expand All @@ -129,25 +155,20 @@ internal OdbcCommand GetCommand(string commandText, CommandType commandType, boo

return odbcCommand;
}
else if (_keyed && _keyedOdbcCommands.TryGetValue(commandText, out odbcCommand))
{
return odbcCommand;
}
else
{
if (!_keyed && keyed)
{
_keyedOdbcCommands = new();
_keyed = keyed;
}

odbcCommand = _odbcConnection.CreateCommand();
odbcCommand.CommandText = commandText;
odbcCommand.CommandType = commandType;
odbcCommand.Prepare();
else if (_keyed && _keyedOdbcCommands.TryGetValue(commandText, out odbcCommand)) return odbcCommand;

return odbcCommand;
}
odbcCommand = _odbcConnection.CreateCommand();
odbcCommand.CommandText = commandText;
odbcCommand.CommandType = commandType;
odbcCommand.Prepare();

return odbcCommand;
}

internal void Release(OdbcCommand odbcCommand)
{
if (_keyed) _keyedOdbcCommands.TryAdd(odbcCommand.CommandText, odbcCommand);
else _odbcCommands.Push(odbcCommand);
}
}
}
64 changes: 32 additions & 32 deletions frameworks/CSharp/appmpower/src/appMpower.Orm/Data/DbConnections.cs
Original file line number Diff line number Diff line change
@@ -1,61 +1,61 @@
using System.Collections.Concurrent;
using System.Data.Odbc;

namespace appMpower.Orm.Data
{
public static class DbConnections
internal static class DbConnections
{
private static bool _maxConnectionsCreated = false;
private static short _createdConnections = 0;
private static ConcurrentStack<DbConnection> _connectionsStack = new();
private static short _maxConnections = 500;

public static DbConnection GetConnection(string connectionString)
private static ConcurrentStack<(int Number, OdbcConnection OdbcConnection, ConcurrentStack<OdbcCommand> OdbcCommands)> _connectionsStack = new();
private static ConcurrentQueue<TaskCompletionSource<(int Number, OdbcConnection OdbcConnection, ConcurrentStack<OdbcCommand> OdbcCommands)>> _waitingQueue = new();

internal static async Task<(int Number, OdbcConnection OdbcConnection, ConcurrentStack<OdbcCommand> OdbcCommands)> GetConnectionBase(string connectionString)
{
DbConnection popDbConnection;
(int Number, OdbcConnection OdbcConnection, ConcurrentStack<OdbcCommand> OdbcCommands) dbConnectionBase;

if (!_connectionsStack.TryPop(out popDbConnection))
if (!_connectionsStack.TryPop(out dbConnectionBase))
{
popDbConnection = new DbConnection();
popDbConnection._odbcConnection = new System.Data.Odbc.OdbcConnection(connectionString);
if (_maxConnectionsCreated)
{
dbConnectionBase = await GetDbConnectionBaseAsync();
}
else
{
_createdConnections++;
dbConnectionBase = (Number: _maxConnections, OdbcConnection: new OdbcConnection(connectionString), OdbcCommands: new ConcurrentStack<OdbcCommand>());

_createdConnections++;
popDbConnection._number = _createdConnections;
if (_createdConnections == _maxConnections) _maxConnectionsCreated = true;

if (_createdConnections % 25 == 0)
{
Console.WriteLine("Pooled connections created: " + _createdConnections.ToString());
//Console.WriteLine("opened connection number: " + dbConnectionBase._number);
}
}

return popDbConnection;
return dbConnectionBase;
}


public static void GetConnection(string connectionString, DbConnection dbConnection)
internal static void Release((int Number, OdbcConnection OdbcConnection, ConcurrentStack<OdbcCommand> OdbcCommands) dbConnectionBase)
{
DbConnection popDbConnection = null;
TaskCompletionSource<(int Number, OdbcConnection OdbcConnection, ConcurrentStack<OdbcCommand> OdbcCommands)> taskCompletionSource;

if (_connectionsStack.TryPop(out popDbConnection))
if (_waitingQueue.TryDequeue(out taskCompletionSource))
{
dbConnection._odbcConnection = popDbConnection._odbcConnection;
dbConnection._odbcCommands = popDbConnection._odbcCommands;
dbConnection._number = popDbConnection._number;
taskCompletionSource.SetResult(dbConnectionBase);
}
else
{
dbConnection._odbcConnection = new System.Data.Odbc.OdbcConnection(connectionString);

_createdConnections++;
dbConnection._number = _createdConnections;

if (_createdConnections % 25 == 0)
{
Console.WriteLine("Pooled connections created: " + _createdConnections.ToString());
}
}
_connectionsStack.Push(dbConnectionBase);
}
}

public static void Release(DbConnection dbConnection)
private static Task<(int Number, OdbcConnection OdbcConnection, ConcurrentStack<OdbcCommand> OdbcCommands)> GetDbConnectionBaseAsync()
{
_connectionsStack.Push(dbConnection);
var taskCompletionSource = new TaskCompletionSource<(int Number, OdbcConnection OdbcConnection, ConcurrentStack<OdbcCommand> OdbcCommands)>(TaskCreationOptions.RunContinuationsAsynchronously);

_waitingQueue.Enqueue(taskCompletionSource);
return taskCompletionSource.Task;
}
}
}
Loading

0 comments on commit aa3dbc5

Please sign in to comment.