void commit(bool all) { if (edgedata == NULL || only_adjacency) return; assert(is_loaded); metrics_entry cm = m.start_time(); /** * This is an optimization that is relevant only if memory shard * has been used in a case where only out-edges are considered. * Out-edges are in a continuous "window", while in-edges are * scattered all over the shard */ if (all) { iomgr->managed_pwritea_now(edata_iosession, &edgedata, edatafilesize, 0); } else { size_t last = streaming_offset_edge_ptr; if (last == 0){ // rollback last = edatafilesize; } char * bufp = ((char*)edgedata + range_start_edge_ptr); iomgr->managed_pwritea_now(edata_iosession, &bufp, last - range_start_edge_ptr, range_start_edge_ptr); } m.stop_time(cm, "memshard_commit"); iomgr->managed_release(adj_session, &adjdata); iomgr->managed_release(edata_iosession, &edgedata); is_loaded = false; }
~memory_shard() { if (edata_iosession >= 0) { if (edgedata != NULL) iomgr->managed_release(edata_iosession, &edgedata); iomgr->close_session(edata_iosession); } if (adj_session >= 0) { if (adjdata != NULL) iomgr->managed_release(adj_session, &adjdata); iomgr->close_session(adj_session); } }
void releaseblocks() { for(int i=0; i < (int)loadedblocks.size(); i++) { delete(loadedblocks[i].dblock); iomgr->managed_release(loadedblocks[i].fd, &loadedblocks[i].data); iomgr->close_session(loadedblocks[i].fd); loadedblocks[i].data = NULL; loadedblocks[i].dblock = NULL; } loadedblocks.clear(); }
virtual ~vertex_data_store() { if (!use_mmap) { iomgr->close_session(filedesc); iomgr->wait_for_writes(); if (loaded_chunk != NULL) { iomgr->managed_release(filedesc, &loaded_chunk); } } else { logstream(LOG_INFO) << "Syncing vertex data..." << std::endl; msync(mmap_file, mmap_length, MS_SYNC); munmap(mmap_file, mmap_length); close(filedesc); } }
virtual ~degree_data() { if (!use_mmap) { if (loaded_chunk != NULL) { iomgr->managed_release(filedesc, &loaded_chunk); } iomgr->close_session(filedesc); } else { if (modified) { msync(mmap_file, mmap_length, MS_SYNC); } munmap(mmap_file, mmap_length); close(filedesc); } }
/** * Loads a chunk of vertex degrees * @param vertex_st first vertex id * @param vertex_en last vertex id, inclusive */ virtual void load(vid_t _vertex_st, vid_t _vertex_en) { assert(_vertex_en >= _vertex_st); vertex_st = _vertex_st; vertex_en = _vertex_en; size_t datasize = (vertex_en - vertex_st + 1) * sizeof(degree); size_t datastart = vertex_st * sizeof(degree); if (loaded_chunk != NULL) { iomgr->managed_release(filedesc, &loaded_chunk); } iomgr->managed_malloc(filedesc, &loaded_chunk, datasize, datastart); iomgr->managed_preada_now(filedesc, &loaded_chunk, datasize, datastart); }
/** * Loads a chunk of vertex values * @param vertex_st first vertex id * @param vertex_en last vertex id, inclusive */ virtual void load(vid_t _vertex_st, vid_t _vertex_en) { if (!use_mmap) { assert(_vertex_en >= _vertex_st); vertex_st = _vertex_st; vertex_en = _vertex_en; size_t datasize = (vertex_en - vertex_st + 1)* sizeof(VertexDataType); size_t datastart = vertex_st * sizeof(VertexDataType); if (loaded_chunk != NULL) { iomgr->managed_release(filedesc, &loaded_chunk); } iomgr->managed_malloc(filedesc, &loaded_chunk, datasize, datastart); iomgr->managed_preada_now(filedesc, &loaded_chunk, datasize, datastart); } else { // Do nothing } }
virtual ~degree_data() { if (loaded_chunk != NULL) { iomgr->managed_release(filedesc, &loaded_chunk); } iomgr->close_session(filedesc); }