@@ -47,7 +47,7 @@ impl<const N: usize> Clone for GitNodeStorage<N> {
4747 let cloned = Self {
4848 _repository : self . _repository . clone ( ) ,
4949 cache : Mutex :: new ( LruCache :: new ( DEFAULT_CACHE_SIZE ) ) ,
50- configs : Mutex :: new ( HashMap :: new ( ) ) ,
50+ configs : Mutex :: new ( self . configs . lock ( ) . clone ( ) ) ,
5151 hash_to_object_id : Mutex :: new ( HashMap :: new ( ) ) ,
5252 dataset_dir : self . dataset_dir . clone ( ) ,
5353 } ;
@@ -440,6 +440,33 @@ mod tests {
440440 assert ! ( cached. is_some( ) ) ;
441441 }
442442
443+ #[ test]
444+ fn clone_preserves_memory_only_tree_config ( ) {
445+ let ( temp_dir, repo) = create_test_repo ( ) ;
446+ let dataset_dir = temp_dir. path ( ) . join ( "dataset" ) ;
447+ std:: fs:: create_dir_all ( & dataset_dir) . unwrap ( ) ;
448+ let storage = GitNodeStorage :: < 32 > :: new ( repo, dataset_dir. clone ( ) ) . unwrap ( ) ;
449+ let config = br#"{"root_hash":null}"# ;
450+
451+ storage. save_config ( "tree_config" , config) ;
452+ assert_eq ! (
453+ storage. get_config( "tree_config" ) . as_deref( ) ,
454+ Some ( & config[ ..] )
455+ ) ;
456+ assert ! (
457+ !dataset_dir. join( "prolly_config_tree_config" ) . exists( ) ,
458+ "tree_config is intentionally memory-only for GitNodeStorage"
459+ ) ;
460+
461+ let cloned = storage. clone ( ) ;
462+
463+ assert_eq ! (
464+ cloned. get_config( "tree_config" ) . as_deref( ) ,
465+ Some ( & config[ ..] ) ,
466+ "cloning GitNodeStorage must preserve memory-only tree_config"
467+ ) ;
468+ }
469+
443470 #[ test]
444471 fn failed_insert_does_not_populate_cache ( ) {
445472 let ( temp_dir, repo) = create_test_repo ( ) ;
0 commit comments