public override void PersistedUploadHandler(PersistedSliceReader request, ErrnoResponseWriter response) { var dmc = DynamicMemoryCloud.Instance; var uploader = dmc.m_persistent_storage.Upload(request.version, dmc.MyPartitionId, request.lowkey, request.highkey).Result; var chunks = new[] { new ChunkInformation { lowKey = request.lowkey, highKey = request.highkey, id = request.version } }; var thres = DynamicClusterConfig.Instance.PersistedChunkSizeThreshold; var tx_rsps = Global.LocalStorage .Where(cell => _Covered(chunks, cell.CellId)) .Segment(thres, cell => cell.CellSize + sizeof(long) + sizeof(int) + sizeof(ushort)) .Select(_ => _Upload(_, uploader, thres)); Task.WhenAll(tx_rsps).Wait(); response.errno = Errno.E_OK; }
public override void PersistedDownloadHandler(PersistedSliceReader request, ErrnoResponseWriter response) { var dmc = DynamicMemoryCloud.Instance; var downloader = dmc.m_persistent_storage.Download(request.version, dmc.MyPartitionId, request.lowkey, request.highkey).Result; Task <IPersistentDataChunk> dtask = downloader.DownloadAsync(); while (true) { var data = dtask?.Result; if (data == null) { break; //fetched null from a task, EOF } // start new download while we load it into memory storage var ndtask = downloader.DownloadAsync(); foreach (var cell in data) { Global.LocalStorage.SaveCell(cell.CellId, cell.Buffer, cell.Offset, cell.Length, cell.CellType); } dtask = ndtask; } response.errno = Errno.E_OK; }