Skip to content

Commit 2d48942

Browse files
committed
Update insert error
1 parent c1510b1 commit 2d48942

File tree

10 files changed

+367
-296
lines changed

10 files changed

+367
-296
lines changed

scripts/insert_errors_to_db.py

Lines changed: 90 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -56,47 +56,96 @@ def get_db_connection(mainnet=False):
5656
print(f"❌ Failed to connect to DB: {e}")
5757
continue
5858

59-
for ka_label in errors:
60-
row = {
61-
'node_name': node_name,
62-
'blockchain_id': blockchain_name,
63-
'ka_label': ka_label,
64-
'publish_error': None,
65-
'query_error': None,
66-
'publisher_get_error': None,
67-
'non_publisher_get_error': None,
68-
'time_stamp': errors[ka_label].get('time_stamp') if isinstance(errors[ka_label], dict) else None,
69-
}
70-
71-
label = ka_label.lower()
72-
if 'publish' in label:
73-
row['publish_error'] = ka_label
74-
elif 'query' in label:
75-
row['query_error'] = ka_label
76-
elif 'local get' in label:
77-
row['publisher_get_error'] = ka_label
78-
elif 'get' in label:
79-
row['non_publisher_get_error'] = ka_label
80-
81-
insert_query = sql.SQL(f"""
82-
INSERT INTO {sql.Identifier(table_name).string} (
83-
node_name, blockchain_id, ka_label,
84-
publish_error, query_error,
85-
publisher_get_error, non_publisher_get_error,
86-
time_stamp
87-
) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)
88-
""")
89-
90-
try:
91-
cursor.execute(insert_query, (
92-
row['node_name'], row['blockchain_id'], row['ka_label'],
93-
row['publish_error'], row['query_error'],
94-
row['publisher_get_error'], row['non_publisher_get_error'],
95-
row['time_stamp']
96-
))
97-
print(f"✅ Inserted KA {ka_label} for {node_name}")
98-
except Exception as e:
99-
print(f"❌ Failed to insert KA {ka_label}: {e}")
59+
for attempt_key, attempt_data in errors.items():
60+
# Handle both old and new error formats
61+
if isinstance(attempt_data, dict) and 'ka_label' in attempt_data:
62+
# New format with structured error data per attempt
63+
ka_label = attempt_data.get('ka_label', 'Unknown KA')
64+
attempt_number = attempt_data.get('attempt', 1)
65+
publish_error = attempt_data.get('publish_error')
66+
query_error = attempt_data.get('query_error')
67+
publisher_get_error = attempt_data.get('publisher_get_error')
68+
non_publisher_get_error = attempt_data.get('non_publisher_get_error')
69+
time_stamp = attempt_data.get('time_stamp')
70+
71+
# Only insert if there's at least one error
72+
if any([publish_error, query_error, publisher_get_error, non_publisher_get_error]):
73+
row = {
74+
'node_name': node_name,
75+
'blockchain_id': blockchain_name,
76+
'ka_label': ka_label,
77+
'publish_error': publish_error,
78+
'query_error': query_error,
79+
'publisher_get_error': publisher_get_error,
80+
'non_publisher_get_error': non_publisher_get_error,
81+
'time_stamp': time_stamp,
82+
}
83+
84+
insert_query = sql.SQL(f"""
85+
INSERT INTO {sql.Identifier(table_name).string} (
86+
node_name, blockchain_id, ka_label,
87+
publish_error, query_error,
88+
publisher_get_error, non_publisher_get_error,
89+
time_stamp
90+
) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)
91+
""")
92+
93+
try:
94+
cursor.execute(insert_query, (
95+
row['node_name'], row['blockchain_id'], row['ka_label'],
96+
row['publish_error'], row['query_error'],
97+
row['publisher_get_error'], row['non_publisher_get_error'],
98+
row['time_stamp']
99+
))
100+
print(f"✅ Inserted {ka_label} (attempt {attempt_number}) for {node_name}")
101+
except Exception as e:
102+
print(f"❌ Failed to insert {ka_label} (attempt {attempt_number}): {e}")
103+
else:
104+
# Old format - simple count (backward compatibility)
105+
ka_label = attempt_key
106+
error_message = attempt_data if isinstance(attempt_data, str) else str(attempt_data)
107+
108+
row = {
109+
'node_name': node_name,
110+
'blockchain_id': blockchain_name,
111+
'ka_label': ka_label,
112+
'publish_error': None,
113+
'query_error': None,
114+
'publisher_get_error': None,
115+
'non_publisher_get_error': None,
116+
'time_stamp': None,
117+
}
118+
119+
# Try to determine error type from the key or message
120+
label = attempt_key.lower()
121+
if 'publish' in label:
122+
row['publish_error'] = error_message
123+
elif 'query' in label:
124+
row['query_error'] = error_message
125+
elif 'local get' in label:
126+
row['publisher_get_error'] = error_message
127+
elif 'get' in label:
128+
row['non_publisher_get_error'] = error_message
129+
130+
insert_query = sql.SQL(f"""
131+
INSERT INTO {sql.Identifier(table_name).string} (
132+
node_name, blockchain_id, ka_label,
133+
publish_error, query_error,
134+
publisher_get_error, non_publisher_get_error,
135+
time_stamp
136+
) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)
137+
""")
138+
139+
try:
140+
cursor.execute(insert_query, (
141+
row['node_name'], row['blockchain_id'], row['ka_label'],
142+
row['publish_error'], row['query_error'],
143+
row['publisher_get_error'], row['non_publisher_get_error'],
144+
row['time_stamp']
145+
))
146+
print(f"✅ Inserted {ka_label} for {node_name} (old format)")
147+
except Exception as e:
148+
print(f"❌ Failed to insert {ka_label}: {e}")
100149

