-
Notifications
You must be signed in to change notification settings - Fork 1
/
spar.py
109 lines (91 loc) · 4.05 KB
/
spar.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# Include python library for pycassa
import sys
import functions
import node
import pycassa
from pycassa.index import *
from datetime import datetime
# Connect to Cassandra Instance
from pycassa.pool import ConnectionPool
pool = ConnectionPool('OSN')
#pool = ConnectionPool('OSN', ['localhost:9160'])
from pycassa.columnfamily import ColumnFamily
col_fam_master = pycassa.ColumnFamily(pool, 'Master')
col_fam_replica = pycassa.ColumnFamily(pool, 'Replica')
col_fam_edge = pycassa.ColumnFamily(pool, 'Edge')
col_fam_mme = pycassa.ColumnFamily(pool, 'Master_Master_Edge')
col_fam_mse = pycassa.ColumnFamily(pool, 'Master_Slave_Edge')
# Input: Number of servers & number of replicas (K-redundancy)
total_servers =4
total_replicas = 2
# Variables
server_id = 0
num_replica = 0
replica_id =0
total_replicas_needed =0
edge_count =0
if len(sys.argv) != 2:
raise sys.exit("Number of arguments should be 2. Give a dataset with edges. \nExiting...")
cocounter=0
t1 = datetime.now()
# Read the edges file and execute SPAR algorithm
file_name = str(sys.argv[1])
with open(file_name, 'r') as f:
for line in f:
# Ignore comment lines
if not line.startswith('#'):
#edge_exists = False
# nodes hold the 2 end-nodes of the edge
nodes = [int(x) for x in line.split()]
#print "(%d,%d)" % (nodes[0], nodes[1])
added_replicas1=0
added_replicas2=0
added_replicas3=0
user1 = node.node(nodes[0], functions.getServer(col_fam_master,nodes[0]), functions.get_server_rep(col_fam_replica, nodes[0]))
user2 = node.node(nodes[1], functions.getServer(col_fam_master,nodes[1]), functions.get_server_rep(col_fam_replica, nodes[1]))
if nodes[0] < nodes[1]:
col_fam_edge.insert(functions.get_a_Uuid(), {'u':nodes[0],'v':nodes[1]})
edge_count += 1
else:
col_fam_edge.insert(functions.get_a_Uuid(), {'u':nodes[1],'v':nodes[0]})
edge_count +=1
#if edge_exists == False:
#if not edge_exists:
if True:
# Check if masters/replicas of both nodes are co-located
flag_col = functions.colocated(user1, user2, col_fam_mme, col_fam_mse)
#print "%s --> %d" % (line, flag_col)
#print "nodes[%d,%d] in servers[%d,%d]" % (user1.getId(), user2.getId(), user1.getMaster(), user2.getMaster())
if flag_col == 1:
#print "--> Co-located!", user1.getId(), user2.getId()
cocounter+=1
else:
print "--> Not Co-located!", user1.getId(), user2.getId()
move_flag=0
if flag_col == 0:
# Configuration 1
added_replicas1 += functions.config1(user1, user2, col_fam_replica, col_fam_mse, move_flag)
# Configuration 2
added_replicas2 += functions.config2_3(user1, user2, col_fam_mme, col_fam_replica, col_fam_mse, col_fam_master, 'master1', 'master2', total_replicas, move_flag,total_servers)
# Configuration 3
added_replicas3 += functions.config2_3(user2, user1, col_fam_mme, col_fam_replica, col_fam_mse, col_fam_master, 'master1', 'master2', total_replicas, move_flag,total_servers)
print "replicas(%d,%d,%d)" %(added_replicas1,added_replicas2,added_replicas3)
# Find minimum amount of added replicas
replicas = [added_replicas1,added_replicas2,added_replicas3]
value = replicas.index(min(replicas))
move_flag=1
if(value == 0): # Configuration 1
total_replicas_needed+= replicas[0]
functions.config1(user1, user2, col_fam_replica, col_fam_mse, move_flag)
elif(value == 1): # Configuration 2
total_replicas_needed+= replicas[1]
functions.config2_3(user1, user2, col_fam_mme, col_fam_replica, col_fam_mse, col_fam_master, 'master1', 'master2', total_replicas, move_flag,total_servers)
else: # Configuration 3
total_replicas_needed+= replicas[2]
functions.config2_3(user2, user1, col_fam_mme, col_fam_replica, col_fam_mse, col_fam_master, 'master2', 'master1', total_replicas, move_flag,total_servers)
t2 = datetime.now()
delta = t2 - t1 # The result is a timedelta object
print "total edges: %d" %edge_count
print "total time elapsed: ",str(delta)[:-4]
print "total replicas added: %d" %total_replicas_needed
print "co-counter=%d" %cocounter