We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
目前的TSDB提供了一些迭代器函数如fdb_tsl_iter/reverse(),通过它们虽然可以实现遍历,读取等很多功能。但是在回调中处理tsl,很难满足很多应用的使用,比如这个例子: tsdb中有100个数据,需要通过网络进行上送到服务器
fdb_tsl_iter/reverse()
上述例子中,用户必须在回调函数中一气呵成,否则:
总之,如果在数据库中的某个中间点上进行顺序的向下读取,使用上述函数就会变的很困难且低效。
因此,我们是否可以增加一些更便利的迭代器函数,使其实现如下功能:
但因为追加可能是异步的,上面的函数可能会有面临如下一些问题:
如何检测cur_tsl所在扇区被重写,我的思路如下:
检测到后如何处理,我的思路如下:
当然,我认为,用户应该在使用时尽量避免这种情况
对于上面的问题,你有更好的解决思路吗?下面是我的一些简单实现思路,代码进行了简单测试,目前看起来可以实现上述问题
/* 代码实现 */ struct fdb_tsl fdb_tsl_next_find(fdb_tsdb_t db, fdb_tsl_t prestl) { bool index_flag = false; struct tsdb_sec_info sector; uint32_t sec_addr, traversed_len = 0; struct fdb_tsl tsl; tsl.status = FDB_TSL_UNUSED; if (!prestl) return tsl; if (!db_init_ok(db)) { FDB_INFO("Error: TSL (%s) isn't initialize OK.\n", db_name(db)); } db_lock(db); tsl.addr.index = prestl->addr.index; read_tsl(db, &tsl); if (tsl.status != FDB_TSL_UNUSED && tsl.time == prestl->time) { sec_addr = FDB_ALIGN_DOWN(tsl.addr.index, db_sec_size(db)); index_flag = true; } else { sec_addr = db_oldest_addr(db); } do { traversed_len += db_sec_size(db); if (read_sector_info(db, sec_addr, §or, false) != FDB_NO_ERR) { index_flag = false; continue; } if (sector.status == FDB_SECTOR_STORE_USING || sector.status == FDB_SECTOR_STORE_FULL) { if (sector.status == FDB_SECTOR_STORE_USING) { /* copy the current using sector status */ sector = db->cur_sec; } if (index_flag) { index_flag = false; tsl.addr.index = get_next_tsl_addr(§or, &tsl); } else { tsl.addr.index = sector.addr + SECTOR_HDR_DATA_SIZE; } if (tsl.addr.index != FAILED_ADDR) { read_tsl(db, &tsl); db_unlock(db); return tsl; } } if (sec_addr == db->cur_sec.addr) { break; } } while ((sec_addr = get_next_sector_addr(db, §or, traversed_len)) != FAILED_ADDR); db_unlock(db); tsl.status = FDB_TSL_UNUSED; return tsl; }
The text was updated successfully, but these errors were encountered:
想法非常赞的,考虑的也很完善
检测到被重写后,直接返回下一个最老的tsl,或者直接告诉用户被覆盖了
我觉得可能要看当前 TSDB 模式,我觉得可以增加一个入参,比如回滚模式。为真时,可以直接返回最老的 TSL ,否则是不是直接 返回空
Sorry, something went wrong.
No branches or pull requests
目前的TSDB提供了一些迭代器函数如
fdb_tsl_iter/reverse()
,通过它们虽然可以实现遍历,读取等很多功能。但是在回调中处理tsl,很难满足很多应用的使用,比如这个例子:tsdb中有100个数据,需要通过网络进行上送到服务器
上述例子中,用户必须在回调函数中一气呵成,否则:
总之,如果在数据库中的某个中间点上进行顺序的向下读取,使用上述函数就会变的很困难且低效。
因此,我们是否可以增加一些更便利的迭代器函数,使其实现如下功能:
这样就可以完美的解决如下功能。
但因为追加可能是异步的,上面的函数可能会有面临如下一些问题:
如何检测cur_tsl所在扇区被重写,我的思路如下:
检测到后如何处理,我的思路如下:
当然,我认为,用户应该在使用时尽量避免这种情况
对于上面的问题,你有更好的解决思路吗?下面是我的一些简单实现思路,代码进行了简单测试,目前看起来可以实现上述问题
The text was updated successfully, but these errors were encountered: