new communication structure

This commit is contained in:
2026-01-26 21:10:26 +01:00
parent 2b2f8622bf
commit 09c314463b
2 changed files with 74 additions and 33 deletions

View File

@@ -9,6 +9,7 @@ use std::{path::PathBuf, sync::Arc, thread};
use tarpc::context::Context;
use tokio::sync::Mutex;
use tracing::instrument;
use futures::prelude::*;
use super::*;
use crate::drive::Drive;
@@ -200,8 +201,15 @@ impl GDriverService for GdriverServer {
}
BackendActionRequest::RunLong => {
println!("RunLong request received");
long_running_task(&self.drive).await;
Ok(AsyncResponse::Immediate(String::from("OK")))
let drive = self.drive.clone();
let client = self.client.clone();
let task_id = TaskId(uuid::Uuid::new_v4().to_string());
let task_id_clone = task_id.clone();
tokio::spawn(async move {
long_running_task(&drive).await;
let _ = client.report_task_result(tarpc::context::current(), task_id_clone, TaskResult::Success("OK".to_string())).await;
});
Ok(AsyncResponse::Pending(task_id))
}
BackendActionRequest::StartLong => {
println!("StartLong request received");
@@ -211,13 +219,7 @@ impl GDriverService for GdriverServer {
let task_id_clone = task_id.clone();
tokio::spawn(async move {
long_running_task(&drive).await;
let _ = client
.report_task_result(
tarpc::context::current(),
task_id_clone,
TaskResult::Success("OK".to_string()),
)
.await;
let _ = client.report_task_result(tarpc::context::current(), task_id_clone, TaskResult::Success("OK".to_string())).await;
});
Ok(AsyncResponse::Pending(task_id))
}
@@ -251,21 +253,25 @@ pub async fn start() -> Result<()> {
listener
// Ignore accept errors.
.filter_map(|r| future::ready(r.ok()))
.map(|transport| {
let peer_addr = transport.peer_addr().unwrap();
let (server_channel, client_channel) = spawn_twoway(transport);
let client =
GDriverClientClient::new(tarpc::client::Config::default(), client_channel).spawn();
let server = GdriverServer {
socket_address: peer_addr,
drive: drive.clone(),
client,
};
BaseChannel::with_defaults(server_channel).execute(server.serve())
.for_each_concurrent(10, |transport| {
let drive = drive.clone();
async move {
let peer_addr = transport.peer_addr().unwrap();
let (server_channel, client_channel) = spawn_twoway(transport);
let client = GDriverClientClient::new(tarpc::client::Config::default(), client_channel).spawn();
let server = GdriverServer {
socket_address: peer_addr,
drive,
client,
};
BaseChannel::with_defaults(server_channel)
.execute(server.serve())
.for_each(|f| async move {
tokio::spawn(f);
})
.await
}
})
// Max 10 channels.
// .buffer_unordered(10)
.for_each(|_| async {})
.await;
Ok(())
}
@@ -273,11 +279,11 @@ pub async fn start() -> Result<()> {
mod sample_sym {
use futures::future::{AbortHandle, Abortable};
use futures::{Sink, TryFutureExt};
use futures::{SinkExt, Stream, StreamExt, TryStreamExt};
use serde::{Deserialize, Serialize};
use futures::{ SinkExt, Stream, StreamExt, TryStreamExt};
use std::io;
use tarpc::transport::channel::{ChannelError, UnboundedChannel};
use tracing::{debug, warn};
use serde::{Serialize, Deserialize};
#[derive(Debug, Serialize, Deserialize)]
pub enum TwoWayMessage<Req, Resp> {