I want to make the binary data in vlog or sst human readable .
Then I can use it to do some check or help me find bugs .
Is there any tools or sample code or docs to make do this?
just like readelf for elffile.
Hi @BlankRain, you may want to look at badger info
command.
okay, I will try later .
Thank you. It’s nice.
@Naman Is there anyway to know the data type of my data stored in badger? It’s all bytes.
[2020-09-28T17:26:47+08:00] MANIFEST 94 B MA
[ 3 minutes earlier] 000004.sst 966 B L1
[ now] 000000.vlog 2.8 kB VL
[EXTRA]
[2020-09-28T17:22:48+08:00] KEYREGISTRY 28 B
[Summary]
Level 0 size: 0 B
Level 1 size: 966 B
Total index size: 966 B
Value log size: 2.8 kB
Abnormalities:
1 extra file.
0 missing files.
0 empty files.
0 truncated manifests.
badger 2020/09/30 12:09:23 INFO: All 1 tables opened in 2ms
badger 2020/09/30 12:09:23 INFO: Replaying file id: 0 at offset: 2783
badger 2020/09/30 12:09:23 INFO: Replay took: 8.656µs
SSTable [Li, Id, Total Keys including internal keys] [Left Key, Version -> Right Key, Version]
SSTable [L1, 004, 0000028] [0000000000000001000000000000000000000000, v2 -> 726166746964, v1]
key="\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", version=2, meta=40 size: 26 meta: b0000
key="\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01", version=3, meta=40 size: 61 meta: b0000
key="\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02", version=4, meta=40 size: 26 meta: b0000
key="\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03", version=5, meta=40 size: 90 meta: b0000
key="\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04", version=6, meta=40 size: 72 meta: b0000
key="\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05", version=7, meta=40 size: 84 meta: b0000
key="\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06", version=8, meta=40 size: 90 meta: b0000
key="\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a", version=9, meta=40 size: 56 meta: b0000
key="\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\b", version=10, meta=40 size: 69 meta: b0000
key="\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t", version=11, meta=40 size: 80 meta: b0000
key="\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n", version=12, meta=40 size: 76 meta: b0000
key="\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\v", version=15, meta=40 size: 26 meta: b0000
key="\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\f", version=16, meta=40 size: 88 meta: b0000
key="\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\r", version=17, meta=40 size: 90 meta: b0000
key="\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e", version=18, meta=40 size: 56 meta: b0000
key="\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f", version=19, meta=40 size: 56 meta: b0000
key="\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10", version=20, meta=40 size: 63 meta: b0000
key="\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11", version=21, meta=40 size: 60 meta: b0000
key="\x00\x00\x00\x00\x00\x00\x00\x01hs\x00\x00\x00\x00", version=21, meta=40 size: 20 meta: b0000
key="raftid", version=1, meta=40 size: 14 meta: b0000
[Summary]
Total Number of keys: 20
In badger, we put bytes to bytes.
txn := db.NewTransaction(true)
defer txn.Discard()
// Use the transaction...
err := txn.Set([]byte(key), []byte(value))
If the key is string ,like “raftid”, it’s nice to read, However, if It’s bytes created by binary.BigEndian.PutUint32(b[0:8], uint32(value))
or something else. It’s not easy to read.
It can convert the bytes to a string or an int.
Question A: How can I get the final type of the data in badger?
Question B: what’s the data in p, zw ,w
?
I want to make a dgraph viewer in key-value level.
You cannot. Badger is a key-value store and does not store the type info. To it every key is a byte.
zw
directory stores the RAFT information for zero while w
stores the same for alpha. Dgraph stores the data in form of posting lists in the p
directory.
That’s great!! To learn about posting lists, you might want to look at Data Storage section in Dgraph paper. Copying from paper, here is an example
<0x01> <follower> <0xab> .
<0x01> <follower> <0xbc> .
<0x01> <follower> <0xcd> .
...
key = <follower, 0x01>
value = <0xab, 0xbc, 0xcd, ...>
Feel free for follow up questions.
okay, Thank you. I will try it later.
I find dgraph debug
can read and print the key-values in badger.
p is posting
w is write ahead log for alpha
zw is write ahead log for zero
It’s a nice tool.