Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F4819876
Masterwork From Distant Lands
No One
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Authored By
Eevans
Nov 21 2016, 9:51 PM
2016-11-21 21:51:19 (UTC+0)
Size
2 KB
Referenced Files
None
Subscribers
None
Masterwork From Distant Lands
View Options
#!/usr/bin/env python
import
datetime
import
logging
import
json
import
os
import
subprocess
import
sys
import
yaml
CREOLE_JAR
=
"/home/eevans/creole-cli-1.0.0-SNAPSHOT-jar-with-dependencies.jar"
SSUTIL_JAR
=
"/home/eevans/twcs-inspector-1.0.0-SNAPSHOT.jar"
os
.
environ
[
"FORMAT"
]
=
"json"
logging
.
basicConfig
(
level
=
logging
.
DEBUG
)
def
discover_instance_jmx
(
directory
):
for
name
in
os
.
listdir
(
"/etc/cassandra-instances.d"
):
if
not
name
.
endswith
(
".yaml"
):
continue
with
open
(
os
.
path
.
join
(
"/etc/cassandra-instances.d"
,
name
))
as
f
:
y
=
yaml
.
load
(
f
)
for
data_directory
in
y
[
"data_file_directories"
]:
if
directory
.
startswith
(
data_directory
):
return
y
[
"jmx_port"
]
return
-
1
def
setup
(
directory
):
# TODO: validate jars are present
# TODO: validate existence, readability, of directory supplied
# TODO: lock, so that we do not trample upon another long-running instance
pass
def
main
():
if
len
(
sys
.
argv
)
!=
2
:
print
>>
sys
.
stderr
,
"Usage: {} <directory>"
.
format
(
sys
.
argv
[
0
])
sys
.
exit
(
1
)
directory
=
sys
.
argv
[
1
]
setup
(
directory
)
__ms_to_date
=
lambda
ms
:
datetime
.
datetime
.
fromtimestamp
(
int
(
ms
)
/
1e3
)
.
strftime
(
"%Y-%m-
%d
"
)
tables
=
json
.
loads
(
subprocess
.
check_output
([
"java"
,
"-jar"
,
SSUTIL_JAR
,
directory
]))
if
not
len
(
tables
)
>
2
:
logging
.
warn
(
"too few windows to begin a new compaction"
)
return
1
windows
=
sorted
(
tables
.
keys
())
candidates
=
[]
data_files
=
[]
for
candidate
in
windows
[:
len
(
windows
)
-
1
]:
# This should be all but the most current window, each of which should have
# been compacted down to a single table. If that is not the case (perhaps),
# the compaction is on-going, then exclude the window for this iteration.
if
len
(
tables
[
candidate
])
>
1
:
logging
.
warn
(
"window starting
%s
hasn't been fully compacted, stopping here..."
,
__ms_to_date
(
candidate
))
# Do not consider any later windows, either...
break
candidates
.
append
(
candidate
)
table
=
tables
[
candidate
][
0
]
logging
.
debug
(
"adding window starting
%s
, data file
%s
(
%s
percent droppable)"
,
__ms_to_date
(
candidate
),
table
[
"dataFileName"
],
table
[
"estimatedDroppableTombstones"
]
*
100
)
data_files
.
append
(
os
.
path
.
join
(
directory
,
table
[
"dataFileName"
]))
if
len
(
data_files
)
<
2
:
logging
.
warn
(
"not enough candidates for compaction, exiting..."
)
return
0
jmx_port
=
discover_instance_jmx
(
directory
)
if
jmx_port
<
0
:
logging
.
error
(
"Unable to detect instance from directory"
)
return
1
subprocess
.
call
([
"java"
,
"-jar"
,
CREOLE_JAR
,
"-H"
,
"localhost"
,
"-P"
,
str
(
jmx_port
),
"user-compaction"
]
+
data_files
)
return
0
if
__name__
==
"__main__"
:
sys
.
exit
(
main
())
File Metadata
Details
Attached
Mime Type
text/plain; charset=utf-8
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
4154231
Default Alt Text
Masterwork From Distant Lands (2 KB)
Attached To
Mode
P4485 back-compact
Attached
Detach File
Event Timeline
Log In to Comment