@@ -9,7 +9,7 @@ use dashmap::DashMap;
99use linera_base:: prometheus_util:: MeasureLatency as _;
1010use linera_base:: {
1111 crypto:: CryptoHash ,
12- data_types:: { Blob , Epoch , NetworkDescription , TimeDelta , Timestamp } ,
12+ data_types:: { Blob , NetworkDescription , TimeDelta , Timestamp } ,
1313 identifiers:: { ApplicationId , BlobId , ChainId , EventId , IndexAndEvent , StreamId } ,
1414} ;
1515use linera_chain:: {
@@ -696,35 +696,13 @@ where
696696 Ok ( ( ) )
697697 }
698698
699- async fn maybe_write_blob_state (
700- & self ,
701- blob_id : BlobId ,
702- blob_state : BlobState ,
703- ) -> Result < Epoch , ViewError > {
704- let current_blob_state = self . read_blob_state ( blob_id) . await ?;
705- let ( should_write, latest_epoch) = match current_blob_state {
706- Some ( current_blob_state) => (
707- current_blob_state. epoch < blob_state. epoch ,
708- current_blob_state. epoch . max ( blob_state. epoch ) ,
709- ) ,
710- None => ( true , blob_state. epoch ) ,
711- } ;
712-
713- if should_write {
714- self . write_blob_state ( blob_id, & blob_state) . await ?;
715- }
716-
717- Ok ( latest_epoch)
718- }
719-
720699 async fn maybe_write_blob_states (
721700 & self ,
722701 blob_ids : & [ BlobId ] ,
723702 blob_state : BlobState ,
724- overwrite : bool ,
725- ) -> Result < Vec < Epoch > , ViewError > {
703+ ) -> Result < ( ) , ViewError > {
726704 if blob_ids. is_empty ( ) {
727- return Ok ( Vec :: new ( ) ) ;
705+ return Ok ( ( ) ) ;
728706 }
729707 let blob_state_keys = blob_ids
730708 . iter ( )
@@ -734,36 +712,22 @@ where
734712 . store
735713 . read_multi_values :: < BlobState > ( blob_state_keys)
736714 . await ?;
737- let mut latest_epochs = Vec :: new ( ) ;
738715 let mut batch = Batch :: new ( ) ;
739- let mut need_write = false ;
740716 for ( maybe_blob_state, blob_id) in maybe_blob_states. iter ( ) . zip ( blob_ids) {
741- let ( should_write, latest_epoch) = match maybe_blob_state {
742- None => ( true , blob_state. epoch ) ,
743- Some ( current_blob_state) => (
744- overwrite && current_blob_state. epoch < blob_state. epoch ,
745- current_blob_state. epoch . max ( blob_state. epoch ) ,
746- ) ,
747- } ;
748- if should_write {
749- batch. add_blob_state ( * blob_id, & blob_state) ?;
750- need_write = true ;
717+ match maybe_blob_state {
718+ None => {
719+ batch. add_blob_state ( * blob_id, & blob_state) ?;
720+ }
721+ Some ( state) => {
722+ if state. epoch < blob_state. epoch {
723+ batch. add_blob_state ( * blob_id, & blob_state) ?;
724+ }
725+ }
751726 }
752- latest_epochs. push ( latest_epoch) ;
753- }
754- if need_write {
755- self . write_batch ( batch) . await ?;
756727 }
757- Ok ( latest_epochs)
758- }
759-
760- async fn write_blob_state (
761- & self ,
762- blob_id : BlobId ,
763- blob_state : & BlobState ,
764- ) -> Result < ( ) , ViewError > {
765- let mut batch = Batch :: new ( ) ;
766- batch. add_blob_state ( blob_id, blob_state) ?;
728+ // We tolerate race conditions because two active chains are likely to
729+ // be both from the latest epoch, and otherwise failing to pick the
730+ // more recent blob state has limited impact.
767731 self . write_batch ( batch) . await ?;
768732 Ok ( ( ) )
769733 }
@@ -997,6 +961,9 @@ where
997961 }
998962
999963 async fn write_batch ( & self , batch : Batch ) -> Result < ( ) , ViewError > {
964+ if batch. key_value_bytes . is_empty ( ) {
965+ return Ok ( ( ) ) ;
966+ }
1000967 let mut futures = Vec :: new ( ) ;
1001968 for ( key, bytes) in batch. key_value_bytes . into_iter ( ) {
1002969 let store = self . store . clone ( ) ;
0 commit comments