Skip to content

Commit aa4b132

Browse files
committed
feat: Execute CommitDiff as BufferTask
1 parent 36d77aa commit aa4b132

File tree

8 files changed

+110
-68
lines changed

8 files changed

+110
-68
lines changed

Cargo.lock

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,10 @@ magicblock-config-helpers = { path = "./magicblock-config-helpers" }
109109
magicblock-config-macro = { path = "./magicblock-config-macro" }
110110
magicblock-core = { path = "./magicblock-core" }
111111
magicblock-aperture = { path = "./magicblock-aperture" }
112-
magicblock-delegation-program = { git = "https://github.com/magicblock-labs/delegation-program.git", rev = "e8d03936", features = [
113-
"no-entrypoint",
114-
] }
112+
# magicblock-delegation-program = { git = "https://github.com/magicblock-labs/delegation-program.git", rev = "e8d03936", features = [
113+
# "no-entrypoint",
114+
# ] }
115+
magicblock-delegation-program = { path = "../delegation-program", features = [ "no-entrypoint" ] }
115116
magicblock-geyser-plugin = { path = "./magicblock-geyser-plugin" }
116117
magicblock-ledger = { path = "./magicblock-ledger" }
117118
magicblock-metrics = { path = "./magicblock-metrics" }

magicblock-committor-service/src/tasks/args_task.rs

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -88,21 +88,9 @@ impl BaseTask for ArgsTask {
8888
self: Box<Self>,
8989
) -> Result<Box<dyn BaseTask>, Box<dyn BaseTask>> {
9090
match self.task_type {
91-
ArgsTaskType::Commit(mut value) if value.is_commit_diff() => {
92-
// TODO (snawaz): Currently, we do not support executing CommitDiff
93-
// as BufferTask, which is why we're forcing CommitTask to use CommitState
94-
// before converting this task into BufferTask Once CommitDiff is supported
95-
// by BufferTask, we do not have to force_commit_state and we can remove
96-
// force_commit_state stuff, as it's essentially a downgrade.
97-
98-
value.force_commit_state();
99-
Ok(Box::new(BufferTask::new_preparation_required(
100-
BufferTaskType::Commit(value),
101-
)))
102-
}
10391
ArgsTaskType::Commit(value) => {
10492
Ok(Box::new(BufferTask::new_preparation_required(
105-
BufferTaskType::Commit(value),
93+
BufferTaskType::Commit(value.switch_to_buffer_strategy()),
10694
)))
10795
}
10896
ArgsTaskType::BaseAction(_)

magicblock-committor-service/src/tasks/buffer_task.rs

Lines changed: 11 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
use dlp::args::CommitStateFromBufferArgs;
21
use magicblock_committor_program::Chunks;
32
use solana_pubkey::Pubkey;
43
use solana_sdk::instruction::Instruction;
@@ -46,16 +45,18 @@ impl BufferTask {
4645

4746
fn preparation_required(task_type: &BufferTaskType) -> PreparationState {
4847
let BufferTaskType::Commit(ref commit_task) = task_type;
49-
let committed_data = commit_task.committed_account.account.data.clone();
50-
let chunks = Chunks::from_data_length(
51-
committed_data.len(),
52-
MAX_WRITE_CHUNK_SIZE,
53-
);
48+
let state_or_diff = if let Some(diff) = commit_task.compute_diff() {
49+
diff.to_vec()
50+
} else {
51+
commit_task.committed_account.account.data.clone()
52+
};
53+
let chunks =
54+
Chunks::from_data_length(state_or_diff.len(), MAX_WRITE_CHUNK_SIZE);
5455

5556
PreparationState::Required(PreparationTask {
5657
commit_id: commit_task.commit_id,
5758
pubkey: commit_task.committed_account.pubkey,
58-
committed_data,
59+
committed_data: state_or_diff,
5960
chunks,
6061
})
6162
}
@@ -64,31 +65,15 @@ impl BufferTask {
6465
impl BaseTask for BufferTask {
6566
fn instruction(&self, validator: &Pubkey) -> Instruction {
6667
let BufferTaskType::Commit(ref value) = self.task_type;
67-
let commit_id_slice = value.commit_id.to_le_bytes();
68-
let (commit_buffer_pubkey, _) =
69-
magicblock_committor_program::pdas::buffer_pda(
70-
validator,
71-
&value.committed_account.pubkey,
72-
&commit_id_slice,
73-
);
74-
75-
dlp::instruction_builder::commit_state_from_buffer(
76-
*validator,
77-
value.committed_account.pubkey,
78-
value.committed_account.account.owner,
79-
commit_buffer_pubkey,
80-
CommitStateFromBufferArgs {
81-
nonce: value.commit_id,
82-
lamports: value.committed_account.account.lamports,
83-
allow_undelegation: value.allow_undelegation,
84-
},
85-
)
68+
value.create_commit_ix(validator)
8669
}
8770

8871
/// No further optimizations
8972
fn optimize(
9073
self: Box<Self>,
9174
) -> Result<Box<dyn BaseTask>, Box<dyn BaseTask>> {
75+
// Since the buffer in BufferTask doesn't contribute to the size of
76+
// transaction, there is nothing we can do here to optimize/reduce the size.
9277
Err(self)
9378
}
9479

magicblock-committor-service/src/tasks/mod.rs

Lines changed: 88 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use dlp::{
2-
args::{CommitDiffArgs, CommitStateArgs},
2+
args::{CommitDiffArgs, CommitStateArgs, CommitStateFromBufferArgs},
33
compute_diff,
44
};
55
use dyn_clone::DynClone;
@@ -47,7 +47,6 @@ pub enum PreparationState {
4747
Cleanup(CleanupTask),
4848
}
4949

50-
#[cfg(test)]
5150
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
5251
pub enum TaskStrategy {
5352
Args,
@@ -110,7 +109,7 @@ pub struct CommitTask {
110109
pub allow_undelegation: bool,
111110
pub committed_account: CommittedAccount,
112111
base_account: Option<Account>,
113-
force_commit_state: bool,
112+
strategy: TaskStrategy,
114113
}
115114

116115
impl CommitTask {
@@ -154,29 +153,52 @@ impl CommitTask {
154153
allow_undelegation,
155154
committed_account,
156155
base_account: fetched_account,
157-
force_commit_state: false,
156+
strategy: TaskStrategy::Args,
158157
}
159158
}
160159

161160
pub fn is_commit_diff(&self) -> bool {
162-
!self.force_commit_state
163-
&& self.committed_account.account.data.len()
164-
> CommitTask::COMMIT_STATE_SIZE_THRESHOLD
161+
self.committed_account.account.data.len()
162+
> CommitTask::COMMIT_STATE_SIZE_THRESHOLD
165163
&& self.base_account.is_some()
166164
}
167165

168-
pub fn force_commit_state(&mut self) {
169-
self.force_commit_state = true;
166+
pub fn switch_to_buffer_strategy(mut self) -> Self {
167+
self.strategy = TaskStrategy::Buffer;
168+
self
170169
}
171170

172171
pub fn create_commit_ix(&self, validator: &Pubkey) -> Instruction {
173-
if let Some(fetched_account) = self.base_account.as_ref() {
174-
self.create_commit_diff_ix(validator, fetched_account)
175-
} else {
176-
self.create_commit_state_ix(validator)
172+
match self.strategy {
173+
TaskStrategy::Args => {
174+
if let Some(base_account) = self.base_account.as_ref() {
175+
self.create_commit_diff_ix(validator, base_account)
176+
} else {
177+
self.create_commit_state_ix(validator)
178+
}
179+
}
180+
TaskStrategy::Buffer => {
181+
if let Some(base_account) = self.base_account.as_ref() {
182+
self.create_commit_diff_from_buffer_ix(
183+
validator,
184+
base_account,
185+
)
186+
} else {
187+
self.create_commit_state_from_buffer_ix(validator)
188+
}
189+
}
177190
}
178191
}
179192

193+
pub fn compute_diff(&self) -> Option<dlp::rkyv::AlignedVec> {
194+
self.base_account.as_ref().map(|base_account| {
195+
compute_diff(
196+
base_account.data(),
197+
self.committed_account.account.data(),
198+
)
199+
})
200+
}
201+
180202
fn create_commit_state_ix(&self, validator: &Pubkey) -> Instruction {
181203
let args = CommitStateArgs {
182204
nonce: self.commit_id,
@@ -195,17 +217,13 @@ impl CommitTask {
195217
fn create_commit_diff_ix(
196218
&self,
197219
validator: &Pubkey,
198-
fetched_account: &Account,
220+
base_account: &Account,
199221
) -> Instruction {
200-
if self.force_commit_state {
201-
return self.create_commit_state_ix(validator);
202-
}
203-
204222
let args = CommitDiffArgs {
205223
nonce: self.commit_id,
206224
lamports: self.committed_account.account.lamports,
207225
diff: compute_diff(
208-
fetched_account.data(),
226+
base_account.data(),
209227
self.committed_account.account.data(),
210228
)
211229
.to_vec(),
@@ -219,6 +237,57 @@ impl CommitTask {
219237
args,
220238
)
221239
}
240+
241+
fn create_commit_state_from_buffer_ix(
242+
&self,
243+
validator: &Pubkey,
244+
) -> Instruction {
245+
let commit_id_slice = self.commit_id.to_le_bytes();
246+
let (commit_buffer_pubkey, _) =
247+
magicblock_committor_program::pdas::buffer_pda(
248+
validator,
249+
&self.committed_account.pubkey,
250+
&commit_id_slice,
251+
);
252+
253+
dlp::instruction_builder::commit_state_from_buffer(
254+
*validator,
255+
self.committed_account.pubkey,
256+
self.committed_account.account.owner,
257+
commit_buffer_pubkey,
258+
CommitStateFromBufferArgs {
259+
nonce: self.commit_id,
260+
lamports: self.committed_account.account.lamports,
261+
allow_undelegation: self.allow_undelegation,
262+
},
263+
)
264+
}
265+
266+
fn create_commit_diff_from_buffer_ix(
267+
&self,
268+
validator: &Pubkey,
269+
_fetched_account: &Account,
270+
) -> Instruction {
271+
let commit_id_slice = self.commit_id.to_le_bytes();
272+
let (commit_buffer_pubkey, _) =
273+
magicblock_committor_program::pdas::buffer_pda(
274+
validator,
275+
&self.committed_account.pubkey,
276+
&commit_id_slice,
277+
);
278+
279+
dlp::instruction_builder::commit_diff_from_buffer(
280+
*validator,
281+
self.committed_account.pubkey,
282+
self.committed_account.account.owner,
283+
commit_buffer_pubkey,
284+
CommitStateFromBufferArgs {
285+
nonce: self.commit_id,
286+
lamports: self.committed_account.account.lamports,
287+
allow_undelegation: self.allow_undelegation,
288+
},
289+
)
290+
}
222291
}
223292

224293
#[derive(Clone)]

test-integration/Cargo.lock

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test-integration/Cargo.toml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,10 @@ magicblock-config = { path = "../magicblock-config" }
5757
magicblock-core = { path = "../magicblock-core" }
5858
magic-domain-program = { git = "https://github.com/magicblock-labs/magic-domain-program.git", rev = "ea04d46", default-features = false }
5959
magicblock_magic_program_api = { package = "magicblock-magic-program-api", path = "../magicblock-magic-program-api" }
60-
magicblock-delegation-program = { git = "https://github.com/magicblock-labs/delegation-program.git", rev = "e8d03936", features = [
61-
"no-entrypoint",
62-
] }
60+
# magicblock-delegation-program = { git = "https://github.com/magicblock-labs/delegation-program.git", rev = "e8d03936", features = [
61+
# "no-entrypoint",
62+
# ] }
63+
magicblock-delegation-program = { path = "../../delegation-program", features = [ "no-entrypoint" ] }
6364
magicblock-program = { path = "../programs/magicblock" }
6465
magicblock-rpc-client = { path = "../magicblock-rpc-client" }
6566
magicblock-table-mania = { path = "../magicblock-table-mania" }

test-integration/schedulecommit/test-scenarios/tests/02_commit_and_undelegate.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -253,13 +253,13 @@ fn test_committing_and_undelegating_huge_order_book_account() {
253253
println!("Important: use {rng_seed} as seed to regenerate the random inputs in case of test failure");
254254
let mut random = StdRng::seed_from_u64(rng_seed);
255255
let mut update = BookUpdate::default();
256-
update.bids.extend((0..random.gen_range(5..10)).map(|_| {
256+
update.bids.extend((0..random.gen_range(5..100)).map(|_| {
257257
OrderLevel {
258258
price: random.gen_range(75000..90000),
259259
size: random.gen_range(1..10),
260260
}
261261
}));
262-
update.asks.extend((0..random.gen_range(5..10)).map(|_| {
262+
update.asks.extend((0..random.gen_range(5..100)).map(|_| {
263263
OrderLevel {
264264
price: random.gen_range(125000..150000),
265265
size: random.gen_range(1..10),

0 commit comments

Comments
 (0)