Navigation Menu

Skip to content

Commit

Permalink
progress
Browse files Browse the repository at this point in the history
  • Loading branch information
hoytech committed May 10, 2016
1 parent e651bb1 commit f5b65a0
Show file tree
Hide file tree
Showing 6 changed files with 268 additions and 19 deletions.
18 changes: 8 additions & 10 deletions TODO
Expand Up @@ -5,16 +5,14 @@ command line ui:
* Improve help output.. should show "vmprobe [cmd] <args>" example template

curses ui:
* probe screens

needs latest:
* real-time file list
* super expanded version of file that takes up whole screen

needs history
* history of single file
* real-time file-based deltas
* snapshot history viewer
probe screens:
needs latest:
* real-time file list
* super expanded version of file that takes up whole screen
needs history
* history of single file
* real-time file-based deltas
* snapshot history viewer
? paged scrolling

snapshots:
Expand Down
35 changes: 27 additions & 8 deletions Vmprobe/lib/Vmprobe/DB/Base.pm
Expand Up @@ -209,7 +209,6 @@ sub iterate_dups {
my ($self, $params) = @_;

die "DB not declared dup_keys" if !$self->dup_keys();
die "need offset" if !defined $params->{offset};


my $cursor = $self->{db}->Cursor;
Expand All @@ -219,18 +218,38 @@ sub iterate_dups {

$key = $params->{key} // die "need key to iterate over dups";

$value = $params->{offset};
if ($params->{offset}) {
die "offset doesn't support reverse yet" if defined $params->{reverse};

eval {
$cursor->get($key, $value, MDB_SET_RANGE);
};
$value = $params->{offset};

return if $@;
eval {
$cursor->get($key, $value, MDB_SET_RANGE);
};

return if $@;

$params->{cb}->($key, ${ $self->_decode_value(\$value) }) if $value ne $params->{offset};
} else {
eval {
$cursor->get($key, $value, MDB_SET);
};

return if $@;

if ($params->{reverse}) {
eval {
$cursor->get($key, $value, MDB_LAST_DUP);
};

$params->{cb}->($key, ${ $self->_decode_value(\$value) }) if $value ne $params->{offset};
return if $@;
}

$params->{cb}->($key, ${ $self->_decode_value(\$value) });
}


my $direction = MDB_NEXT_DUP;
my $direction = $params->{reverse} ? MDB_PREV_DUP : MDB_NEXT_DUP;

while(1) {
eval {
Expand Down
2 changes: 1 addition & 1 deletion Vmprobe/lib/Vmprobe/Viewer.pm
Expand Up @@ -83,7 +83,7 @@ sub open_probe_screen {
sub close_page {
my ($self) = @_;

return if @{ $self->{notebook}->{-pages} } <= 1;
exit if @{ $self->{notebook}->{-pages} } <= 1;

my $page_id = $self->{notebook}->active_page;

Expand Down
26 changes: 26 additions & 0 deletions Vmprobe/lib/Vmprobe/Viewer/Probe.pm
Expand Up @@ -42,6 +42,7 @@ sub new {
});

$self->find_new_entries();
$self->collect_entries();

return $self;
}
Expand All @@ -63,6 +64,10 @@ sub draw {
$curr_line += 2;
}

foreach my $entry (@{ $self->{entries} }) {
$self->{-canvasscr}->addstring($curr_line, 0, "WERD $entry");
$curr_line++;
}

$self->{-canvasscr}->noutrefresh();

Expand All @@ -84,6 +89,27 @@ sub buckets_to_rendered {



sub collect_entries {
my ($self) = @_;

my $txn = new_lmdb_txn();

my $entry_db = Vmprobe::DB::Entry->new($txn);

ITER: {
Vmprobe::DB::EntryByProbe->new($txn)->iterate_dups({
key => $self->{probe_id},
reverse => 1,
cb => sub {
my ($k, $v) = @_;

push @{ $self->{entries} }, $v;
},
});
}
}


sub find_new_entries {
my ($self) = @_;

Expand Down
175 changes: 175 additions & 0 deletions Vmprobe/lib/Vmprobe/Viewer/Probe/Base.pm
@@ -0,0 +1,175 @@
package Vmprobe::Viewer::Probe::Base;

use common::sense;

use Curses;

use Vmprobe::Util;
use Vmprobe::RunContext;
use Vmprobe::DB::Probe;
use Vmprobe::DB::Entry;

use parent 'Curses::UI::Widget';


sub new {
my ($class, %userargs) = @_;

my %args = (
%userargs,
);

my $self = $class->SUPER::new( %args );

die "need to provide probe_id" if !defined $self->{probe_id};

{
my $txn = new_lmdb_txn();

$self->{summary} = Vmprobe::DB::Probe->new($txn)->get($self->{probe_id});

$txn->commit;
}

$self->{new_entry_watcher} = switchboard->listen("probe-$self->{probe_id}", sub {
$self->find_new_entries();
$self->draw(0) if !$self->hidden && $self->in_topwindow;
});

$self->backfill_entries($self->history_size());

return $self;
}


sub draw {
my $self = shift;
my $no_doupdate = shift || 0;

$self->SUPER::draw(1) or return $self;
$self->{-canvasscr}->noutrefresh();

$self->render($self->{-canvasscr});

doupdate() unless $no_doupdate;
}



sub history_size { 1 }


sub render {
die "must implement render";
}


sub process_entry {
die "must implement process_entry";
}


sub backfill_entries {
my ($self, $history_size) = @_;

my $txn = new_lmdb_txn();

my @entry_ids;

ITER: {
Vmprobe::DB::EntryByProbe->new($txn)->iterate_dups({
key => $self->{probe_id},
reverse => 1,
cb => sub {
my ($k, $v) = @_;

push @entry_ids, $v;

last ITER if @entry_ids > $history_size;
},
});
}

my $entry_db = Vmprobe::DB::Entry->new($txn);

foreach my $entry_id (reverse @entry_ids) {
my $entry = $entry_db->get($entry_id);

$self->{last_seen_entry} = $entry_id;
$self->process_entry($entry);
}
}


sub find_new_entries {
my ($self) = @_;

my $txn = new_lmdb_txn();

my $entry_db = Vmprobe::DB::Entry->new($txn);

Vmprobe::DB::EntryByProbe->new($txn)->iterate_dups({
key => $self->{probe_id},
offset => $self->{last_seen_entry},
cb => sub {
my ($k, $v) = @_;

my $entry = $entry_db->get($v);

$self->{last_seen_entry} = $v;
$self->process_entry($entry);
},
});

$txn->commit;
}




=pod
my $curr_line = 0;
my $parsed = Vmprobe::Cache::Snapshot::parse_records($self->{latest_entry}{data}{snapshots}{mincore}, $self->width, 100);
foreach my $record (@$parsed) {
$self->{-canvasscr}->addstring($curr_line, 0, "$self->{summary}->{params}->{path}$record->{filename} " . pages2size($record->{num_resident_pages}) . "/" . pages2size($record->{num_pages}));
$self->{-canvasscr}->addstring($curr_line+1, 0, buckets_to_rendered($record));
$curr_line += 2;
}
foreach my $entry (@{ $self->{entries} }) {
$self->{-canvasscr}->addstring($curr_line, 0, "WERD $entry");
$curr_line++;
}
sub buckets_to_rendered {
my ($parsed) = @_;
return join('',
map {
$_ == 0 ? ' ' :
$_ == $parsed->{pages_per_bucket} ? "\x{2588}" :
chr(0x2581 + int(8 * $_ / $parsed->{pages_per_bucket}))
}
@{ $parsed->{buckets} });
}
sub process_new_entry {
my ($self, $entry) = @_;
$self->{latest_entry} = $entry;
}
=cut



1;
31 changes: 31 additions & 0 deletions Vmprobe/lib/Vmprobe/Viewer/Probe/EntryList.pm
@@ -0,0 +1,31 @@
package Vmprobe::Viewer::Probe::EntryList;

use common::sense;

use parent 'Vmprobe::Viewer::Probe::Base';



sub history_size {
my ($self) = @_;

return $self->height;
}


sub process_entry {
my ($self, $entry) = @_;

}


sub render {
my ($self, $canvas) = @_;

my $curr_line = 0;

}



1;

0 comments on commit f5b65a0

Please sign in to comment.