#9307 Python: avoid assigning same port number to multiple grpc sessions

* Python: avoid assigning same port number to multiple grpc sessions
* Add retry count when checking for port number file
* Use grpc to find and use port number
* Add test used to start several instances of resinsight at the same time
Testing up to 50 instances works well

* Python: allow launch_port == 0 to assign port by GRPC in Instance.launch().
Also allow longer wait before failing the port number file reading:
it can take some time to launch when launching lots of instances at
the same time.
This commit is contained in:
Kristian Bendiksen
2022-09-26 14:19:21 +02:00
committed by GitHub
parent 587f700ae4
commit c2b5ab8d2c
7 changed files with 165 additions and 36 deletions

View File

@@ -137,12 +137,14 @@ void RiaGrpcServerImpl::runInThread()
//--------------------------------------------------------------------------------------------------
void RiaGrpcServerImpl::initialize()
{
CAF_ASSERT( m_portNumber > 0 && m_portNumber <= (int)std::numeric_limits<quint16>::max() );
QString serverAddress = QString( "localhost:%1" ).arg( m_portNumber );
CAF_ASSERT( m_portNumber >= 0 && m_portNumber <= (int)std::numeric_limits<quint16>::max() );
ServerBuilder builder;
builder.AddListeningPort( serverAddress.toStdString(), grpc::InsecureServerCredentials() );
// When setting port number to 0, grpc will find and use a valid port number
// The port number is assigned to the m_portNumber variable after calling builder.BuildAndStart()
QString requestedServerAddress = QString( "localhost:%1" ).arg( m_portNumber );
builder.AddListeningPort( requestedServerAddress.toStdString(), grpc::InsecureServerCredentials(), &m_portNumber );
for ( auto key : RiaGrpcServiceFactory::instance()->allKeys() )
{
@@ -154,7 +156,14 @@ void RiaGrpcServerImpl::initialize()
m_completionQueue = builder.AddCompletionQueue();
m_server = builder.BuildAndStart();
CVF_ASSERT( m_server );
QString serverAddress = QString( "localhost:%1" ).arg( m_portNumber );
if ( !m_server )
{
RiaLogging::error( QString( "Failed to start server on %1" ).arg( serverAddress ) );
return;
}
RiaLogging::info( QString( "Server listening on %1" ).arg( serverAddress ) );
// Spawn new CallData instances to serve new clients.
@@ -383,7 +392,7 @@ int RiaGrpcServer::findAvailablePortNumber( int defaultPortNumber )
{
int startPort = 50051;
if ( defaultPortNumber > 0 && defaultPortNumber < (int)std::numeric_limits<quint16>::max() )
if ( defaultPortNumber >= 0 && defaultPortNumber < (int)std::numeric_limits<quint16>::max() )
{
startPort = defaultPortNumber;
}
@@ -391,8 +400,7 @@ int RiaGrpcServer::findAvailablePortNumber( int defaultPortNumber )
int endPort = std::min( startPort + 100, (int)std::numeric_limits<quint16>::max() );
QTcpServer serverTest;
quint16 port = static_cast<quint16>( startPort );
for ( ; port <= static_cast<quint16>( endPort ); ++port )
for ( quint16 port = static_cast<quint16>( startPort ); port <= static_cast<quint16>( endPort ); ++port )
{
if ( serverTest.listen( QHostAddress::LocalHost, port ) )
{