powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / lock conflict при работе 350 аттачей, делающих только insert'ы. Отчего ?
25 сообщений из 135, страница 3 из 6
lock conflict при работе 350 аттачей, делающих только insert'ы. Отчего ?
    #38451496
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovА молотилок много, они выстроились в очередь и у кого-то из них не
выдержали нервы (то бишь случился таймаут ) и была выброшена ошибка "не смог дождаться".
Что в переводе и звучит как "lock conflict on no wait transaction".Таймаут при no wait... внезапно
...
Рейтинг: 0 / 0
lock conflict при работе 350 аттачей, делающих только insert'ы. Отчего ?
    #38451530
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladТаймаут при no wait... внезапно
Ну не таймаут... Немного поиска и я вижу, например, что она может кидаться из lck.cpp и
без транзакции вообще. Фиг знает, конечно, в каких случаях...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
lock conflict при работе 350 аттачей, делающих только insert'ы. Отчего ?
    #38451618
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоидзапустил fb_lock_print -c -a -d ... с логированием и упаковкой каждого лога в отдельный .rar, с интервалом 30 сек. Оставляю до завтрего. Если за ночь появятся новые lock conflict'ы, то сделаю тынц на соотв-щие снимки лок-таблы.Попалось три карася. В 05:37:20, 05:37:27 & 08:50:14.
Все три в своих .err-логах вывели одно и тоже:
Код: plaintext
1.
2.
3.
4.
Statement failed, SQLSTATE = 40001
lock conflict on no wait transaction
After line 0 in file t004-ins-log.sql
Command error: show database

