smartcontract 를 실행했을때 아래와 같이 print가 출력되지 않는 경우가 있는데,

okayjava@EOS-VM1:~/eos/eosio-cli-helper$ ./cleos.sh push action eos1okayjava hi '["eos1okayjava"]' -p eos1okayjava

executed transaction: 97dda555a72b685ba530b8341c75bb6b710700f58f99b566511fade8cba06479  104 bytes  845 us

#  eos1okayjava <= eos1okayjava::hi             {"user":"eos1okayjava"}

warning: transaction executed locally, but may not be confirmed by the network yet    ] 

okayjava@EOS-VM1:~/eos/eosio-cli-helper$ 


이럴땐 아래와 같이 수정 한 후 nodeos 를 재실행 한다.


1) config.ini 수정

contracts-console=1 를 추가 해주거나,


2) nodeos 실행시 

--contracts-console 붙여서 실행을 시킨다.

jungle@EOS-VM1:~/JungleTestnet-eosrocomokr1$  ps -ef | grep nodeos

jungle    4898     1  2 04:31 pts/10   00:00:12 /home/jungle/eos-source/build/programs/nodeos/nodeos --data-dir /home/jungle/JungleTestnet-eosrocomokr1 --config-dir /home/jungle/JungleTestnet-eosrocomokr1 --contracts-console


okayjava@EOS-VM1:~/eos/eosio-cli-helper$ ./cleos.sh push action eos1okayjava hi '["eos1okayjava"]' -p eos1okayjava

executed transaction: 91154a4b084792be4051eabdd06fbca6a7a57c45a1fda91e6d721f5377458120  104 bytes  523 us

#  eos1okayjava <= eos1okayjava::hi             {"user":"eos1okayjava"}

>> Hello, World eos1okayjava

warning: transaction executed locally, but may not be confirmed by the network yet    ] 

okayjava@EOS-VM1:~/eos/eosio-cli-helper$  




현상

eclipse에서 변경파일을 커밋하려고 하는데 locked 관련 오류가 나면서 커밋이 안된다.


원인

이전에 커밋할려다 시간이 오래걸려서 eclipse를 강제로 재시작한 경우가 있다. 이때 커밋대상 파일에 대해 lock이 걸렸을 것으로 추정함


해결

1. 프로젝트 우클릭 > team > cleanup

=> 실패 : 아무런 반응 없음


2. 대상 파일 삭제후 서버에서 다시 업데이트 받음

=> 실패 : lock이 걸려서 파일 삭제 불가


3. sqlite 클라이언트 다운로드

http://sqlitebrowser.org/ : 다운로드 속도가 안될 경우 아래 주소에서 다운로드

https://sourceforge.net/projects/sqlitedbrowser/ : 위 주소보다 버전은 낮지만 작업하는데 문제는 없다.


- 로컬 PC에 설치(압축해제)한 후 프로그램 실행

- File > Open Database > 대상 프로젝트 루트 경로의 .svn 폴더 아래에 있는 wc.db 파일을 선택

- Execute SQL 탭을 선택 후 아래 SQL 실행


DELETE FROM WORK_QUEUE;


=> 실패 : 대상 자료가 없음


4. 아래 SQL 실행


DELETE FROM WC_LOCK;


=> 성공 : 1개 데이타 삭제함


※ 혹시 그래도 안되면 4번까지 실행 후 1번 재실행



출처: http://finkle.tistory.com/124 [삽질은 내친구]

몇가지 테스트를 해보았다.


1. Explain


MariaDB [performance_test]> EXPLAIN SELECT SQL_NO_CACHE COUNT(id)

    -> FROM performance_test

    -> WHERE date_type_date > '2000-06-01 00:00:00'

    ->   AND date_type_date < '2000-07-01 00:00:00'

    -> ;

+------+-------------+------------------+-------+----------------+----------------+---------+------+----------+--------------------------+

| id   | select_type | table            | type  | possible_keys  | key            | key_len | ref  | rows     | Extra                    |

+------+-------------+------------------+-------+----------------+----------------+---------+------+----------+--------------------------+

|    1 | SIMPLE      | performance_test | range | date_type_date | date_type_date | 8       | NULL | 25207266 | Using where; Using index |

+------+-------------+------------------+-------+----------------+----------------+---------+------+----------+--------------------------+

1 row in set (0.00 sec)


MariaDB [performance_test]> EXPLAIN SELECT SQL_NO_CACHE COUNT(id)

    -> FROM performance_test

    -> WHERE int_type_date > UNIX_TIMESTAMP('2000-06-01 00:00:00')

    ->   AND int_type_date < UNIX_TIMESTAMP('2000-07-01 00:00:00')

    -> ;

+------+-------------+------------------+-------+---------------+---------------+---------+------+----------+--------------------------+

| id   | select_type | table            | type  | possible_keys | key           | key_len | ref  | rows     | Extra                    |

+------+-------------+------------------+-------+---------------+---------------+---------+------+----------+--------------------------+

|    1 | SIMPLE      | performance_test | range | int_type_date | int_type_date | 4       | NULL | 24998328 | Using where; Using index |

