Skip to content

Commit

Permalink
Better defaults when reached end of classic blocks
Browse files Browse the repository at this point in the history
* Force snapshot save to database when final classic block is reached
* Default to no pruning on arbitrum one and Rinkeby testnet since non-archive classic node isn't useful
* Cleanup some log messages
  • Loading branch information
joshuacolvin0 committed Sep 27, 2022
1 parent 8ce0d72 commit 764f663
Show file tree
Hide file tree
Showing 9 changed files with 92 additions and 33 deletions.
1 change: 1 addition & 0 deletions packages/arb-avm-cpp/cavm/carbstorage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ CArbStorage* createArbStorage(const char* db_path,
coreConfig.test_load_count = arb_core_config.test_load_count;
coreConfig.test_reset_db_except_inbox =
arb_core_config.test_reset_db_except_inbox;
coreConfig.final_block = arb_core_config.final_block;

try {
auto storage = new ArbStorage(string_filename, coreConfig);
Expand Down
1 change: 1 addition & 0 deletions packages/arb-avm-cpp/cavm/carbstorage.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ typedef struct {
int32_t test_run_until;
int32_t test_load_count;
int32_t test_reset_db_except_inbox;
int32_t final_block;
} CArbCoreConfig;

CArbStorage* createArbStorage(const char* db_path,
Expand Down
5 changes: 5 additions & 0 deletions packages/arb-avm-cpp/cmachine/storage.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,10 @@ func stringToPruningMode(mode string) (C.PruningMode, error) {
}

func NewArbStorage(dbPath string, coreConfig *configuration.Core) (*ArbStorage, error) {
return NewArbStorageWithFinalBlock(dbPath, coreConfig, 0)
}

func NewArbStorageWithFinalBlock(dbPath string, coreConfig *configuration.Core, finalBlock uint64) (*ArbStorage, error) {
cDbPath := C.CString(dbPath)
defer C.free(unsafe.Pointer(cDbPath))

Expand Down Expand Up @@ -108,6 +112,7 @@ func NewArbStorage(dbPath string, coreConfig *configuration.Core) (*ArbStorage,
test_run_until: C.int(coreConfig.Test.RunUntil),
test_load_count: C.int(coreConfig.Test.LoadCount),
test_reset_db_except_inbox: boolToCInt(coreConfig.Test.ResetAllExceptInbox),
final_block: C.int(finalBlock),
}

cArbStorage := C.createArbStorage(cDbPath, cConfig)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -200,15 +200,23 @@ class ArbCore {
ArbCore(std::shared_ptr<DataStorage> data_storage_,
ArbCoreConfig coreConfig);

~ArbCore() { abortThread(); }
~ArbCore() {
abortThread();
}
void printDatabaseMetadata();
uint256_t getLastCheckpointL2BlockNumber();
InitializeResult initialize(const LoadedExecutable& executable);
InitializeResult applyConfig();

[[nodiscard]] bool initialized() const;
void operator()();

void printCoreThreadBacktrace();
void printMachineOutputInfo(const std::string& msg,
MachineOutput& machine_output);
void printCheckpointResult(
const char* msg,
const std::variant<rocksdb::Status, CheckpointVariant>& result);

private:
rocksdb::Status initializePruningMode(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,9 @@ struct ArbCoreConfig {
// Delete all database entries except for inbox
bool test_reset_db_except_inbox{false};

// Final classic block before Nitro
uint64_t final_block{0};

// Whether to lazy load the core machine
bool lazy_load_core_machine{false};

Expand Down
79 changes: 53 additions & 26 deletions packages/arb-avm-cpp/data_storage/src/arbcore.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,31 +64,6 @@ void printResult(const char* msg, const ValueResult<T>& result) {
std::cout << result.data << "\n";
}
}

void printMachineOutputInfo(const std::string& msg,
MachineOutput& machine_output) {
std::cout << msg << ", total gas used: " << machine_output.arb_gas_used
<< ", L1 block: " << machine_output.l1_block_number
<< ", L2 block: " << machine_output.l2_block_number
<< ", log count: " << machine_output.log_count
<< ", messages count: "
<< machine_output.fully_processed_inbox.count << ", timestamp: "
<< std::put_time(
localtime((time_t*)&machine_output.last_inbox_timestamp),
"%c")
<< std::endl;
}

void printCheckpointResult(
const char* msg,
const std::variant<rocksdb::Status, CheckpointVariant>& result) {
if (std::holds_alternative<rocksdb::Status>(result)) {
std::cout << std::get<rocksdb::Status>(result).ToString() << "\n";
} else {
auto output = getMachineOutput(std::get<CheckpointVariant>(result));
printMachineOutputInfo(msg, output);
}
}
} // namespace

ArbCore::ArbCore(std::shared_ptr<DataStorage> data_storage_,
Expand Down Expand Up @@ -131,6 +106,37 @@ bool ArbCore::checkError() {
return core_error;
}

void ArbCore::printMachineOutputInfo(const std::string& msg,
MachineOutput& machine_output) {
std::string l2_block_string;
if (machine_output.l2_block_number > coreConfig.final_block) {
l2_block_string = "TERMINAL_BLOCK";
} else {
l2_block_string = to_string(machine_output.l2_block_number, 10);
}
std::cout << msg << ", total gas used: " << machine_output.arb_gas_used
<< ", L1 block: " << machine_output.l1_block_number
<< ", L2 block: " << l2_block_string
<< ", log count: " << machine_output.log_count
<< ", messages count: "
<< machine_output.fully_processed_inbox.count << ", timestamp: "
<< std::put_time(
localtime((time_t*)&machine_output.last_inbox_timestamp),
"%c")
<< std::endl;
}

void ArbCore::printCheckpointResult(
const char* msg,
const std::variant<rocksdb::Status, CheckpointVariant>& result) {
if (std::holds_alternative<rocksdb::Status>(result)) {
std::cout << std::get<rocksdb::Status>(result).ToString() << "\n";
} else {
auto output = getMachineOutput(std::get<CheckpointVariant>(result));
printMachineOutputInfo(msg, output);
}
}

std::string ArbCore::getErrorString() {
if (!core_error) {
return "";
Expand Down Expand Up @@ -275,6 +281,18 @@ void ArbCore::printDatabaseMetadata() {
printCheckpointResult("last checkpoint", getLastCheckpoint(tx));
}

uint256_t ArbCore::getLastCheckpointL2BlockNumber() {
ReadTransaction tx(data_storage);

auto result = getLastCheckpoint(tx);
if (std::holds_alternative<rocksdb::Status>(result)) {
return 0;
}

auto output = getMachineOutput(std::get<CheckpointVariant>(result));
return output.l2_block_number;
}

InitializeResult ArbCore::applyConfig() {
// Use latest existing checkpoint
ValueCache cache{1, 0};
Expand Down Expand Up @@ -310,6 +328,14 @@ InitializeResult ArbCore::applyConfig() {
}

pruning_mode_result = pruningMode(tx);

auto l2BlockNumber = getLastCheckpointL2BlockNumber();
if (l2BlockNumber != 0 && l2BlockNumber >= coreConfig.final_block) {
// Safe to enable lazy loaded core because already fully synced.
std::cout << "final block synced, so lazy load enabled"
<< "\n";
coreConfig.lazy_load_core_machine = true;
}
}

auto pruning_status =
Expand Down Expand Up @@ -1717,7 +1743,8 @@ bool ArbCore::threadBody(ThreadDataStruct& thread_data) {
std::chrono::seconds(coreConfig.database_save_interval);
}

if (trigger_save_rocksdb_checkpoint ||
if (output.l2_block_number >= coreConfig.final_block ||
trigger_save_rocksdb_checkpoint ||
output.arb_gas_used >= thread_data.next_checkpoint_gas) {
// Save checkpoint after checkpoint_gas_frequency gas used
status = saveCheckpoint(tx);
Expand Down
6 changes: 5 additions & 1 deletion packages/arb-node-core/monitor/monitor.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,11 @@ func NewInitializedMonitor(dbDir string, contractFile string, coreConfig *config
}

func NewMonitor(dbDir string, coreConfig *configuration.Core) (*Monitor, error) {
storage, err := cmachine.NewArbStorage(dbDir, coreConfig)
return NewMonitorWithFinalBlock(dbDir, coreConfig, 0)
}

func NewMonitorWithFinalBlock(dbDir string, coreConfig *configuration.Core, finalBlock uint64) (*Monitor, error) {
storage, err := cmachine.NewArbStorageWithFinalBlock(dbDir, coreConfig, finalBlock)
if err != nil {
return nil, err
}
Expand Down
12 changes: 8 additions & 4 deletions packages/arb-rpc-node/cmd/arb-node/arb-node.go
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,7 @@ func startup() error {
config.Core.CheckpointMaxExecutionGas = 0
}

mon, err := monitor.NewMonitor(config.GetDatabasePath(), &config.Core)
mon, err := monitor.NewMonitorWithFinalBlock(config.GetDatabasePath(), &config.Core, config.L2.FinalClassicBlock)
if err != nil {
return err
}
Expand Down Expand Up @@ -289,7 +289,9 @@ func startup() error {
var sequencerFeed chan broadcaster.BroadcastFeedMessage
broadcastClientErrChan := make(chan error)
if len(config.Feed.Input.URLs) == 0 || len(config.Feed.Input.URLs[0]) == 0 {
logger.Warn().Msg("Missing --feed.input.url so not subscribing to feed")
if !config.L2.DisableUpstream {
logger.Warn().Msg("Missing --feed.input.url so not subscribing to feed")
}
} else if config.Node.Type() == configuration.ValidatorNodeType {
logger.Info().Msg("Ignoring feed because running as validator")
} else {
Expand Down Expand Up @@ -341,8 +343,10 @@ func startup() error {
}
}

if err := cmdhelp.UpdatePrunePoint(ctx, rollup, mon.Core); err != nil {
logger.Error().Err(err).Msg("error pruning database")
if config.Core.CheckpointPruningMode == "on" {
if err := cmdhelp.UpdatePrunePoint(ctx, rollup, mon.Core); err != nil {
logger.Error().Err(err).Msg("error pruning database")
}
}

var dataSigner func([]byte) ([]byte, error)
Expand Down
8 changes: 7 additions & 1 deletion packages/arb-util/configuration/configuration.go
Original file line number Diff line number Diff line change
Expand Up @@ -449,7 +449,8 @@ type Config struct {
URL string `koanf:"url"`
} `koanf:"l1"`
L2 struct {
DisableUpstream bool `koanf:"disable-upstream"`
FinalClassicBlock uint64 `koanf:"final-classic-block"`
DisableUpstream bool `koanf:"disable-upstream"`
} `koanf:"l2"`
Log Log `koanf:"log"`
Node Node `koanf:"node"`
Expand Down Expand Up @@ -705,7 +706,9 @@ func ParseNonRelay(ctx context.Context, f *flag.FlagSet, defaultWalletPathname s
if l1ChainId.Cmp(big.NewInt(1)) == 0 {
err := k.Load(confmap.Provider(map[string]interface{}{
"bridge-utils-address": "0x84efa170dc6d521495d7942e372b8e4b2fb918ec",
"core.checkpoint-pruning-mode": "off",
"feed.input.url": []string{},
"l2.final-classic-block": 22207816,
"l2.disable-upstream": true,
"node.aggregator.inbox-address": "0x4Dbd4fc535Ac27206064B68FfCf827b0A60BAB3f",
"node.chain-id": "42161",
Expand All @@ -725,7 +728,9 @@ func ParseNonRelay(ctx context.Context, f *flag.FlagSet, defaultWalletPathname s
} else if l1ChainId.Cmp(big.NewInt(4)) == 0 {
err := k.Load(confmap.Provider(map[string]interface{}{
"bridge-utils-address": "0xA556F0eF1A0E37a7837ceec5527aFC7771Bf9a67",
"core.checkpoint-pruning-mode": "off",
"feed.input.url": []string{},
"l2.final-classic-block": 13919177,
"l2.disable-upstream": true,
"node.aggregator.inbox-address": "0x578BAde599406A8fE3d24Fd7f7211c0911F5B29e",
"node.chain-id": "421611",
Expand Down Expand Up @@ -1000,6 +1005,7 @@ func beginCommonParse(f *flag.FlagSet) (*koanf.Koanf, error) {
f.String("log.rpc", "info", "log level for rpc")
f.String("log.core", "info", "log level for general arb node logging")

f.Int("l2.final-classic-block", 0, "last classic block before Nitro conversion")
f.Bool("l2.disable-upstream", false, "disable feed and transaction forwarding")

f.Bool("pprof-enable", false, "enable profiling server")
Expand Down

0 comments on commit 764f663

Please sign in to comment.