Поскольку всё это время работал shell-скрипт, фоткавший лок-таблицу с интервалом 30 сек (от заверешния упаковки предыдущего снимка до запуска нового fb_lock_print'a), то в наличии есть соотв-щие архивы перед и после наступления моментов времени 05:37 и 08:50.
Эти архивы (две папки с .rar'ами) выложил сюда: http://yadi.sk/d/tQ1mIjw-C64C7

Тест остановил, сейчас перезапущу его уже без всяких show version, gen_id и прочего - выкину всё, что только возможно.
...
Рейтинг: 0 / 0
lock conflict при работе 350 аттачей, делающих только insert'ы. Отчего ?
    #38451620
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PS. А еще есть несколько (четыре штуки) .err-логов вот с такой странностью:
Код: plaintext
Your user name and password are not defined. Ask your database administrator to set up a Firebird login.
При том, что батник с isql подсовывает, разумеется, правильный пароль.
Такие вот делы... :-/
...
Рейтинг: 0 / 0
lock conflict при работе 350 аттачей, делающих только insert'ы. Отчего ?
    #38451623
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидPS. А еще есть несколько (четыре штуки) .err-логов вот с такой странностью:
Код: plaintext
Your user name and password are not defined. Ask your database administrator to set up a Firebird login.
При том, что батник с isql подсовывает, разумеется, правильный пароль.
Такие вот делы... :-/... забыл добавить: в логе ФБ этим странностям (про неправильный пароль) соответствуют мессаги:
Код: plaintext
1.
2.
3.
4.
5.
oel64   Mon Nov  4 09:52:50 2013
        Error in isc_attach_database() API call when working with legacy security database
        I/O error during "open" operation for file "/opt/fb30/security3.fdb"
        Error while trying to open file
        No such file or directory
...
Рейтинг: 0 / 0
lock conflict при работе 350 аттачей, делающих только insert'ы. Отчего ?
    #38451638
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovФиг знает, конечно, в каких случаях...Может тогда лучше просто жевать ?
...
Рейтинг: 0 / 0
lock conflict при работе 350 аттачей, делающих только insert'ы. Отчего ?
    #38451640
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

а что, разве было сказано, что с security уже всё ок ?
...
Рейтинг: 0 / 0
lock conflict при работе 350 аттачей, делающих только insert'ы. Отчего ?
    #38451657
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladа что, разве было сказано, что с security уже всё ок ?Нет, не было. Но никто и не ждёт, что в ФБ-3 будет сразу всё ОК.
К тому же, в этом варианте теста коннекты все идут через legacy-плагин, т.е. клиент=2.5 (кроме bash-скрипта калибратора). Может, это как-то влияет...
...
Рейтинг: 0 / 0
lock conflict при работе 350 аттачей, делающих только insert'ы. Отчего ?
    #38451671
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, закомментарил все вызовы gen_id, заменил маразм вида "||(select cast('now') from rdb$database)" на просто "||cast('now')", закомментарил все прочие select'ы.
Операторы show version & show database - закомментарены.

Скрипт, который теперь выполняют 450 молотилок, выглядит так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
set warnings off; set sql dialect 3; 
-- show version; 
-- show database; 
set heading off; set list off;  
select '-- PACKET # 1:' BEGIN_SECTION from rdb$database; commit;  
--/*
COMMIT;
SET TRANSACTION READ WRITE READ COMMITTED RECORD_VERSION NO WAIT;
set heading off;
set list off;
set term ^;
--*/

execute block returns(msg varchar(200)) as

. . . declare-секция всяких там переменных . . .

begin
 
  msg=
    '-- attach_id='||current_connection||', intro .sql at '
    ||cast('now' as timestamp)
    ||', init gen_test='; -- tmp 04.11.2013 -- ||g`en_id(gen_test,0);
  suspend;

  v_rndval=rand();
  v_rnd4err=rand(); -- error probability
  v_inserted_cnt=MIN_ROWS_FOR_INSERTING + v_rndval * (MAX_ROWS_FOR_INSERTING-MIN_ROWS_FOR_INSERTING);
  v_last_gen=-1; -- since 04.11.2013, before: g`en_id(gen_test,0);
  msg='-- adding '||v_inserted_cnt||' rows'
      ||', v_rnd4err='||cast(:v_rnd4err as numeric(6,2))
      ||', LOWER_THRESHOLD_FOR_ERR='||cast(LOWER_THRESHOLD_FOR_ERR as numeric(6,2))
      ||', v_last_gen='||v_last_gen
  ;
  suspend;
  v_result=0;
  i=0;
  while (i < v_inserted_cnt and v_result=0) do begin

    v_id=-1; -- since 04.11.2013, before: g`en_id(gen_test,1);

    . . . присваиваем переменным v_f00, v_f01 etc случайные значения . . .

    begin

      msg='insert into tmp(id,f00,f01,f02,f03,f04,f05,f06,f07,f08,f09,f10,f11,dt1)'
            ||' values( . . .';  -- далее сцепление строки со значениями v_id, v_f00, etc
       
      insert into tmp(id,f00,f01,f02,f03,f04,f05,f06,f07,f08,f09,f10,f11,dt1)
      values(:v_id
            ,:v_f00
            ,:v_f01
            ,:v_f02
            ,:v_f03
            ,:v_f04
            ,:v_f05
            ,:v_f06
            ,:v_f07
            ,:v_f08
            ,:v_f09
            ,:v_f10
            ,:v_f11
            ,:v_dt1
          );

        if (i in(0,1) or mod(i,100)=0 or i>=v_inserted_cnt-1 ) then
        suspend; -- 17.03.2012: minimize output

        when any do
        begin

          suspend; -- msg: insert-statement with zero division
          v_result=gdscode;
          msg='rollback; -- ABORT, gds='||v_result
                ||', i='||i -- since 04.11.2013, before:  ||', curr gen_test='||g`en_id(gen_test,0)
                ||' at '||cast('now' as timestamp)||': '
                ||decode(v_result, 
                    335544665, 'violation of PK/UK',
                    335544321, 'num/string ovf',
                    335544345, 'lock on no_wait trn', 
                    335544349, 'dup val in idx', 
                    335544334, 'can`t upd erased row',
                    'UNKNOWN'
                );
          -- gds=335544321: arithmetic exception, numeric overflow, or string truncation
          -- gds=335544345: lock conflict on no wait transaction
          -- gds=335544349: Attempt to store duplicate value (visible to active transactions) in unique index "@1".
          -- gds=335544334: Can not update erased record
          suspend;
          leave;
       end        
    end
    i=i+1;
  end
  if (v_result=0) then begin
    msg='commit; -- finish adding '||v_inserted_cnt||' rows at '||cast('now' as timestamp)
    ||', i='||i -- since 04.11.2013, before:  ||', curr gen_test='||g`en_id(gen_test,0)
    ;
    suspend;
  end
end
--/*
^set term ;^
commit;

shell rndpause.bat; -- отдыхаем 5 сек

--*/
----------------------------------------------------------------------------------
set heading off; set list off;  
select '-- PACKET # 2:' BEGIN_SECTION from rdb$database; commit;  
--/*
COMMIT;
SET TRANSACTION READ WRITE READ COMMITTED RECORD_VERSION NO WAIT;
set heading off;
set list off;
set term ^;
--*/

execute block returns(msg varchar(200)) as

. . . далее всё повторяется, как в пакете #1 . . .

end
--/*
^set term ;^
commit;

shell rndpause.bat; -- отдыхаем 5 сек

--*/

. . . и так далее, 30 пакетов . . .

Также запустил:
0) калибратор скорости установки коннектов (это - святое ;));
1) скрипт, ожидающий появление в .err-логах сообщения 'lock conflict', и регистрирующий это;
2) скрипт, снимающий лок-таблицу, но интервал поставил 15 сек вместо 30.

Оставляю на несколько часов, "пущай полетает".
...
Рейтинг: 0 / 0
lock conflict при работе 350 аттачей, делающих только insert'ы. Отчего ?
    #38451672
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

ты на более свежем снапшоте проверь. Там CORE-4200 исправили. Может она являлась причиной.
...
Рейтинг: 0 / 0
lock conflict при работе 350 аттачей, делающих только insert'ы. Отчего ?
    #38451683
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисТаблоид,

ты на более свежем снапшоте проверь. Там CORE-4200 исправили. Может она являлась причиной.Это только завтра, видимо. Тест получается каждый раз часов на 10-12. Хотелось бы ясности сначала с сабжем, а уже после копать на тему неправильных (якобы) паролей.
...
Рейтинг: 0 / 0
lock conflict при работе 350 аттачей, делающих только insert'ы. Отчего ?
    #38451692
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

там тикет не про неправильные пароли, про блокировку подключений. Кто знает может твой lock conflict от туда лез.
...
Рейтинг: 0 / 0
lock conflict при работе 350 аттачей, делающих только insert'ы. Отчего ?
    #38451696
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидВ общем, закомментарил все вызовы gen_id, заменил маразм вида "||(select cast('now') from rdb$database)" на просто "||cast('now')", закомментарил все прочие select'ы.
Операторы show version & show database - закомментарены.
<...>
Оставляю на несколько часов, "пущай полетает".Хоп! А вот и первый (и единственный пока) карась, быстро же он попался:

Код: plaintext
1.
2.
2013-11-04  12:18:12 .706 Statement failed, SQLSTATE = 40001
2013-11-04 12:18:12.737 lock conflict on no wait transaction
2013-11-04 12:18:12.737 After line 0 in file t004-ins-log.sql

Снимки лок-таблицы за период с 12:10 по 12:20 - тут: http://yadi.sk/d/DJqYJXYlC6Nwi
HTH.
...
Рейтинг: 0 / 0
lock conflict при работе 350 аттачей, делающих только insert'ы. Отчего ?
    #38451697
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денистам тикет не про неправильные пароли, про блокировку подключений. Кто знает может твой lock conflict от туда лез.Тогда бы они вместе "ходили", сообщения эти: о недоступности sec3.fdb и о лок-конфликтах. А они, судя по всему, не связаны, т.к. в разное время лезут.
...
Рейтинг: 0 / 0
lock conflict при работе 350 аттачей, делающих только insert'ы. Отчего ?
    #38451778
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladМожет тогда лучше просто жевать ?
Нет, лучше не использовать вторсырьё левые коды ошибок.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
lock conflict при работе 350 аттачей, делающих только insert'ы. Отчего ?
    #38451892
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидХоп! А вот и первый (и единственный пока) карась, быстро же он попалсяВторой карась попался.
В общем, ошибка эта всё-таки НЕ была связана ни с show version / database, ни с вызовами gen_id().
Это выплёвывает либо вызов isc_attach, либо всё-таки insert.
Снимки ЛТ во временнОй "окрестности" второго карася пока не делаю - жду, чего скажут Источники Света.

Может, оно вообще так и должно быть сейчас в Фб-3.х, да на большой нагрузке ?.. ;-)
...
Рейтинг: 0 / 0
lock conflict при работе 350 аттачей, делающих только insert'ы. Отчего ?
    #38452022
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Итог печален, как дождливый день.
За период с 11:28 (т.е. пять часов) на двух машинах проявилось вполне себе ощутимое число lock conflict'ов при insert'ах(?).
Часть из них действительно как-то "странно близки" по времени (см выделенные цветом), остальные вылезли сами по себе, вне связи с чем-либо.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
log_ins_CSMIR_206.err:2013-11-04 12:18:12.737 lock conflict on no wait
log_ins_TLPRG_046.err:2013-11-04 14:20:45.233 lock conflict on no wait
log_ins_CSMIR_239.err:2013-11-04 14:52:39.362 lock conflict on no wait
log_ins_CSMIR_072.err:2013-11-04 14:55:19.737 lock conflict on no wait
log_ins_CSMIR_148.err:2013-11-04 14:55:23.971 lock conflict on no wait
log_ins_TLPRG_059.err:2013-11-04 15:13:16.499 lock conflict on no wait
log_ins_CSMIR_148.err:2013-11-04 15:28:10.050 lock conflict on no wait
log_ins_CSMIR_208.err:2013-11-04 15:55:06.581 lock conflict on no wait
log_ins_TLPRG_001.err:2013-11-04 15:57:43.108 lock conflict on no wait
log_ins_TLPRG_095.err:2013-11-04 16:00:33.796 lock conflict on no wait
log_ins_TLPRG_003.err:2013-11-04 16:13:28.421 lock conflict on no wait
log_ins_TLPRG_073.err:2013-11-04 16:13:28.467 lock conflict on no wait
log_ins_CSMIR_224.err:2013-11-04 16:21:04.565 lock conflict on no wait
log_ins_CSMIR_067.err:2013-11-04 16:23:41.518 lock conflict on no wait
log_ins_CSMIR_042.err:2013-11-04 16:23:41.878 lock conflict on no wait
log_ins_CSMIR_220.err:2013-11-04 16:30:11.940 lock conflict on no wait

Ошибка лезет на скрипте, который делает execute block'и только с инсертами + коммиты.
...
Рейтинг: 0 / 0
lock conflict при работе 350 аттачей, делающих только insert'ы. Отчего ?
    #38452130
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у тебя триггер на коннект небось есть? Может он не только бесконфликтные инсерты делает?
...
Рейтинг: 0 / 0
lock conflict при работе 350 аттачей, делающих только insert'ы. Отчего ?
    #38452148
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr,

есть конечно. Вот он у него какой

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE OR ALTER TRIGGER TRG_LOGON
ACTIVE ON CONNECT POSITION 0
as
begin
  if ( current_user = 'CALIBRATOR' )
  then
    execute procedure SYS_CONNECT_CALIBRATE;
end



но вроде он свои скрипты другим плоьзователем исполняет.
...
Рейтинг: 0 / 0
lock conflict при работе 350 аттачей, делающих только insert'ы. Отчего ?
    #38452151
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrу тебя триггер на коннект небось есть? Может он не только бесконфликтные инсерты делает?Есть. База, кстати, та же самая, что и у тебя.

Но не вижу в упор, что там такого конфликтного в триггере на коннект. Вот:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
$ isql idx_under_load_test.fdb
Database:  idx_under_load_test.fdb
SQL> show trigger;
Trigger name                     Invalid
================================ =======
TRG_LOGON

Table name                       Trigger name                     Invalid
================================ ================================ =======
LOG_ACTIVITY                     LOG_ACTIVITY_GEN_PK
SQL> set blob all;

 SQL> show trigger trg_logon; 
TRG_LOGON, Sequence: 0, Type: ON CONNECT, Active
as
begin
  if ( current_user = 'CALIBRATOR' ) -- ==> молотилки сюда  НЕ  попадут, они все как SYSDBA
  then
    execute procedure SYS_CONNECT_CALIBRATE;
end
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 SQL> show trigger log_activity_gen_pk;  -- соотв-щая таблица сейчас НЕ используется.

Triggers on Table LOG_ACTIVITY:
LOG_ACTIVITY_GEN_PK, Sequence: 0, Type: BEFORE INSERT, Active
as
begin
    if (new.id is null) then
        new.id = gen_id(log_activity_seq, 1);
end
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 SQL> show proc sys_connect_calibrate; 
Procedure text:
=============================================================================
declare variable v_dts_beg timestamp;
declare variable v_dts_end timestamp;
declare variable c_min_duration_to_log int = 1000; --00; --3000; --5000; --0; -- 3000;
begin
    v_dts_end=cast('now' as timestamp);
    if (current_user <> 'CALIBRATOR') then -- => на всякий случай еще раз проверяем...
        EXIT; -- ##################  E X I T  ###############

    select first 1 cast(dts as timestamp) from ext_connect_calibr into v_dts_beg;
    if (
        v_dts_beg is null
        or
        datediff(millisecond from v_dts_beg to v_dts_end)
        < c_min_duration_to_log -- or connect was established enough quickly
       ) then
        EXIT; -- ##################  E X I T  ###############

    -- now we must log event of too long connection:
    insert into log_connect_calibr(dts_before_establish, dts_after_establish)
    values( :v_dts_beg, :v_dts_end);
    -- external file used by shell to run gdb if it`s size greater than zero
    insert into ext_long_connect_log(msg)
    values( 'ms_'||lpad( datediff(millisecond from :v_dts_beg to :v_dts_end),8,'0'));
end
=============================================================================
...
Рейтинг: 0 / 0
lock conflict при работе 350 аттачей, делающих только insert'ы. Отчего ?
    #38452157
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидНо не вижу в упор, что там такого конфликтного в триггере на коннект.

Для него стартует транзакция, так что лично я бы его для тестов убрал.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
lock conflict при работе 350 аттачей, делающих только insert'ы. Отчего ?
    #38452166
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovТаблоидНо не вижу в упор, что там такого конфликтного в триггере на коннект.Для него стартует транзакция, так что лично я бы его для тестов убрал.Можно, конечно, попробовать. Но при сильной нагрузке каждая из молотилок выполняет своё задание (30 пакетов вида ecxecute block + commit, код я приводил выше) на несколько минут. Так что триггер этот будет гораздо чаще дёргаться одним лишь калибратором.
...
Рейтинг: 0 / 0
lock conflict при работе 350 аттачей, делающих только insert'ы. Отчего ?
    #38452171
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У тебя ошибка вылазит при connect. Триггер выполняется при connect. Какая разница как
часто он выполняется, если каждый раз он выполняется как раз тогда, когда вылазит ошибка?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
lock conflict при работе 350 аттачей, делающих только insert'ы. Отчего ?
    #38452175
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovУ тебя ошибка вылазит при connect .Обоснуй! Меня терзают смутные сомнения, что это *не* isc_attach, а всё-таки какой-то баг при insert'ах.
...
Рейтинг: 0 / 0
lock conflict при работе 350 аттачей, делающих только insert'ы. Отчего ?
    #38452179
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидОбоснуй!
Тебе "After line 0" ничего не говорит?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 135, страница 3 из 6
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / lock conflict при работе 350 аттачей, делающих только insert'ы. Отчего ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]