Skip to content

Commit dfcc848

Browse files
msotheeswaran-scJohn Sully
authored andcommitted
enable level_compaction_dynamic_level_bytes after flush, and flush expires for FLASH (#229)
* enable level_compaction_dynamic_level_bytes after flush, and flush expires * update debug reload for flash * update debug reload for flash complete * missing forward declare * commit existing changes then track changes for debug reload * missing args * commitChanges is conditional Co-authored-by: John Sully <jsully@snapchat.com>
1 parent e7f90f0 commit dfcc848

2 files changed

Lines changed: 76 additions & 19 deletions

File tree

src/debug.cpp

Lines changed: 65 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ void printCrashReport(void);
7979
void bugReportEnd(int killViaSignal, int sig);
8080
void logStackTrace(void *eip, int uplevel);
8181
void getTempFileName(char tmpfile[], int tmpfileNum);
82+
bool initializeStorageProvider(const char **err);
8283

8384
/* ================================= Debugging ============================== */
8485

@@ -535,29 +536,74 @@ NULL
535536
return;
536537
}
537538
}
539+
540+
if (g_pserver->m_pstorageFactory) {
541+
protectClient(c);
538542

539-
/* The default behavior is to save the RDB file before loading
540-
* it back. */
541-
if (save) {
542-
rdbSaveInfo rsi, *rsiptr;
543-
rsiptr = rdbPopulateSaveInfo(&rsi);
544-
if (rdbSave(nullptr, rsiptr) != C_OK) {
545-
addReply(c,shared.err);
546-
return;
543+
for (int idb = 0; idb < cserver.dbnum; ++idb) {
544+
if (g_pserver->db[idb]->processChanges(false))
545+
g_pserver->db[idb]->commitChanges();
546+
g_pserver->db[idb]->storageProviderDelete();
547547
}
548-
}
548+
delete g_pserver->metadataDb;
549549

550-
/* The default behavior is to remove the current dataset from
551-
* memory before loading the RDB file, however when MERGE is
552-
* used together with NOFLUSH, we are able to merge two datasets. */
553-
if (flush) emptyDb(-1,EMPTYDB_NO_FLAGS,NULL);
550+
if (flush) emptyDb(-1,EMPTYDB_NO_FLAGS,NULL);
554551

555-
protectClient(c);
556-
int ret = rdbLoadFile(g_pserver->rdb_filename,NULL,flags);
557-
unprotectClient(c);
558-
if (ret != C_OK) {
559-
addReplyError(c,"Error trying to load the RDB dump");
560-
return;
552+
delete g_pserver->m_pstorageFactory;
553+
554+
const char *err;
555+
if (!initializeStorageProvider(&err))
556+
{
557+
serverLog(LL_WARNING, "Failed to initialize storage provider: %s",err);
558+
exit(EXIT_FAILURE);
559+
}
560+
561+
g_pserver->metadataDb = g_pserver->m_pstorageFactory->createMetadataDb();
562+
for (int idb = 0; idb < cserver.dbnum; ++idb)
563+
{
564+
int dbid = idb;
565+
std::string dbid_key = "db-" + std::to_string(idb);
566+
g_pserver->metadataDb->retrieve(dbid_key.c_str(), dbid_key.length(), [&](const char *, size_t, const void *data, size_t){
567+
dbid = *(int*)data;
568+
});
569+
delete g_pserver->db[idb];
570+
g_pserver->db[idb] = new (MALLOC_LOCAL) redisDb();
571+
g_pserver->db[idb]->initialize(dbid);
572+
}
573+
574+
moduleFireServerEvent(REDISMODULE_EVENT_LOADING, REDISMODULE_SUBEVENT_LOADING_FLASH_START, NULL);
575+
for (int idb = 0; idb < cserver.dbnum; ++idb)
576+
{
577+
g_pserver->db[idb]->storageProviderInitialize();
578+
g_pserver->db[idb]->trackChanges(false);
579+
}
580+
moduleFireServerEvent(REDISMODULE_EVENT_LOADING, REDISMODULE_SUBEVENT_LOADING_ENDED, NULL);
581+
582+
unprotectClient(c);
583+
} else {
584+
/* The default behavior is to save the RDB file before loading
585+
* it back. */
586+
if (save) {
587+
rdbSaveInfo rsi, *rsiptr;
588+
rsiptr = rdbPopulateSaveInfo(&rsi);
589+
if (rdbSave(nullptr, rsiptr) != C_OK) {
590+
addReply(c,shared.err);
591+
return;
592+
}
593+
}
594+
595+
/* The default behavior is to remove the current dataset from
596+
* memory before loading the RDB file, however when MERGE is
597+
* used together with NOFLUSH, we are able to merge two datasets. */
598+
if (flush) emptyDb(-1,EMPTYDB_NO_FLAGS,NULL);
599+
600+
protectClient(c);
601+
int ret = rdbLoadFile(g_pserver->rdb_filename,NULL,flags);
602+
unprotectClient(c);
603+
if (ret != C_OK) {
604+
addReplyError(c,"Error trying to load the RDB dump");
605+
return;
606+
}
561607
}
562608
serverLog(LL_WARNING,"DB reloaded by DEBUG RELOAD");
563609
addReply(c,shared.ok);

src/storage/rocksdb.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,11 +149,22 @@ size_t RocksDBStorageProvider::clear()
149149

150150
rocksdb::ColumnFamilyHandle *handle = nullptr;
151151
rocksdb::ColumnFamilyOptions cf_options(m_pfactory->RocksDbOptions());
152+
cf_options.level_compaction_dynamic_level_bytes = true;
152153
m_spdb->CreateColumnFamily(cf_options, strName, &handle);
153154
m_spcolfamily = std::shared_ptr<rocksdb::ColumnFamilyHandle>(handle);
154155

155156
if (!status.ok())
156157
throw status.ToString();
158+
159+
status = m_spdb->DropColumnFamily(m_spexpirecolfamily.get());
160+
strName = m_spexpirecolfamily->GetName();
161+
162+
m_spdb->CreateColumnFamily(cf_options, strName, &handle);
163+
m_spexpirecolfamily = std::shared_ptr<rocksdb::ColumnFamilyHandle>(handle);
164+
165+
if (!status.ok())
166+
throw status.ToString();
167+
157168
m_count = 0;
158169
return celem;
159170
}

0 commit comments

Comments
 (0)