@@ -85,6 +85,7 @@ void MutableCsr<EDATA_T>::Open(Checkpoint& ckp,
8585 " but degree list implies " + std::to_string (edge_count) +
8686 " , desc: " + descriptor.ToJsonString ());
8787 }
88+ needs_compact_.store (false , std::memory_order_relaxed);
8889 refresh_prefetch_policy ();
8990}
9091
@@ -171,6 +172,9 @@ void MutableCsr<EDATA_T>::Dump(Checkpoint& ckp, CheckpointManifest& meta,
171172
172173template <typename EDATA_T >
173174void MutableCsr<EDATA_T >::compact() {
175+ if (!needs_compact_.load (std::memory_order_relaxed)) {
176+ return ;
177+ }
174178 // Remove deleted edges and reset timestamps on surviving edges.
175179 size_t vnum = vertex_capacity ();
176180 auto ** buf_arr = reinterpret_cast <nbr_t **>(adj_list_buffer_->GetData ());
@@ -209,6 +213,7 @@ void MutableCsr<EDATA_T>::compact() {
209213 std::to_string (edge_num_.load ()) + " , actual " +
210214 std::to_string (total_edge_num));
211215 }
216+ needs_compact_.store (false , std::memory_order_relaxed);
212217}
213218
214219template <typename EDATA_T >
@@ -278,6 +283,9 @@ void MutableCsr<EDATA_T>::batch_sort_by_edge_data(timestamp_t ts) {
278283template <typename EDATA_T >
279284void MutableCsr<EDATA_T >::batch_delete_vertices(
280285 const std::set<vid_t >& src_set, const std::set<vid_t >& dst_set) {
286+ if (!src_set.empty () || !dst_set.empty ()) {
287+ needs_compact_.store (true , std::memory_order_relaxed);
288+ }
281289 vid_t vnum = static_cast <vid_t >(vertex_capacity ());
282290 auto ** buf_arr = reinterpret_cast <nbr_t **>(adj_list_buffer_->GetData ());
283291 auto * sz_arr = reinterpret_cast <std::atomic<int >*>(degree_list_->GetData ());
@@ -333,6 +341,9 @@ void MutableCsr<EDATA_T>::batch_delete_vertices(
333341template <typename EDATA_T >
334342void MutableCsr<EDATA_T >::batch_delete_edges(
335343 const std::vector<vid_t >& src_list, const std::vector<vid_t >& dst_list) {
344+ if (!src_list.empty ()) {
345+ needs_compact_.store (true , std::memory_order_relaxed);
346+ }
336347 std::map<vid_t , std::set<vid_t >> src_dst_map;
337348 vid_t vnum = static_cast <vid_t >(vertex_capacity ());
338349 for (size_t i = 0 ; i < src_list.size (); ++i) {
@@ -367,6 +378,9 @@ void MutableCsr<EDATA_T>::batch_delete_edges(
367378template <typename EDATA_T >
368379void MutableCsr<EDATA_T >::batch_delete_edges(
369380 const std::vector<std::pair<vid_t , int32_t >>& edges) {
381+ if (!edges.empty ()) {
382+ needs_compact_.store (true , std::memory_order_relaxed);
383+ }
370384 std::map<vid_t , std::set<int32_t >> src_offset_map;
371385 vid_t vnum = static_cast <vid_t >(vertex_capacity ());
372386 auto * sz_arr = reinterpret_cast <std::atomic<int >*>(degree_list_->GetData ());
@@ -413,6 +427,7 @@ void MutableCsr<EDATA_T>::delete_edge(vid_t src, int32_t offset,
413427 if (old_ts <= ts) {
414428 nbrs[offset].timestamp .store (std::numeric_limits<timestamp_t >::max ());
415429 edge_num_.fetch_sub (1 , std::memory_order_relaxed);
430+ needs_compact_.store (true , std::memory_order_relaxed);
416431 unsorted_since_ = 0 ;
417432 } else if (old_ts == std::numeric_limits<timestamp_t >::max ()) {
418433 LOG (ERROR ) << " Attempting to delete already deleted edge." ;
@@ -442,6 +457,9 @@ void MutableCsr<EDATA_T>::revert_delete_edge(vid_t src, vid_t nbr,
442457 assert (nbrs[offset].neighbor == nbr);
443458 nbrs[offset].timestamp .store (ts);
444459 edge_num_.fetch_add (1 , std::memory_order_relaxed);
460+ if (ts != 0 ) {
461+ needs_compact_.store (true , std::memory_order_relaxed);
462+ }
445463 } else {
446464 THROW_INVALID_ARGUMENT_EXCEPTION (
447465 " Attempting to revert delete on edge that is not deleted." );
@@ -519,6 +537,9 @@ void MutableCsr<EDATA_T>::batch_put_edges(const std::vector<vid_t>& src_list,
519537 added_edge_num++;
520538 }
521539 edge_num_.fetch_add (added_edge_num, std::memory_order_relaxed);
540+ if (ts != 0 && added_edge_num > 0 ) {
541+ needs_compact_.store (true , std::memory_order_relaxed);
542+ }
522543 // invalidate sort flag
523544 if (ts < unsorted_since_) {
524545 unsorted_since_ = 0 ;
@@ -535,6 +556,7 @@ void SingleMutableCsr<EDATA_T>::Open(Checkpoint& ckp,
535556 nbr_list_ = std::shared_ptr<IDataContainer>(ckp.OpenFile (
536557 descriptor.get_path (ModuleDescriptor::kNbrListPath ).value_or (" " ), level));
537558 edge_num_.store (std::stoull (descriptor.get (" edge_num" ).value_or (" 0" )));
559+ needs_compact_.store (false , std::memory_order_relaxed);
538560 refresh_prefetch_policy ();
539561}
540562
@@ -558,6 +580,9 @@ void SingleMutableCsr<EDATA_T>::Dump(Checkpoint& ckp, CheckpointManifest& meta,
558580
559581template <typename EDATA_T >
560582void SingleMutableCsr<EDATA_T >::compact() {
583+ if (!needs_compact_.load (std::memory_order_relaxed)) {
584+ return ;
585+ }
561586 if (!nbr_list_) {
562587 return ;
563588 }
@@ -568,6 +593,7 @@ void SingleMutableCsr<EDATA_T>::compact() {
568593 data[i].timestamp .store (0 , std::memory_order_relaxed);
569594 }
570595 }
596+ needs_compact_.store (false , std::memory_order_relaxed);
571597}
572598
573599template <typename EDATA_T >
@@ -601,6 +627,9 @@ void SingleMutableCsr<EDATA_T>::batch_delete_vertices(
601627 if (!nbr_list_) {
602628 return ;
603629 }
630+ if (!src_set.empty () || !dst_set.empty ()) {
631+ needs_compact_.store (true , std::memory_order_relaxed);
632+ }
604633 nbr_t * data = reinterpret_cast <nbr_t *>(nbr_list_->GetData ());
605634 vid_t vnum = static_cast <vid_t >(vertex_capacity ());
606635 for (auto src : src_set) {
@@ -629,6 +658,9 @@ void SingleMutableCsr<EDATA_T>::batch_delete_edges(
629658 if (!nbr_list_) {
630659 return ;
631660 }
661+ if (!src_list.empty ()) {
662+ needs_compact_.store (true , std::memory_order_relaxed);
663+ }
632664 nbr_t * data = reinterpret_cast <nbr_t *>(nbr_list_->GetData ());
633665 vid_t vnum = static_cast <vid_t >(vertex_capacity ());
634666 for (size_t i = 0 ; i != src_list.size (); ++i) {
@@ -653,6 +685,9 @@ void SingleMutableCsr<EDATA_T>::batch_delete_edges(
653685 if (!nbr_list_) {
654686 return ;
655687 }
688+ if (!edge_list.empty ()) {
689+ needs_compact_.store (true , std::memory_order_relaxed);
690+ }
656691 nbr_t * data = reinterpret_cast <nbr_t *>(nbr_list_->GetData ());
657692 vid_t vnum = static_cast <vid_t >(vertex_capacity ());
658693 for (const auto & edge : edge_list) {
@@ -685,6 +720,7 @@ void SingleMutableCsr<EDATA_T>::delete_edge(vid_t src, int32_t offset,
685720 if (nbr.timestamp .load () <= ts) {
686721 nbr.timestamp .store (std::numeric_limits<timestamp_t >::max ());
687722 edge_num_.fetch_sub (1 , std::memory_order_relaxed);
723+ needs_compact_.store (true , std::memory_order_relaxed);
688724 } else if (nbr.timestamp .load () == std::numeric_limits<timestamp_t >::max ()) {
689725 LOG (ERROR ) << " Fail to delete edge, already deleted." ;
690726 } else {
@@ -711,6 +747,9 @@ void SingleMutableCsr<EDATA_T>::revert_delete_edge(vid_t src, vid_t nbr_vid,
711747 if (nbr.timestamp .load () == std::numeric_limits<timestamp_t >::max ()) {
712748 nbr.timestamp .store (ts);
713749 edge_num_.fetch_add (1 , std::memory_order_relaxed);
750+ if (ts != 0 ) {
751+ needs_compact_.store (true , std::memory_order_relaxed);
752+ }
714753 } else {
715754 THROW_INVALID_ARGUMENT_EXCEPTION (
716755 " Attempting to revert delete on edge that is not deleted." );
@@ -736,6 +775,9 @@ void SingleMutableCsr<EDATA_T>::batch_put_edges(
736775 nbr.data = data_list[i];
737776 nbr.timestamp .store (ts);
738777 edge_num_.fetch_add (1 , std::memory_order_relaxed);
778+ if (ts != 0 ) {
779+ needs_compact_.store (true , std::memory_order_relaxed);
780+ }
739781 }
740782}
741783
0 commit comments