From: Vladimir Davydov <vdavydov.dev@gmail.com> To: kostja@tarantool.org Cc: tarantool-patches@freelists.org Subject: [PATCH 1/6] Add generic engine, space, index method stubs Date: Fri, 20 Jul 2018 20:43:30 +0300 [thread overview] Message-ID: <bd0c297d76215a86fcc024a9968cc103d083bbdd.1532107326.git.vdavydov.dev@gmail.com> (raw) In-Reply-To: <cover.1532107326.git.vdavydov.dev@gmail.com> In-Reply-To: <cover.1532107326.git.vdavydov.dev@gmail.com> This should reduce maintenance burden and help us introduce a new engine. --- src/box/engine.c | 161 ++++++++++++++++++++++++++ src/box/engine.h | 28 +++++ src/box/index.cc | 13 +++ src/box/index.h | 3 + src/box/memtx_engine.c | 17 +-- src/box/space.c | 73 ++++++++++++ src/box/space.h | 14 +++ src/box/sysview_engine.c | 287 +++++------------------------------------------ src/box/sysview_index.c | 20 +--- src/box/vinyl.c | 17 +-- 10 files changed, 327 insertions(+), 306 deletions(-) diff --git a/src/box/engine.c b/src/box/engine.c index 82293fd1..2a30dcdd 100644 --- a/src/box/engine.c +++ b/src/box/engine.c @@ -196,3 +196,164 @@ engine_reset_stat(void) engine_foreach(engine) engine->vtab->reset_stat(engine); } + +/* {{{ Virtual method stubs */ + +int +generic_engine_join(struct engine *engine, const struct vclock *vclock, + struct xstream *stream) +{ + (void)engine; + (void)vclock; + (void)stream; + return 0; +} + +int +generic_engine_begin(struct engine *engine, struct txn *txn) +{ + (void)engine; + (void)txn; + return 0; +} + +int +generic_engine_begin_statement(struct engine *engine, struct txn *txn) +{ + (void)engine; + (void)txn; + return 0; +} + +int +generic_engine_prepare(struct engine *engine, struct txn *txn) +{ + (void)engine; + (void)txn; + return 0; +} + +void +generic_engine_commit(struct engine *engine, struct txn *txn) +{ + (void)engine; + (void)txn; +} + +void +generic_engine_rollback_statement(struct engine *engine, struct txn *txn, + struct txn_stmt *stmt) +{ + (void)engine; + (void)txn; + (void)stmt; +} + +void +generic_engine_rollback(struct engine *engine, struct txn *txn) +{ + (void)engine; + (void)txn; +} + +int +generic_engine_bootstrap(struct engine *engine) +{ + (void)engine; + return 0; +} + +int +generic_engine_begin_initial_recovery(struct engine *engine, + const struct vclock *vclock) +{ + (void)engine; + (void)vclock; + return 0; +} + +int +generic_engine_begin_final_recovery(struct engine *engine) +{ + (void)engine; + return 0; +} + +int +generic_engine_end_recovery(struct engine *engine) +{ + (void)engine; + return 0; +} + +int +generic_engine_begin_checkpoint(struct engine *engine) +{ + (void)engine; + return 0; +} + +int +generic_engine_wait_checkpoint(struct engine *engine, + const struct vclock *vclock) +{ + (void)engine; + (void)vclock; + return 0; +} + +void +generic_engine_commit_checkpoint(struct engine *engine, + const struct vclock *vclock) +{ + (void)engine; + (void)vclock; +} + +void +generic_engine_abort_checkpoint(struct engine *engine) +{ + (void)engine; +} + +int +generic_engine_collect_garbage(struct engine *engine, int64_t lsn) +{ + (void)engine; + (void)lsn; + return 0; +} + +int +generic_engine_backup(struct engine *engine, const struct vclock *vclock, + engine_backup_cb cb, void *cb_arg) +{ + (void)engine; + (void)vclock; + (void)cb; + (void)cb_arg; + return 0; +} + +void +generic_engine_memory_stat(struct engine *engine, + struct engine_memory_stat *stat) +{ + (void)engine; + (void)stat; +} + +void +generic_engine_reset_stat(struct engine *engine) +{ + (void)engine; +} + +int +generic_engine_check_space_def(struct space_def *def) +{ + (void)def; + return 0; +} + +/* }}} */ diff --git a/src/box/engine.h b/src/box/engine.h index 825f059e..e10eaec4 100644 --- a/src/box/engine.h +++ b/src/box/engine.h @@ -336,6 +336,34 @@ engine_memory_stat(struct engine_memory_stat *stat); void engine_reset_stat(void); +/* + * Virtual method stubs. + */ +int generic_engine_join(struct engine *, const struct vclock *, + struct xstream *); +int generic_engine_begin(struct engine *, struct txn *); +int generic_engine_begin_statement(struct engine *, struct txn *); +int generic_engine_prepare(struct engine *, struct txn *); +void generic_engine_commit(struct engine *, struct txn *); +void generic_engine_rollback_statement(struct engine *, struct txn *, + struct txn_stmt *); +void generic_engine_rollback(struct engine *, struct txn *); +int generic_engine_bootstrap(struct engine *); +int generic_engine_begin_initial_recovery(struct engine *, + const struct vclock *); +int generic_engine_begin_final_recovery(struct engine *); +int generic_engine_end_recovery(struct engine *); +int generic_engine_begin_checkpoint(struct engine *); +int generic_engine_wait_checkpoint(struct engine *, const struct vclock *); +void generic_engine_commit_checkpoint(struct engine *, const struct vclock *); +void generic_engine_abort_checkpoint(struct engine *); +int generic_engine_collect_garbage(struct engine *, int64_t); +int generic_engine_backup(struct engine *, const struct vclock *, + engine_backup_cb, void *); +void generic_engine_memory_stat(struct engine *, struct engine_memory_stat *); +void generic_engine_reset_stat(struct engine *); +int generic_engine_check_space_def(struct space_def *); + #if defined(__cplusplus) } /* extern "C" */ diff --git a/src/box/index.cc b/src/box/index.cc index 1e3f7afb..ea24b3aa 100644 --- a/src/box/index.cc +++ b/src/box/index.cc @@ -582,6 +582,13 @@ bool generic_index_depends_on_pk(struct index *) return false; } +bool +generic_index_def_change_requires_rebuild(struct index *, + const struct index_def *) +{ + return true; +} + ssize_t generic_index_size(struct index *index) { @@ -589,6 +596,12 @@ generic_index_size(struct index *index) return -1; } +ssize_t +generic_index_bsize(struct index *) +{ + return 0; +} + int generic_index_min(struct index *index, const char *key, uint32_t part_count, struct tuple **result) diff --git a/src/box/index.h b/src/box/index.h index 686e7a1a..0a1ac611 100644 --- a/src/box/index.h +++ b/src/box/index.h @@ -667,6 +667,9 @@ void generic_index_commit_modify(struct index *, int64_t); void generic_index_commit_drop(struct index *, int64_t); void generic_index_update_def(struct index *); bool generic_index_depends_on_pk(struct index *); +bool generic_index_def_change_requires_rebuild(struct index *, + const struct index_def *); +ssize_t generic_index_bsize(struct index *); ssize_t generic_index_size(struct index *); int generic_index_min(struct index *, const char *, uint32_t, struct tuple **); int generic_index_max(struct index *, const char *, uint32_t, struct tuple **); diff --git a/src/box/memtx_engine.c b/src/box/memtx_engine.c index c210afbe..a1ce4fff 100644 --- a/src/box/memtx_engine.c +++ b/src/box/memtx_engine.c @@ -966,19 +966,6 @@ memtx_engine_memory_stat(struct engine *engine, struct engine_memory_stat *stat) stat->index += index_stats.totals.used; } -static void -memtx_engine_reset_stat(struct engine *engine) -{ - (void)engine; -} - -static int -memtx_engine_check_space_def(struct space_def *def) -{ - (void)def; - return 0; -} - static const struct engine_vtab memtx_engine_vtab = { /* .shutdown = */ memtx_engine_shutdown, /* .create_space = */ memtx_engine_create_space, @@ -1000,8 +987,8 @@ static const struct engine_vtab memtx_engine_vtab = { /* .collect_garbage = */ memtx_engine_collect_garbage, /* .backup = */ memtx_engine_backup, /* .memory_stat = */ memtx_engine_memory_stat, - /* .reset_stat = */ memtx_engine_reset_stat, - /* .check_space_def = */ memtx_engine_check_space_def, + /* .reset_stat = */ generic_engine_reset_stat, + /* .check_space_def = */ generic_engine_check_space_def, }; /** diff --git a/src/box/space.c b/src/box/space.c index a325a42e..fc59dbe3 100644 --- a/src/box/space.c +++ b/src/box/space.c @@ -505,3 +505,76 @@ space_execute_dml(struct space *space, struct txn *txn, } return 0; } + +/* {{{ Virtual method stubs */ + +size_t +generic_space_bsize(struct space *space) +{ + (void)space; + return 0; +} + +int +generic_space_apply_initial_join_row(struct space *space, + struct request *request) +{ + (void)space; + (void)request; + return 0; +} + +void +generic_init_system_space(struct space *space) +{ + (void)space; +} + +int +generic_space_check_index_def(struct space *space, struct index_def *index_def) +{ + (void)space; + (void)index_def; + return 0; +} + +int +generic_space_add_primary_key(struct space *space) +{ + (void)space; + return 0; +} + +void +generic_space_drop_primary_key(struct space *space) +{ + (void)space; +} + +int +generic_space_check_format(struct space *space, struct tuple_format *format) +{ + (void)space; + (void)format; + return 0; +} + +int +generic_space_build_index(struct space *src_space, struct index *new_index, + struct tuple_format *new_format) +{ + (void)src_space; + (void)new_index; + (void)new_format; + return 0; +} + +int +generic_space_prepare_alter(struct space *old_space, struct space *new_space) +{ + (void)old_space; + (void)new_space; + return 0; +} + +/* }}} */ diff --git a/src/box/space.h b/src/box/space.h index ae32e6df..8888ec80 100644 --- a/src/box/space.h +++ b/src/box/space.h @@ -398,6 +398,20 @@ space_dump_def(const struct space *space, struct rlist *key_list); void space_fill_index_map(struct space *space); +/* + * Virtual method stubs. + */ +size_t generic_space_bsize(struct space *); +int generic_space_apply_initial_join_row(struct space *, struct request *); +void generic_init_system_space(struct space *); +int generic_space_check_index_def(struct space *, struct index_def *); +int generic_space_add_primary_key(struct space *space); +void generic_space_drop_primary_key(struct space *space); +int generic_space_check_format(struct space *, struct tuple_format *); +int generic_space_build_index(struct space *, struct index *, + struct tuple_format *); +int generic_space_prepare_alter(struct space *, struct space *); + #if defined(__cplusplus) } /* extern "C" */ diff --git a/src/box/sysview_engine.c b/src/box/sysview_engine.c index 762bf93e..f2f27381 100644 --- a/src/box/sysview_engine.c +++ b/src/box/sysview_engine.c @@ -39,23 +39,6 @@ sysview_space_destroy(struct space *space) free(space); } -static size_t -sysview_space_bsize(struct space *space) -{ - (void)space; - return 0; -} - -static int -sysview_space_apply_initial_join_row(struct space *space, - struct request *request) -{ - (void)space; - (void)request; - unreachable(); - return 0; -} - static int sysview_space_execute_replace(struct space *space, struct txn *txn, struct request *request, struct tuple **result) @@ -99,21 +82,6 @@ sysview_space_execute_upsert(struct space *space, struct txn *txn, return -1; } -static void -sysview_init_system_space(struct space *space) -{ - (void)space; - unreachable(); -} - -static int -sysview_space_check_index_def(struct space *space, struct index_def *index_def) -{ - (void)space; - (void)index_def; - return 0; -} - static struct index * sysview_space_create_index(struct space *space, struct index_def *index_def) { @@ -122,63 +90,23 @@ sysview_space_create_index(struct space *space, struct index_def *index_def) space_name(space)); } -static int -sysview_space_add_primary_key(struct space *space) -{ - (void)space; - return 0; -} - -static void -sysview_space_drop_primary_key(struct space *space) -{ - (void)space; -} - -static int -sysview_space_build_index(struct space *src_space, struct index *new_index, - struct tuple_format *new_format) -{ - (void)src_space; - (void)new_index; - (void)new_format; - return 0; -} - -static int -sysview_space_prepare_alter(struct space *old_space, struct space *new_space) -{ - (void)old_space; - (void)new_space; - return 0; -} - -static int -sysview_space_check_format(struct space *space, struct tuple_format *format) -{ - (void)space; - (void)format; - unreachable(); - return 0; -} - static const struct space_vtab sysview_space_vtab = { /* .destroy = */ sysview_space_destroy, - /* .bsize = */ sysview_space_bsize, - /* .apply_initial_join_row = */ sysview_space_apply_initial_join_row, + /* .bsize = */ generic_space_bsize, + /* .apply_initial_join_row = */ generic_space_apply_initial_join_row, /* .execute_replace = */ sysview_space_execute_replace, /* .execute_delete = */ sysview_space_execute_delete, /* .execute_update = */ sysview_space_execute_update, /* .execute_upsert = */ sysview_space_execute_upsert, - /* .init_system_space = */ sysview_init_system_space, - /* .check_index_def = */ sysview_space_check_index_def, + /* .init_system_space = */ generic_init_system_space, + /* .check_index_def = */ generic_space_check_index_def, /* .create_index = */ sysview_space_create_index, - /* .add_primary_key = */ sysview_space_add_primary_key, - /* .drop_primary_key = */ sysview_space_drop_primary_key, - /* .check_format = */ sysview_space_check_format, - /* .build_index = */ sysview_space_build_index, + /* .add_primary_key = */ generic_space_add_primary_key, + /* .drop_primary_key = */ generic_space_drop_primary_key, + /* .check_format = */ generic_space_check_format, + /* .build_index = */ generic_space_build_index, /* .swap_index = */ generic_space_swap_index, - /* .prepare_alter = */ sysview_space_prepare_alter, + /* .prepare_alter = */ generic_space_prepare_alter, }; static void @@ -208,186 +136,29 @@ sysview_engine_create_space(struct engine *engine, struct space_def *def, return space; } -static int -sysview_engine_begin(struct engine *engine, struct txn *txn) -{ - (void)engine; - (void)txn; - return 0; -} - -static int -sysview_engine_begin_statement(struct engine *engine, struct txn *txn) -{ - (void)engine; - (void)txn; - return 0; -} - -static int -sysview_engine_prepare(struct engine *engine, struct txn *txn) -{ - (void)engine; - (void)txn; - return 0; -} - -static void -sysview_engine_commit(struct engine *engine, struct txn *txn) -{ - (void)engine; - (void)txn; -} - -static void -sysview_engine_rollback(struct engine *engine, struct txn *txn) -{ - (void)engine; - (void)txn; -} - -static void -sysview_engine_rollback_statement(struct engine *engine, struct txn *txn, - struct txn_stmt *stmt) -{ - (void)engine; - (void)txn; - (void)stmt; -} - -static int -sysview_engine_bootstrap(struct engine *engine) -{ - (void)engine; - return 0; -} - -static int -sysview_engine_begin_initial_recovery(struct engine *engine, - const struct vclock *vclock) -{ - (void)engine; - (void)vclock; - return 0; -} - -static int -sysview_engine_begin_final_recovery(struct engine *engine) -{ - (void)engine; - return 0; -} - -static int -sysview_engine_end_recovery(struct engine *engine) -{ - (void)engine; - return 0; -} - -static int -sysview_engine_join(struct engine *engine, const struct vclock *vclock, - struct xstream *stream) -{ - (void)engine; - (void)vclock; - (void)stream; - return 0; -} - -static int -sysview_engine_begin_checkpoint(struct engine *engine) -{ - (void)engine; - return 0; -} - -static int -sysview_engine_wait_checkpoint(struct engine *engine, - const struct vclock *vclock) -{ - (void)engine; - (void)vclock; - return 0; -} - -static void -sysview_engine_commit_checkpoint(struct engine *engine, - const struct vclock *vclock) -{ - (void)engine; - (void)vclock; -} - -static void -sysview_engine_abort_checkpoint(struct engine *engine) -{ - (void)engine; -} - -static int -sysview_engine_collect_garbage(struct engine *engine, int64_t lsn) -{ - (void)engine; - (void)lsn; - return 0; -} - -static int -sysview_engine_backup(struct engine *engine, const struct vclock *vclock, - engine_backup_cb cb, void *cb_arg) -{ - (void)engine; - (void)vclock; - (void)cb; - (void)cb_arg; - return 0; -} - -static void -sysview_engine_memory_stat(struct engine *engine, - struct engine_memory_stat *stat) -{ - (void)engine; - (void)stat; -} - -static void -sysview_engine_reset_stat(struct engine *engine) -{ - (void)engine; -} - -static int -sysview_engine_check_space_def(struct space_def *def) -{ - (void)def; - return 0; -} - static const struct engine_vtab sysview_engine_vtab = { /* .shutdown = */ sysview_engine_shutdown, /* .create_space = */ sysview_engine_create_space, - /* .join = */ sysview_engine_join, - /* .begin = */ sysview_engine_begin, - /* .begin_statement = */ sysview_engine_begin_statement, - /* .prepare = */ sysview_engine_prepare, - /* .commit = */ sysview_engine_commit, - /* .rollback_statement = */ sysview_engine_rollback_statement, - /* .rollback = */ sysview_engine_rollback, - /* .bootstrap = */ sysview_engine_bootstrap, - /* .begin_initial_recovery = */ sysview_engine_begin_initial_recovery, - /* .begin_final_recovery = */ sysview_engine_begin_final_recovery, - /* .end_recovery = */ sysview_engine_end_recovery, - /* .begin_checkpoint = */ sysview_engine_begin_checkpoint, - /* .wait_checkpoint = */ sysview_engine_wait_checkpoint, - /* .commit_checkpoint = */ sysview_engine_commit_checkpoint, - /* .abort_checkpoint = */ sysview_engine_abort_checkpoint, - /* .collect_garbage = */ sysview_engine_collect_garbage, - /* .backup = */ sysview_engine_backup, - /* .memory_stat = */ sysview_engine_memory_stat, - /* .reset_stat = */ sysview_engine_reset_stat, - /* .check_space_def = */ sysview_engine_check_space_def, + /* .join = */ generic_engine_join, + /* .begin = */ generic_engine_begin, + /* .begin_statement = */ generic_engine_begin_statement, + /* .prepare = */ generic_engine_prepare, + /* .commit = */ generic_engine_commit, + /* .rollback_statement = */ generic_engine_rollback_statement, + /* .rollback = */ generic_engine_rollback, + /* .bootstrap = */ generic_engine_bootstrap, + /* .begin_initial_recovery = */ generic_engine_begin_initial_recovery, + /* .begin_final_recovery = */ generic_engine_begin_final_recovery, + /* .end_recovery = */ generic_engine_end_recovery, + /* .begin_checkpoint = */ generic_engine_begin_checkpoint, + /* .wait_checkpoint = */ generic_engine_wait_checkpoint, + /* .commit_checkpoint = */ generic_engine_commit_checkpoint, + /* .abort_checkpoint = */ generic_engine_abort_checkpoint, + /* .collect_garbage = */ generic_engine_collect_garbage, + /* .backup = */ generic_engine_backup, + /* .memory_stat = */ generic_engine_memory_stat, + /* .reset_stat = */ generic_engine_reset_stat, + /* .check_space_def = */ generic_engine_check_space_def, }; struct sysview_engine * diff --git a/src/box/sysview_index.c b/src/box/sysview_index.c index 5e3d8423..309618ca 100644 --- a/src/box/sysview_index.c +++ b/src/box/sysview_index.c @@ -84,22 +84,6 @@ sysview_index_destroy(struct index *index) free(index); } -static ssize_t -sysview_index_bsize(struct index *index) -{ - (void)index; - return 0; -} - -static bool -sysview_index_def_change_requires_rebuild(struct index *index, - const struct index_def *new_def) -{ - (void)index; - (void)new_def; - return true; -} - static struct iterator * sysview_index_create_iterator(struct index *base, enum iterator_type type, const char *key, uint32_t part_count) @@ -177,9 +161,9 @@ static const struct index_vtab sysview_index_vtab = { /* .update_def = */ generic_index_update_def, /* .depends_on_pk = */ generic_index_depends_on_pk, /* .def_change_requires_rebuild = */ - sysview_index_def_change_requires_rebuild, + generic_index_def_change_requires_rebuild, /* .size = */ generic_index_size, - /* .bsize = */ sysview_index_bsize, + /* .bsize = */ generic_index_bsize, /* .min = */ generic_index_min, /* .max = */ generic_index_max, /* .random = */ generic_index_random, diff --git a/src/box/vinyl.c b/src/box/vinyl.c index a802b169..f02fa638 100644 --- a/src/box/vinyl.c +++ b/src/box/vinyl.c @@ -1002,13 +1002,6 @@ vinyl_index_def_change_requires_rebuild(struct index *index, return false; } -static void -vinyl_init_system_space(struct space *space) -{ - (void)space; - unreachable(); -} - static int vinyl_space_prepare_alter(struct space *old_space, struct space *new_space) { @@ -1159,12 +1152,6 @@ vinyl_space_add_primary_key(struct space *space) return vinyl_index_open(space->index[0]); } -static void -vinyl_space_drop_primary_key(struct space *space) -{ - (void)space; -} - static size_t vinyl_space_bsize(struct space *space) { @@ -4488,11 +4475,11 @@ static const struct space_vtab vinyl_space_vtab = { /* .execute_delete = */ vinyl_space_execute_delete, /* .execute_update = */ vinyl_space_execute_update, /* .execute_upsert = */ vinyl_space_execute_upsert, - /* .init_system_space = */ vinyl_init_system_space, + /* .init_system_space = */ generic_init_system_space, /* .check_index_def = */ vinyl_space_check_index_def, /* .create_index = */ vinyl_space_create_index, /* .add_primary_key = */ vinyl_space_add_primary_key, - /* .drop_primary_key = */ vinyl_space_drop_primary_key, + /* .drop_primary_key = */ generic_space_drop_primary_key, /* .check_format = */ vinyl_space_check_format, /* .build_index = */ vinyl_space_build_index, /* .swap_index = */ vinyl_space_swap_index, -- 2.11.0
next prev parent reply other threads:[~2018-07-20 17:43 UTC|newest] Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top 2018-07-20 17:43 [PATCH 0/6] Introduce blackhole engine Vladimir Davydov 2018-07-20 17:43 ` Vladimir Davydov [this message] 2018-07-20 17:56 ` [PATCH 1/6] Add generic engine, space, index method stubs Konstantin Osipov 2018-07-21 12:24 ` Vladimir Davydov 2018-07-20 17:43 ` [PATCH 2/6] Merge sysview_index.[hc] and sysview_engine.[hc] Vladimir Davydov 2018-07-20 18:02 ` Konstantin Osipov 2018-07-21 12:24 ` Vladimir Davydov 2018-07-20 17:43 ` [PATCH 3/6] Rework memtx replace function Vladimir Davydov 2018-07-20 18:04 ` Konstantin Osipov 2018-07-21 12:24 ` Vladimir Davydov 2018-07-20 17:43 ` [PATCH 4/6] txn: unify txn_stmt tuples reference counting rules Vladimir Davydov 2018-07-20 18:31 ` Konstantin Osipov 2018-07-21 12:24 ` Vladimir Davydov 2018-07-20 17:43 ` [PATCH 5/6] space: call before_replace trigger even if space has no indexes Vladimir Davydov 2018-07-20 18:39 ` Konstantin Osipov 2018-07-21 12:26 ` Vladimir Davydov 2018-07-21 20:59 ` Konstantin Osipov 2018-07-23 10:15 ` Vladimir Davydov 2018-07-20 17:43 ` [PATCH 6/6] Introduce blackhole engine Vladimir Davydov 2018-07-20 18:42 ` Konstantin Osipov 2018-07-21 12:35 ` Vladimir Davydov 2018-07-23 11:02 ` Vladimir Davydov 2018-07-23 12:53 ` Vladimir Davydov 2018-07-23 18:30 ` [PATCH 0/6] " Konstantin Osipov
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=bd0c297d76215a86fcc024a9968cc103d083bbdd.1532107326.git.vdavydov.dev@gmail.com \ --to=vdavydov.dev@gmail.com \ --cc=kostja@tarantool.org \ --cc=tarantool-patches@freelists.org \ --subject='Re: [PATCH 1/6] Add generic engine, space, index method stubs' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox