Skip to content

Commit

Permalink
api: handle RPCDaemon not started or already started (#1591)
Browse files Browse the repository at this point in the history
  • Loading branch information
canepat committed Oct 18, 2023
1 parent 3cdf809 commit f207523
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 11 deletions.
9 changes: 8 additions & 1 deletion silkworm/api/silkworm_api.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,9 @@ SILKWORM_EXPORT int silkworm_start_rpcdaemon(SilkwormHandle* handle, MDBX_env* e
if (handle != instance.handle) {
return SILKWORM_INSTANCE_NOT_FOUND;
}
if (instance.rpcdaemon) {
return SILKWORM_RPCDAEMON_ALREADY_STARTED;
}

struct EnvUnmanaged : public ::mdbx::env {
explicit EnvUnmanaged(MDBX_env* ptr) : ::mdbx::env{ptr} {}
Expand All @@ -293,7 +296,7 @@ SILKWORM_EXPORT int silkworm_start_rpcdaemon(SilkwormHandle* handle, MDBX_env* e
instance.rpcdaemon = std::make_unique<rpc::Daemon>(settings, std::make_optional<mdbx::env>(unmanaged_env));

// Check protocol version compatibility with Core Services
if (not settings.skip_protocol_check) {
if (!settings.skip_protocol_check) {
SILK_INFO << "[Silkworm RPC] Checking protocol version compatibility with core services...";

const auto checklist = instance.rpcdaemon->run_checklist();
Expand All @@ -315,11 +318,15 @@ SILKWORM_EXPORT int silkworm_stop_rpcdaemon(SilkwormHandle* handle) SILKWORM_NOE
if (handle != instance.handle) {
return SILKWORM_INSTANCE_NOT_FOUND;
}
if (!instance.rpcdaemon) {
return SILKWORM_RPCDAEMON_NOT_STARTED;
}

instance.rpcdaemon->stop();
SILK_INFO << "[Silkworm RPC] Exiting...";
instance.rpcdaemon->join();
SILK_INFO << "[Silkworm RPC] Stopped";
instance.rpcdaemon.reset();

return SILKWORM_OK;
}
Expand Down
23 changes: 13 additions & 10 deletions silkworm/api/silkworm_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,9 @@
extern "C" {
#endif

typedef struct MDBX_env MDBX_env;
typedef struct MDBX_txn MDBX_txn;
// Silkworm library error codes (SILKWORM_OK indicates no error, i.e. success)

#define SILKWORM_OK 0 /* Successful result */
#define SILKWORM_OK 0
#define SILKWORM_INTERNAL_ERROR 1
#define SILKWORM_UNKNOWN_ERROR 2
#define SILKWORM_INVALID_HANDLE 3
Expand All @@ -58,16 +57,13 @@ typedef struct MDBX_txn MDBX_txn;
#define SILKWORM_TOO_MANY_INSTANCES 13
#define SILKWORM_INSTANCE_NOT_FOUND 14
#define SILKWORM_TERMINATION_SIGNAL 15
#define SILKWORM_RPCDAEMON_ALREADY_STARTED 16
#define SILKWORM_RPCDAEMON_NOT_STARTED 17

typedef struct MDBX_env MDBX_env;
typedef struct MDBX_txn MDBX_txn;
typedef struct SilkwormHandle SilkwormHandle;

/**
* \brief Initialize the Silkworm C API library.
* \param[in,out] handle Silkworm instance handle returned on successful initialization.
* \return SILKWORM_OK (=0) on success, a non-zero error value on failure.
*/
SILKWORM_EXPORT int silkworm_init(SilkwormHandle** handle) SILKWORM_NOEXCEPT;

struct SilkwormMemoryMappedFile {
const char* file_path;
uint8_t* memory_address;
Expand Down Expand Up @@ -96,6 +92,13 @@ struct SilkwormChainSnapshot {
struct SilkwormTransactionsSnapshot transactions;
};

/**
* \brief Initialize the Silkworm C API library.
* \param[in,out] handle Silkworm instance handle returned on successful initialization.
* \return SILKWORM_OK (=0) on success, a non-zero error value on failure.
*/
SILKWORM_EXPORT int silkworm_init(SilkwormHandle** handle) SILKWORM_NOEXCEPT;

/**
* \brief Build a set of indexes for the given snapshots.
* \param[in] handle A valid Silkworm instance handle, got with silkworm_init.
Expand Down

0 comments on commit f207523

Please sign in to comment.