101150
try:
102151
conn.commit()

scripts/print_aggregated_errors.py

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,8 +182,36 @@ def print_all_errors():
182182

183183
if errors:
184184
print(f"🔧 {node_name}")
185-
for error_key, count in errors.items():
186-
print(f" • {count}x {error_key}")
185+
for attempt_key, attempt_data in errors.items():
186+
# Handle both old and new error formats
187+
if isinstance(attempt_data, dict) and 'ka_label' in attempt_data:
188+
# New format with structured error data per attempt
189+
ka_label = attempt_data.get('ka_label', 'Unknown KA')
190+
attempt_number = attempt_data.get('attempt', 1)
191+
publish_error = attempt_data.get('publish_error')
192+
query_error = attempt_data.get('query_error')
193+
publisher_get_error = attempt_data.get('publisher_get_error')
194+
non_publisher_get_error = attempt_data.get('non_publisher_get_error')
195+
196+
# Show which errors occurred for this attempt
197+
error_types = []
198+
if publish_error:
199+
error_types.append("publish")
200+
if query_error:
201+
error_types.append("query")
202+
if publisher_get_error:
203+
error_types.append("local get")
204+
if non_publisher_get_error:
205+
error_types.append("remote get")
206+
207+
if error_types:
208+
print(f" • {ka_label} (attempt {attempt_number}): {', '.join(error_types)} errors")
209+
else:
210+
print(f" • {ka_label} (attempt {attempt_number}): no errors")
211+
else:
212+
# Old format - simple count
213+
count = attempt_data if isinstance(attempt_data, int) else 1
214+
print(f" • {count}x {attempt_key}")
187215
print()
188216
else:
189217
print(f"✅ {node_name}: No errors\n")

tests/mainnet/Base_Mainnet.py

Lines changed: 32 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -75,17 +75,23 @@ def get_random_content(node_name):
7575
}
7676
}
7777

