Changeset - 2adb8e927e34
[Not reviewed]
default
0 2 0
Laman - 8 years ago 2017-06-05 22:17:43

network benchmark
2 files changed with 66 insertions and 4 deletions:
0 comments (0 inline, 0 general)
src/benchmark.py
Show inline comments
 
from time import time
 
import socket
 
import threading
 

	
 
from hashtree import HashTree
 

	
 

	
 
def timeF(f):
 
	start=time()
 
	f()
 
	end=time()
 
	print((end-start),"s")
 

	
 

	
 
def fullRead():
 
	block=True
 
	with open("/home/laman/ext2.img",mode="rb") as f:
 
		while block:
 
			block=f.read(HashTree.BLOCK_SIZE)
 

	
 

	
 
def selectedRead():
 
	with open("/home/laman/blocks.txt") as f:
 
		blocks=[int(x) for x in f]
 
	with open("/home/laman/ext2.img",mode="rb") as f:
 
		i1=-1
 
		for i2 in blocks:
 
			if i1+1!=i2:
 
				f.seek(i2*HashTree.BLOCK_SIZE)
 
			block=f.read(HashTree.BLOCK_SIZE)
 
			i1=i2
 

	
 

	
 
def lessSelectedRead():
 
	with open("/home/laman/blocks.txt") as f:
 
		blocks=[int(x) for x in f]
 
	with open("/home/laman/ext2.img",mode="rb") as f:
 
		i1=-1
 
		for i2 in blocks:
 
			if i2<=i1+8:
 
				block=f.read(HashTree.BLOCK_SIZE*(i2-i1))
 
			else:
 
				f.seek(i2*HashTree.BLOCK_SIZE)
 
				block=f.read(HashTree.BLOCK_SIZE)
 
			i1=i2
 

	
 

	
 
def shortSockets():
 
	pass
 
	def _server():
 
		serverSock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
		serverSock.bind(("",12329))
 
		serverSock.listen(1)
 

	
 
		for i in range(10000):
 
			sock, address = serverSock.accept()
 
			with sock.makefile(mode="rb") as fr, sock.makefile(mode="wb") as fw:
 
				fr.readline()
 
			sock.shutdown(socket.SHUT_RDWR)
 
			sock.close()
 
		serverSock.close()
 

	
 
	def _client():
 
		for i in range(10000):
 
			sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
 
			sock.connect(("127.0.0.1", 12329))
 
			with sock.makefile(mode="rb") as fr, sock.makefile(mode="wb") as fw:
 
				fw.write(b"x"*4096+b"\n")
 
				fw.flush()
 
			sock.shutdown(socket.SHUT_RDWR)
 
			sock.close()
 

	
 
	s=threading.Thread(target=_server)
 
	s.start()
 
	c=threading.Thread(target=_client)
 
	c.start()
 
	s.join()
 
	c.join()
 

	
 

	
 
def longSockets():
 
	pass
 
	def _server():
 
		serverSock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
		serverSock.bind(("",12330))
 
		serverSock.listen(1)
 
		sock, address = serverSock.accept()
 

	
 
		with sock.makefile(mode="rb") as fr, sock.makefile(mode="wb") as fw:
 
			for i in range(10000):
 
				fr.readline()
 

	
 
		sock.shutdown(socket.SHUT_RDWR)
 
		sock.close()
 
		serverSock.close()
 

	
 
	def _client():
 
		sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
 
		sock.connect(("127.0.0.1", 12330))
 
		with sock.makefile(mode="rb") as fr, sock.makefile(mode="wb") as fw:
 
			for i in range(10000):
 
					fw.write(b"x"*4096+b"\n")
 
					fw.flush()
 
		sock.shutdown(socket.SHUT_RDWR)
 
		sock.close()
 

	
 
	s=threading.Thread(target=_server)
 
	s.start()
 
	c=threading.Thread(target=_client)
 
	c.start()
 
	s.join()
 
	c.join()
 

	
 

	
 
# timeF(fullRead) # 85.40341448783875 s
 
# timeF(selectedRead) # 6.774365186691284 s
 
# timeF(lessSelectedRead) # 5.930811405181885 s
 

	
 
# timeF(shortSockets) # 3.928339719772339 s
 
# timeF(longSockets) # 0.15576839447021484 s
src/server.py
Show inline comments
 
import socket
 
from hashtree import HashTree
 
from networkers import NetworkReader,NetworkWriter
 
import logging as log
 

	
 
import config as conf
 

	
 

	
 
class Connection:
 
	def __init__(self,server_socket):
 
		self.socket, address = server_socket.accept()
 
	def __init__(self,serverSocket):
 
		self.socket, address = serverSocket.accept()
 
		log.info('Connected by {0}'.format(address))
 
		fr=self.socket.makefile(mode="rb")
 
		fw=self.socket.makefile(mode="wb")
 

	
 
		self.incoming=NetworkReader(fr)
 
		self.outcoming=NetworkWriter(fw)
 

	
 
	def __enter__(self):
 
		return self.incoming,self.outcoming
 

	
 
	def __exit__(self, exc_type, exc_val, exc_tb):
 
		self.socket.close()
 

	
 

	
 
class Server:
 
	def __init__(self,filename,treeFile=""):
 
		self.filename=filename
 

	
 
		if treeFile:
 
			self.tree=HashTree.load(treeFile)
 
		else:
 
			self.tree=HashTree.fromFile(filename)
 

	
 
		self.BLOCK_SIZE=self.tree.BLOCK_SIZE
 

	
 
		self.ss = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
		self.ss.bind(("",conf.port))
 
		self.ss.listen(1)
 

	
 
		self._lastWrite=-1
 
		self.dataFile=None
 

	
 
	def serve(self):
 
		while self._serveOne():
 
			pass
 

	
 
	def _serveOne(self):
 
		with Connection(self.ss) as (incoming,outcoming):
 
			jsonData,binData=incoming.readMsg()
 

	
 
			if jsonData["command"]=="init":
 
				assert jsonData["blockSize"]==self.BLOCK_SIZE
 
				assert jsonData["blockCount"]==self.tree.leafCount
 

	
 
			elif jsonData["command"]=="req":
 
				outcoming.writeMsg(*self._requestHash(jsonData))
 

	
 
			elif jsonData["command"]=="send" and jsonData["dataType"]=="data":
 
				self._receiveData(jsonData,binData)
 

	
 
			elif jsonData["command"]=="end":
 
				log.info("closing session...")
 
				if self.dataFile:
 
					self.dataFile.close()
 
				return False
 

	
 
			else:
 
				assert False, jsonData["command"]
 

	
 
			return True
 

	
 
	def _requestHash(self,jsonData):
 
		log.info("received request for node #{0}".format(jsonData["index"]))
 
		assert jsonData["index"]<len(self.tree.store)
 
		nodeHash=self.tree.store[jsonData["index"]]
 

	
 
		jsonResponse={"command":"send", "index":jsonData["index"], "dataType":"hash"}
 
		binResponse=nodeHash
 

	
 
		return (jsonResponse,binResponse)
 

	
 
	def _receiveData(self,jsonData,binData):
 
		log.info("received data block #{0}: {1}...{2}".format(jsonData["index"],binData[:5],binData[-5:]))
 

	
 
		if not self.dataFile:
 
			self.dataFile=open(self.filename,mode="rb+")
 
		i=jsonData["index"]
 
		if self._lastWrite+1!=i:
 
			self.dataFile.seek(i*self.BLOCK_SIZE)
 
		self.dataFile.write(binData)
 
		self._lastWrite=i
 

	
 
		# never update the hash tree
0 comments (0 inline, 0 general)