Skip to content

Instantly share code, notes, and snippets.

@IlyaSkriblovsky
Last active January 28, 2018 16:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save IlyaSkriblovsky/4dd3abfd5f67c64b13f1c673f56466f9 to your computer and use it in GitHub Desktop.
Save IlyaSkriblovsky/4dd3abfd5f67c64b13f1c673f56466f9 to your computer and use it in GitHub Desktop.
Demo of circular dependencies created while using TLSMemoryBIOProtocol
import sys
import os
import gc
from twisted.protocols.tls import TLSMemoryBIOFactory, TLSMemoryBIOProtocol
from twisted.internet.protocol import Protocol, Factory
from twisted.internet import ssl, defer, error
from twisted.internet.task import react
from twisted.protocols.loopback import loopbackAsync
import psutil
N = 10000
K = 100
print('N =', N, ', K =', K)
class DummyServerProtocol(Protocol):
def dataReceived(self, data):
self.transport.loseConnection()
class DummyClientProtocol(Protocol):
def connectionMade(self):
self.transport.write(b'hello')
def connectionLost(self, reason):
reason.trap(error.ConnectionDone)
cert='\n-----BEGIN CERTIFICATE-----\nMIICgDCCAemgAwIBAgIJAMeOKG8rDhy7MA0GCSqGSIb3DQEBCwUAMFkxCzAJBgNV\nBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX\naWRnaXRzIFB0eSBMdGQxEjAQBgNVBAMMCWxvY2FsaG9zdDAeFw0xODAxMTYxOTE5\nNDdaFw0xOTAxMTYxOTE5NDdaMFkxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21l\nLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxEjAQBgNV\nBAMMCWxvY2FsaG9zdDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuLPoRpKE\nlcA1pJSLcgODsasyeH3gzZqaQmRTrvhaC1v8bQDmdfSyHEbsgjbnJjuPA/syqPMs\n2AzCqV1kRXfql6N5csNhrlny3xvDVGFwEZRTjZrKltx+m6lgoew+Qbmgzk8Z1+7y\nhO3UdAuEBzFyH8eIAhLzptEdwOz8L7s1pskCAwEAAaNQME4wHQYDVR0OBBYEFD5P\n6/WE9JJjvesbjIPsnoAu01fhMB8GA1UdIwQYMBaAFD5P6/WE9JJjvesbjIPsnoAu\n01fhMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADgYEAPzZmTbG+qDPyqTky\nP28gTRmp4qrc5v8kw37U+esGcAVPDirAFq/175xBNiZxZLdqR6tg4NNFt696fsP5\nGOCz3ZZAGbUDmbEepjJagchHPmzXbQAMLKmIr3cOPtsjw9QXj9VONM/uNMWPDtEt\nO08ok5x1jZ1jbd5B3QAuYsowWOo=\n-----END CERTIFICATE-----\n'
key='-----BEGIN PRIVATE KEY-----\nMIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALiz6EaShJXANaSU\ni3IDg7GrMnh94M2amkJkU674Wgtb/G0A5nX0shxG7II25yY7jwP7MqjzLNgMwqld\nZEV36pejeXLDYa5Z8t8bw1RhcBGUU42aypbcfpupYKHsPkG5oM5PGdfu8oTt1HQL\nhAcxch/HiAIS86bRHcDs/C+7NabJAgMBAAECgYEAnupTyByaLMoynUcdb1xsu7nj\nc95CRERnwwXVJm8R8kITvqmOoCCH+mJfbW3VlYSa+T7xCIIprD3WYqgy9L5HPPhM\ntP4mpWvRGIf68aCKGlrWB7mBZYzeOOd65QuP2ZB8ztvIPpQDxnI3vYaCIvCcvgvP\n8bilK5X1TbgnyVg1tXECQQDkYWurWhU55vnpihXYe5L4MbjKNUVXLXNuXSe3LCzp\nCCb1jJQSvD5+XoTfrDriS+f609KV9ZAHZp7P1PJ/ogKlAkEAzwo8/U7+D+UocW/p\nsDIqyYNFnVECL8m5TgO+K3pceTd8ZMiPoxZjZFK1ixFM5Mp4Nh1nQpglRlFQn+i4\nawLOVQJAKO6U/5cbqs8NB6BqHey4AKfYuNUnYmKRB7zGe3v9aJ6/bM8PUvRONxP1\nuKkDvL9iCoCgg6QJdmocGJ/P/rQoyQJAOwQHGImAwBUpLxSgfzn9mk1R9aLWxbpx\nmLxWY9xQKblYOv40e19xW3J8DzUSPxE7rOk6uu/ViDK7kalrkA1PtQJAUTM+KDL7\n/6TcTJBEcR1OkIN4JxxLhQaD7VIt67HRyDl3ninJ22PFrfTneXhv6BRMHKNEQWxS\nbEjF+34RqDT+zg==\n-----END PRIVATE KEY-----\n'
serverCert = ssl.PrivateCertificate.loadPEM(cert + key)
server_factory = TLSMemoryBIOFactory(serverCert.options(), False, Factory.forProtocol(DummyServerProtocol))
options = ssl.optionsForClientTLS(u'localhost', ssl.Certificate.loadPEM(cert))
client_factory = TLSMemoryBIOFactory(options, True, Factory.forProtocol(DummyClientProtocol))
@defer.inlineCallbacks
def main(reactor):
gc.collect()
orig_colls = sum(gen['collections'] for gen in gc.get_stats())
for _ in range(N // K):
yield defer.gatherResults(
loopbackAsync(
TLSMemoryBIOProtocol(server_factory, DummyServerProtocol()),
TLSMemoryBIOProtocol(client_factory, DummyClientProtocol())
)
for _ in range(K)
)
colls = sum(gen['collections'] for gen in gc.get_stats())
print('collections', colls - orig_colls)
print('mem', psutil.Process(os.getpid()).memory_info().rss//1024//1024, 'mb')
if len(sys.argv) >= 2 and sys.argv[1] == 'loose':
gc.set_threshold(100000, 200, 100)
react(main)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment