Last active
January 28, 2018 16:45
-
-
Save IlyaSkriblovsky/4dd3abfd5f67c64b13f1c673f56466f9 to your computer and use it in GitHub Desktop.
Demo of circular dependencies created while using TLSMemoryBIOProtocol
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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