+------+-------------+------------------+-------+---------------+---------------+---------+------+----------+--------------------------+

1 row in set (0.00 sec)


MariaDB [performance_test]>



두가지 형태를 explain을 해본결과 인덱싱은 동일하게 타지만, key_len이 달랐다.

datetime은 8byte 이고, int는 4byte 이다. (음.. 그럼 bigint 로 하게되면 유사한 결과가 나올지. 나중에 한번 더 해봐야 겟다.)

아무래도 포현범위가 크게 되면 메모리사용량이 많아 지게 되고 I/O도 그에 준하게 발생 할것이여서 가능하면 대용량 데이터를 컨트롤 할때는 숫자형이라도 tinyint ~ bigint 까지 적절히 사용하는것이 좋겠다.


unixtime을 int 형태로 표현 할 수 있는 이유는

"1970-01-01 00:00:00 GMT" 에서 부터 1초씩 증가해서 "2038-01-19 03:14:07" 까지 이고

해당 값음 ,

(1970-01-01 이전 날짜는 -로 표현 된다. )

이유는 32비트 int 형태의 정수표현범위 -2147483646 ~ 2147483647 까지 이기 때문이다,

따라서, 위의 시간이 지나게 되면, 이론적으로는 다시 -2147483646로 표현된다. 

그러면 과거 첫날짜가 되야 되는데.. MySQL은 Null 이라고 하네. 희얀한데... 학교에서는 다시 꺼구로 돌아가는것으로 배웠는데.



이유는 signed int 2147483646는 이진수로 "0111 1111 1111 1111 1111 1111 1111 1111"인데, 여기에 1을 더하면

"1000 0000 0000 0000 0000 0000 0000 0000" 이 되어야 하는데 제일 앞 bit는 Sign bit 임으로 1이면 - 가 된다.(맞나?) ㅋㅋ

(이게 Signed 일때와 unSign 일때 처리 방법이 달라지는데, 너무 오래 전에 배운것이라 기억이 정확하진 않지만,

여하튼 숫자 범위가 넘어가면 더 이상 증가 하지 않는다. 강제로 증가를 시키게 되면 overflow 가 발생 한다.)



unixtime은 2038년 이후를 고려하지 않아도 될 경우에만 사용하도록 한다.

보통 S/W lifecycle 은 5년임으로 최소한 2033년 까지는 걱정 안해도 되지 않을까? ^^(이기적인 생각)

내 나이 50이 넘어서까지 코딩을 하고 있을면...........

그리고 이 세상에 천재같은 사람들이 Y2K때 처럼 기가 막힌 방법을 만들어 낼것이기 때문에 크게 걱정할 필요가 없다.


2. BETWEEN

결론부터 말하면 생각하지 못했던 결과가 나왔다

그 동안 책에서 읽어서, 경험적으로 구간 검색은 between을 사용하는게 효율이 좋다는것을 알고 있었으나 

아래 결과로 확실한 결과가 나왔다.

MariaDB [performance_test]> SELECT SQL_NO_CACHE COUNT(id)

    -> FROM performance_test

    -> WHERE date_type_date between '2000-06-01 00:00:00' AND '2000-07-01 00:00:00'

    -> ;

+-----------+

| COUNT(id) |

+-----------+

|  12960005 |

+-----------+

1 row in set (3.55 sec)


MariaDB [performance_test]> SELECT SQL_NO_CACHE COUNT(id)

    -> FROM performance_test

    -> WHERE int_type_date BETWEEN UNIX_TIMESTAMP('2000-06-01 00:00:00') AND UNIX_TIMESTAMP('2000-07-01 00:00:00')

    -> ;

+-----------+

| COUNT(id) |

+-----------+

|  12960005 |

+-----------+

1 row in set (3.35 sec)


MariaDB [performance_test]>

datetime 을 산술연산자로 비교하는 것보다 between을 사용하는것이 효율이 훨씬 좋왔다.


condition

 datetime / > , <

 datetime / between

unixtime / between

 unixtime / > , <

 Result

 13.61s

 3.55s

 3.35s

 3.14s

여러번 수행하면 약간씩의 차이는 있으나, 전체적인 검색 우위에 영향을 주는 범위는 아니였다.


결론. datetime을 대소 비교로 구간 검색을 할 경우 데이터가 누적 될수록 속도가 현저히 느려지는 현상이 발생 한다.

datetime형 필드를 구간 검색을 할때는 반드시 between을 사용하는 것을 추천한다.


오랜만에 이런걸 해보니 작성하는데 한참 걸리네 ㅎ

이상.


2018/02/27 - [DBMS/MySQL] - MySQL InnoDB DATETIME vs Unixtime (int type) #1

2018/02/27 - [DBMS/MySQL] - MySQL InnoDB DATETIME vs Unixtime (int type) #2

2018/02/27 - [DBMS/MySQL] - MySQL InnoDB DATETIME vs Unixtime (int type) #3 (1.5억건)

2018/02/27 - [DBMS/MySQL] - MySQL InnoDB DATETIME vs Unixtime (결론) #4 <


+ Recent posts