77from prime_backup .constants import chunk_constants
88from prime_backup .db import schema
99from prime_backup .db .session import DbSession
10- from prime_backup .utils import chunk_utils , collection_utils
10+ from prime_backup .utils import chunk_utils
1111from prime_backup .utils .time_cost_stats import TimeCostStats
1212
13-
1413_dummy_chunk_costs : TimeCostStats [CreateBackupTimeCostKey ] = TimeCostStats ()
1514
1615
@@ -81,30 +80,39 @@ def create_chunk_groups(self, blob: schema.Blob, blob_chunks: Dict[int, ChunkLik
8180
8281 # create new chunk groups
8382 with self .__time_costs .measure_time_cost (CreateBackupTimeCostKey .kind_db ):
84- known_chunk_groups = collection_utils .no_none_dict (self .session .get_chunk_groups_by_hashes ([rcg .hash for rcg in raw_chunk_groups ]))
83+ known_chunk_group_hash_to_id = self .session .get_chunk_group_ids_by_hashes_opt ([rcg .hash for rcg in raw_chunk_groups ])
84+ new_chunk_groups : List [schema .ChunkGroup ] = []
8585 new_chunk_group_hashes : List [str ] = []
8686 for cg_hash , cg_chunks in chunk_group_hashes_to_chunks .items ():
87- if cg_hash not in known_chunk_groups :
87+ if known_chunk_group_hash_to_id [ cg_hash ] is None :
8888 new_chunk_group = self .session .create_and_add_chunk_group (
8989 hash = cg_hash ,
9090 chunk_count = len (cg_chunks ),
9191 chunk_raw_size_sum = sum (chunk .raw_size for chunk in cg_chunks ),
9292 chunk_stored_size_sum = sum ({chunk .hash : chunk .stored_size for chunk in cg_chunks }.values ()),
9393 )
94- known_chunk_groups [ cg_hash ] = new_chunk_group
94+ new_chunk_groups . append ( new_chunk_group )
9595 new_chunk_group_hashes .append (new_chunk_group .hash )
9696 if len (new_chunk_group_hashes ) > 0 :
9797 with self .__time_costs .measure_time_cost (CreateBackupTimeCostKey .kind_db ):
9898 self .session .flush () # creates chunk_group.id
99+ known_chunk_group_hash_to_id .update ({
100+ new_chunk_group .hash : new_chunk_group .id
101+ for new_chunk_group in new_chunk_groups
102+ })
103+ for cg_hash , cg_id in known_chunk_group_hash_to_id .items ():
104+ if cg_id is None :
105+ raise AssertionError ('chunk group id for hash {} still not exists' .format (cg_hash ))
99106
100107 # create bindings for new chunk groups
101108 chunk_group_chunk_binding_rows : List [DbSession .CreateChunkGroupChunkBindingKwargs ] = []
102109 for cg_hash in new_chunk_group_hashes :
103- new_chunk_group = known_chunk_groups [cg_hash ]
110+ chunk_group_id = known_chunk_group_hash_to_id [cg_hash ]
111+ assert chunk_group_id is not None
104112 offset = 0
105113 for chunk in chunk_group_hashes_to_chunks [cg_hash ]:
106114 chunk_group_chunk_binding_rows .append ({
107- 'chunk_group_id' : new_chunk_group . id ,
115+ 'chunk_group_id' : chunk_group_id ,
108116 'chunk_offset' : offset ,
109117 'chunk_id' : chunk .id ,
110118 })
@@ -113,11 +121,12 @@ def create_chunk_groups(self, blob: schema.Blob, blob_chunks: Dict[int, ChunkLik
113121
114122 # create binding for the blob
115123 for raw_chunk_group in raw_chunk_groups :
116- db_chunk_group = known_chunk_groups [raw_chunk_group .hash ]
124+ chunk_group_id = known_chunk_group_hash_to_id [raw_chunk_group .hash ]
125+ assert chunk_group_id is not None
117126 self .session .create_and_add_blob_chunk_group_binding (
118127 blob_id = blob .id ,
119128 chunk_group_offset = raw_chunk_group .offset ,
120- chunk_group_id = db_chunk_group . id ,
129+ chunk_group_id = chunk_group_id ,
121130 )
122131
123132 # end
0 commit comments