def _process_repair_entries(index, source_node_name, req_socket): log = logging.getLogger("_process_repair_entries") repair_file_path = compute_data_repair_file_path() log.debug("opening {0}".format(repair_file_path)) repair_file = gzip.GzipFile(filename=repair_file_path, mode="rb") record_number = 0 while True: try: row_key, segment_status, segment_data = \ retrieve_sized_pickle(repair_file) except EOFError: log.debug("EOF at record number {0}".format(record_number)) repair_file.close() return record_number damaged_sequence_numbers = list() for segment_row in segment_data: damaged_sequence_numbers.extend( segment_row["damaged_sequence_numbers"]) segment_row = segment_data[index] record_number += 1 result = {"record_number" : record_number, "action" : None, "part" : None, "zfec_padding_size" : None, "source_node_name" : source_node_name, "segment_num" : segment_row["segment_num"], "result" : None, "data" : None,} expected_slice_count = \ compute_expected_slice_count(segment_row["file_size"]) for sequence_num in range(0, expected_slice_count): result["data"] = None if sequence_num in damaged_sequence_numbers: log.debug("{0} damaged sequence {1}".format(row_key, sequence_num)) result["action"] = "read" result["part"] = _compute_part_label(sequence_num, expected_slice_count) try: result["zfec_padding_size"], data = \ _get_sequence_from_data_reader(req_socket, segment_row, sequence_num) except Exception as instance: log.exception("record #{0} sequence {1} {2}".format( record_number, sequence_num, instance)) result["result"] = "error" else: result["result"] = "success" result["data"] = data else: result["action"] = "skip" result["result"] = None unified_id, conjoined_part = row_key sequence_key = (unified_id, conjoined_part, sequence_num, segment_row["segment_num"]) log.debug("storing {0} {1}".format(sequence_key, result["action"])) store_sized_pickle((sequence_key, segment_status, result, ), sys.stdout.buffer)
def audit_segments(halt_event, work_dir): log = logging.getLogger("audit_segments") if not os.path.exists(anti_entropy_dir): log.info("creating {0}".format(anti_entropy_dir)) os.mkdir(anti_entropy_dir) meta_repair_file_path = compute_meta_repair_file_path() meta_repair_file = \ gzip.GzipFile(filename=meta_repair_file_path, mode="wb") data_repair_file_path = compute_data_repair_file_path() data_repair_file = \ gzip.GzipFile(filename=data_repair_file_path, mode="wb") counts = { "total" : 0, anti_entropy_missing_replicas : 0, anti_entropy_incomplete_finalization : 0, anti_entropy_damaged_records : 0, anti_entropy_missing_tombstones : 0, anti_entropy_database_inconsistancy : 0, } current_time = create_timestamp() min_segment_age = parse_timedelta_str(_min_segment_age) newest_allowable_timestamp = current_time - min_segment_age log.info("newest allowable timestamp = {0}".format( newest_allowable_timestamp.isoformat())) for row_key, segment_status, segment_data in generate_work(work_dir): if halt_event.is_set(): log.info("halt_event is set: exiting") return assert segment_status == anti_entropy_pre_audit counts["total"] += 1 # missing replicas needs to run first, because the other tests # assume there are no missing replicas if _missing_replicas(segment_data, newest_allowable_timestamp): log.debug("missing_replicas {0}".format(row_key)) counts[anti_entropy_missing_replicas] += 1 store_sized_pickle( (row_key, anti_entropy_missing_replicas, segment_data, ), data_repair_file) continue # _missing_tombstones needs to run ahead of _incomplete_finalization if _missing_tombstones(segment_data, newest_allowable_timestamp): log.debug("missing_tombstones {0}".format(row_key)) counts[anti_entropy_missing_tombstones] += 1 store_sized_pickle( (row_key, anti_entropy_missing_tombstones, segment_data, ), meta_repair_file) continue if _incomplete_finalization(segment_data, newest_allowable_timestamp): log.debug("incomplete_finalization {0}".format(row_key)) counts[anti_entropy_incomplete_finalization] += 1 store_sized_pickle( (row_key, anti_entropy_incomplete_finalization, segment_data,), data_repair_file) continue if _damaged_records(segment_data): log.debug("damaged_records {0}".format(row_key)) counts[anti_entropy_damaged_records] += 1 store_sized_pickle( (row_key, anti_entropy_damaged_records, segment_data,), data_repair_file) continue if _database_inconsistancy(row_key, segment_data): log.debug("database_inconsistancy {0}".format(row_key)) counts[anti_entropy_database_inconsistancy] += 1 store_sized_pickle( (row_key, anti_entropy_database_inconsistency, segment_data,), data_repair_file) continue meta_repair_file.close() data_repair_file.close() keys = ["total", anti_entropy_missing_replicas, anti_entropy_incomplete_finalization, anti_entropy_damaged_records, anti_entropy_missing_tombstones, anti_entropy_database_inconsistancy] for key in keys: log.info("{0} {1:,}".format(key, counts[key]))
def audit_segments(halt_event, work_dir): log = logging.getLogger("audit_segments") if not os.path.exists(anti_entropy_dir): log.info("creating {0}".format(anti_entropy_dir)) os.mkdir(anti_entropy_dir) meta_repair_file_path = compute_meta_repair_file_path() meta_repair_file = \ gzip.GzipFile(filename=meta_repair_file_path, mode="wb") data_repair_file_path = compute_data_repair_file_path() data_repair_file = \ gzip.GzipFile(filename=data_repair_file_path, mode="wb") counts = { "total": 0, anti_entropy_missing_replicas: 0, anti_entropy_incomplete_finalization: 0, anti_entropy_damaged_records: 0, anti_entropy_missing_tombstones: 0, anti_entropy_database_inconsistancy: 0, } current_time = create_timestamp() min_segment_age = parse_timedelta_str(_min_segment_age) newest_allowable_timestamp = current_time - min_segment_age log.info("newest allowable timestamp = {0}".format( newest_allowable_timestamp.isoformat())) for row_key, segment_status, segment_data in generate_work(work_dir): if halt_event.is_set(): log.info("halt_event is set: exiting") return assert segment_status == anti_entropy_pre_audit counts["total"] += 1 # missing replicas needs to run first, because the other tests # assume there are no missing replicas if _missing_replicas(segment_data, newest_allowable_timestamp): log.debug("missing_replicas {0}".format(row_key)) counts[anti_entropy_missing_replicas] += 1 store_sized_pickle(( row_key, anti_entropy_missing_replicas, segment_data, ), data_repair_file) continue # _missing_tombstones needs to run ahead of _incomplete_finalization if _missing_tombstones(segment_data, newest_allowable_timestamp): log.debug("missing_tombstones {0}".format(row_key)) counts[anti_entropy_missing_tombstones] += 1 store_sized_pickle(( row_key, anti_entropy_missing_tombstones, segment_data, ), meta_repair_file) continue if _incomplete_finalization(segment_data, newest_allowable_timestamp): log.debug("incomplete_finalization {0}".format(row_key)) counts[anti_entropy_incomplete_finalization] += 1 store_sized_pickle(( row_key, anti_entropy_incomplete_finalization, segment_data, ), data_repair_file) continue if _damaged_records(segment_data): log.debug("damaged_records {0}".format(row_key)) counts[anti_entropy_damaged_records] += 1 store_sized_pickle(( row_key, anti_entropy_damaged_records, segment_data, ), data_repair_file) continue if _database_inconsistancy(row_key, segment_data): log.debug("database_inconsistancy {0}".format(row_key)) counts[anti_entropy_database_inconsistancy] += 1 store_sized_pickle(( row_key, anti_entropy_database_inconsistency, segment_data, ), data_repair_file) continue meta_repair_file.close() data_repair_file.close() keys = [ "total", anti_entropy_missing_replicas, anti_entropy_incomplete_finalization, anti_entropy_damaged_records, anti_entropy_missing_tombstones, anti_entropy_database_inconsistancy ] for key in keys: log.info("{0} {1:,}".format(key, counts[key]))