78-
def log_error(error, node_name, step='unknown', remote_node=None):
79-
print(f"\n❌ Error on {node_name} during {step}")
80-
print(f"🔺 Type: {type(error).__name__}")
81-
print(f"🧵 Message: {str(error)}")
82-
tb = traceback.extract_tb(sys.exc_info()[2])
83-
user_tb = [entry for entry in tb if "site-packages" not in entry.filename]
84-
if user_tb:
85-
last = user_tb[-1]
86-
print(f"📍 Location: {last.filename}, line {last.lineno}, in {last.name}")
87-
88-
# Create a cleaner error message for grouping
78+
def log_error(error, node_name, step='unknown', remote_node=None, ka_number=None, attempt_number=None):
79+
# Unique key for each KA attempt
80+
attempt_key = f"KA #{ka_number} - attempt {attempt_number}" if ka_number and attempt_number else f"KA #{ka_number}"
81+
if node_name not in error_stats:
82+
error_stats[node_name] = {}
83+
if attempt_key not in error_stats[node_name]:
84+
error_stats[node_name][attempt_key] = {
85+
"ka_label": f"KA #{ka_number}" if ka_number else "Unknown KA",
86+
"attempt": attempt_number,
87+
"publish_error": None,
88+
"query_error": None,
89+
"publisher_get_error": None,
90+
"non_publisher_get_error": None,
91+
"time_stamp": datetime.utcnow().isoformat()
92+
}
93+
# Determine which error column to update
94+
error_message = str(error)
8995
if isinstance(error, TimeoutError) or isinstance(error, concurrent.futures.TimeoutError):
9096
error_message = f"Timeout after 3 minutes during {step}"
9197
else:
@@ -98,40 +104,27 @@ def log_error(error, node_name, step='unknown', remote_node=None):
98104
error_message = str(error)
99105
except Exception:
100106
error_message = str(error)
101-
102107
error_message = error_message.splitlines()[0][:100]
103-
104-
# Create a generic key that groups similar errors
105-
if remote_node:
106-
key = f"{step}{type(error).__name__}: {error_message} on {remote_node}"
107-
else:
108-
key = f"{step}{type(error).__name__}: {error_message}"
109-
110-
# Store errors in the global error_stats for this node
111-
if node_name not in error_stats:
112-
error_stats[node_name] = {}
113-
114-
if key in error_stats[node_name]:
115-
error_stats[node_name][key] += 1
116-
else:
117-
error_stats[node_name][key] = 1
118-
108+
if step == "publishing":
109+
error_stats[node_name][attempt_key]["publish_error"] = error_message
110+
elif step == "querying":
111+
error_stats[node_name][attempt_key]["query_error"] = error_message
112+
elif step == "local get":
113+
error_stats[node_name][attempt_key]["publisher_get_error"] = error_message
114+
elif step == "get":
115+
error_stats[node_name][attempt_key]["non_publisher_get_error"] = error_message
116+
# Always update timestamp to first error for this attempt
117+
if not error_stats[node_name][attempt_key]["time_stamp"]:
118+
error_stats[node_name][attempt_key]["time_stamp"] = datetime.utcnow().isoformat()
119119
# Write to individual node error file (parallel-safe)
120120
node_error_file = f"test_output/errors_{node_name.replace(' ', '_')}.json"
121121
os.makedirs("test_output", exist_ok=True)
122-
123-
# Use the in-memory error_stats as the source of truth for this node
124-
# This ensures we only track errors from the current test run
125122
node_errors = error_stats.get(node_name, {}).copy()
126-
127-
# Add blockchain information to the error file for database processing
128123
error_data = {
129124
"blockchain_name": BLOCKCHAIN,
130125
"node_name": node_name,
131126
"errors": node_errors
132127
}
133-
134-
# Save current state to individual node file
135128
with open(node_error_file, 'w') as f:
136129
json.dump(error_data, f, indent=2)
137130

@@ -181,7 +174,7 @@ def run_test_for_node(node, index):
181174
publish_success += 1
182175
publish_times.append(end - start)
183176
except Exception as e:
184-
log_error(e, name, "publishing")
177+
log_error(e, name, "publishing", ka_number=i + 1, attempt_number=i + 1)
185178
ual = "did:dkg:base:8453/0xc28f310a87f7621a087a603e2ce41c22523f11d7/120278"
186179
print(f"⚠️ Using fallback UAL: {ual}")
187180
failed_assets.append(f"KA #{i + 1} (Publish failed — No UAL)")
@@ -203,7 +196,7 @@ def run_test_for_node(node, index):
203196
query_success += 1
204197
query_times.append(end - start)
205198
except Exception as e:
206-
log_error(e, name, "querying")
199+
log_error(e, name, "querying", ka_number=i + 1, attempt_number=i + 1)
207200
query_fail += 1
208201
failed_assets.append(f"KA #{i + 1} (Query failed — UAL: {ual})")
209202

@@ -216,7 +209,7 @@ def run_test_for_node(node, index):
216209
local_get_success += 1
217210
local_get_times.append(end - start)
218211
except Exception as e:
219-
log_error(e, name, "local get")
212+
log_error(e, name, "local get", ka_number=i + 1, attempt_number=i + 1)
220213
local_get_fail += 1
221214
failed_assets.append(f"KA #{i + 1} (Local Get failed — UAL: {ual})")
222215

@@ -247,7 +240,7 @@ def run_test_for_node(node, index):
247240
remote_get_success += 1
248241
remote_get_times.append(end - start)
249242
except Exception as e:
250-
log_error(e, name, "get", remote_name)
243+
log_error(e, name, "get", remote_name, ka_number=i + 1, attempt_number=i + 1)
251244
remote_get_fail += 1
252245
failed_assets.append(f"KA #{i + 1} (Get failed — UAL: {ual})")
253246

0 commit comments

Comments
 (0)